ib_isert.c 70.4 KB
Newer Older
1 2 3
/*******************************************************************************
 * This file contains iSCSI extentions for RDMA (iSER) Verbs
 *
4
 * (c) Copyright 2013 Datera, Inc.
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
 *
 * Nicholas A. Bellinger <nab@linux-iscsi.org>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 ****************************************************************************/

#include <linux/string.h>
#include <linux/module.h>
#include <linux/scatterlist.h>
#include <linux/socket.h>
#include <linux/in.h>
#include <linux/in6.h>
#include <rdma/ib_verbs.h>
#include <rdma/rdma_cm.h>
#include <target/target_core_base.h>
#include <target/target_core_fabric.h>
#include <target/iscsi/iscsi_transport.h>
30
#include <linux/semaphore.h>
31 32 33 34 35

#include "ib_isert.h"

#define	ISERT_MAX_CONN		8
#define ISER_MAX_RX_CQ_LEN	(ISERT_QP_MAX_RECV_DTOS * ISERT_MAX_CONN)
36 37
#define ISER_MAX_TX_CQ_LEN \
	((ISERT_QP_MAX_REQ_DTOS + ISCSI_DEF_XMIT_CMDS_MAX) * ISERT_MAX_CONN)
38 39
#define ISER_MAX_CQ_LEN		(ISER_MAX_RX_CQ_LEN + ISER_MAX_TX_CQ_LEN + \
				 ISERT_MAX_CONN)
40

S
Sagi Grimberg 已提交
41
static int isert_debug_level;
42 43 44
module_param_named(debug_level, isert_debug_level, int, 0644);
MODULE_PARM_DESC(debug_level, "Enable debug tracing if > 0 (default:0)");

45 46 47
static DEFINE_MUTEX(device_list_mutex);
static LIST_HEAD(device_list);
static struct workqueue_struct *isert_comp_wq;
48
static struct workqueue_struct *isert_release_wq;
49

50 51
static int
isert_put_response(struct iscsi_conn *conn, struct iscsi_cmd *cmd);
52
static int
53
isert_login_post_recv(struct isert_conn *isert_conn);
54 55
static int
isert_rdma_accept(struct isert_conn *isert_conn);
56
struct rdma_cm_id *isert_setup_id(struct isert_np *isert_np);
57

58
static void isert_release_work(struct work_struct *work);
59 60 61 62
static void isert_recv_done(struct ib_cq *cq, struct ib_wc *wc);
static void isert_send_done(struct ib_cq *cq, struct ib_wc *wc);
static void isert_login_recv_done(struct ib_cq *cq, struct ib_wc *wc);
static void isert_login_send_done(struct ib_cq *cq, struct ib_wc *wc);
63

64 65 66
static inline bool
isert_prot_cmd(struct isert_conn *conn, struct se_cmd *cmd)
{
67
	return (conn->pi_support &&
68 69 70 71
		cmd->prot_op != TARGET_PROT_NORMAL);
}


72 73 74
static void
isert_qp_event_callback(struct ib_event *e, void *context)
{
75
	struct isert_conn *isert_conn = context;
76

77 78 79
	isert_err("%s (%d): conn %p\n",
		  ib_event_msg(e->event), e->event, isert_conn);

80 81
	switch (e->event) {
	case IB_EVENT_COMM_EST:
82
		rdma_notify(isert_conn->cm_id, IB_EVENT_COMM_EST);
83 84
		break;
	case IB_EVENT_QP_LAST_WQE_REACHED:
85
		isert_warn("Reached TX IB_EVENT_QP_LAST_WQE_REACHED\n");
86 87 88 89 90 91
		break;
	default:
		break;
	}
}

92 93
static struct isert_comp *
isert_comp_get(struct isert_conn *isert_conn)
94
{
95
	struct isert_device *device = isert_conn->device;
96
	struct isert_comp *comp;
97
	int i, min = 0;
98 99

	mutex_lock(&device_list_mutex);
100 101 102 103 104 105
	for (i = 0; i < device->comps_used; i++)
		if (device->comps[i].active_qps <
		    device->comps[min].active_qps)
			min = i;
	comp = &device->comps[min];
	comp->active_qps++;
106 107
	mutex_unlock(&device_list_mutex);

108
	isert_info("conn %p, using comp %p min_index: %d\n",
109
		   isert_conn, comp, min);
110 111 112 113 114 115 116 117 118

	return comp;
}

static void
isert_comp_put(struct isert_comp *comp)
{
	mutex_lock(&device_list_mutex);
	comp->active_qps--;
119
	mutex_unlock(&device_list_mutex);
120 121 122 123 124 125 126
}

static struct ib_qp *
isert_create_qp(struct isert_conn *isert_conn,
		struct isert_comp *comp,
		struct rdma_cm_id *cma_id)
{
127
	struct isert_device *device = isert_conn->device;
128 129
	struct ib_qp_init_attr attr;
	int ret;
130 131 132 133

	memset(&attr, 0, sizeof(struct ib_qp_init_attr));
	attr.event_handler = isert_qp_event_callback;
	attr.qp_context = isert_conn;
134 135
	attr.send_cq = comp->cq;
	attr.recv_cq = comp->cq;
S
Sagi Grimberg 已提交
136
	attr.cap.max_send_wr = ISERT_QP_MAX_REQ_DTOS + 1;
137
	attr.cap.max_recv_wr = ISERT_QP_MAX_RECV_DTOS + 1;
138
	attr.cap.max_rdma_ctxs = ISCSI_DEF_XMIT_CMDS_MAX;
139 140 141
	attr.cap.max_send_sge = device->ib_device->attrs.max_sge;
	isert_conn->max_sge = min(device->ib_device->attrs.max_sge,
				  device->ib_device->attrs.max_sge_rd);
142 143 144
	attr.cap.max_recv_sge = 1;
	attr.sq_sig_type = IB_SIGNAL_REQ_WR;
	attr.qp_type = IB_QPT_RC;
145
	if (device->pi_capable)
146
		attr.create_flags |= IB_QP_CREATE_SIGNATURE_EN;
147

148
	ret = rdma_create_qp(cma_id, device->pd, &attr);
149
	if (ret) {
150
		isert_err("rdma_create_qp failed for cma_id %d\n", ret);
151 152 153 154 155 156 157 158 159 160 161 162 163
		return ERR_PTR(ret);
	}

	return cma_id->qp;
}

static int
isert_conn_setup_qp(struct isert_conn *isert_conn, struct rdma_cm_id *cma_id)
{
	struct isert_comp *comp;
	int ret;

	comp = isert_comp_get(isert_conn);
164 165 166
	isert_conn->qp = isert_create_qp(isert_conn, comp, cma_id);
	if (IS_ERR(isert_conn->qp)) {
		ret = PTR_ERR(isert_conn->qp);
167
		goto err;
168 169 170
	}

	return 0;
171
err:
172
	isert_comp_put(comp);
173
	return ret;
174 175 176 177 178
}

static int
isert_alloc_rx_descriptors(struct isert_conn *isert_conn)
{
179
	struct isert_device *device = isert_conn->device;
180
	struct ib_device *ib_dev = device->ib_device;
181 182 183 184 185
	struct iser_rx_desc *rx_desc;
	struct ib_sge *rx_sg;
	u64 dma_addr;
	int i, j;

186
	isert_conn->rx_descs = kzalloc(ISERT_QP_MAX_RECV_DTOS *
187
				sizeof(struct iser_rx_desc), GFP_KERNEL);
188
	if (!isert_conn->rx_descs)
189 190
		goto fail;

191
	rx_desc = isert_conn->rx_descs;
192 193 194 195 196 197 198 199 200 201 202 203

	for (i = 0; i < ISERT_QP_MAX_RECV_DTOS; i++, rx_desc++)  {
		dma_addr = ib_dma_map_single(ib_dev, (void *)rx_desc,
					ISER_RX_PAYLOAD_SIZE, DMA_FROM_DEVICE);
		if (ib_dma_mapping_error(ib_dev, dma_addr))
			goto dma_map_fail;

		rx_desc->dma_addr = dma_addr;

		rx_sg = &rx_desc->rx_sg;
		rx_sg->addr = rx_desc->dma_addr;
		rx_sg->length = ISER_RX_PAYLOAD_SIZE;
204
		rx_sg->lkey = device->pd->local_dma_lkey;
205
		rx_desc->rx_cqe.done = isert_recv_done;
206 207 208 209 210
	}

	return 0;

dma_map_fail:
211
	rx_desc = isert_conn->rx_descs;
212 213 214 215
	for (j = 0; j < i; j++, rx_desc++) {
		ib_dma_unmap_single(ib_dev, rx_desc->dma_addr,
				    ISER_RX_PAYLOAD_SIZE, DMA_FROM_DEVICE);
	}
216 217
	kfree(isert_conn->rx_descs);
	isert_conn->rx_descs = NULL;
218
fail:
219 220
	isert_err("conn %p failed to allocate rx descriptors\n", isert_conn);

221 222 223 224 225 226
	return -ENOMEM;
}

static void
isert_free_rx_descriptors(struct isert_conn *isert_conn)
{
227
	struct ib_device *ib_dev = isert_conn->device->ib_device;
228 229 230
	struct iser_rx_desc *rx_desc;
	int i;

231
	if (!isert_conn->rx_descs)
232 233
		return;

234
	rx_desc = isert_conn->rx_descs;
235 236 237 238 239
	for (i = 0; i < ISERT_QP_MAX_RECV_DTOS; i++, rx_desc++)  {
		ib_dma_unmap_single(ib_dev, rx_desc->dma_addr,
				    ISER_RX_PAYLOAD_SIZE, DMA_FROM_DEVICE);
	}

240 241
	kfree(isert_conn->rx_descs);
	isert_conn->rx_descs = NULL;
242 243
}

244 245
static void
isert_free_comps(struct isert_device *device)
246
{
247
	int i;
248

249 250
	for (i = 0; i < device->comps_used; i++) {
		struct isert_comp *comp = &device->comps[i];
251

252 253
		if (comp->cq)
			ib_free_cq(comp->cq);
254
	}
255 256
	kfree(device->comps);
}
257

258
static int
259
isert_alloc_comps(struct isert_device *device)
260 261
{
	int i, max_cqe, ret = 0;
262

263
	device->comps_used = min(ISERT_MAX_CQ, min_t(int, num_online_cpus(),
264 265
				 device->ib_device->num_comp_vectors));

266
	isert_info("Using %d CQs, %s supports %d vectors support "
267
		   "pi_capable %d\n",
268
		   device->comps_used, device->ib_device->name,
269
		   device->ib_device->num_comp_vectors,
270 271 272 273 274
		   device->pi_capable);

	device->comps = kcalloc(device->comps_used, sizeof(struct isert_comp),
				GFP_KERNEL);
	if (!device->comps) {
275
		isert_err("Unable to allocate completion contexts\n");
276 277
		return -ENOMEM;
	}
278

279
	max_cqe = min(ISER_MAX_CQ_LEN, device->ib_device->attrs.max_cqe);
280

281 282 283 284
	for (i = 0; i < device->comps_used; i++) {
		struct isert_comp *comp = &device->comps[i];

		comp->device = device;
285 286
		comp->cq = ib_alloc_cq(device->ib_device, comp, max_cqe, i,
				IB_POLL_WORKQUEUE);
287
		if (IS_ERR(comp->cq)) {
288
			isert_err("Unable to allocate cq\n");
289 290
			ret = PTR_ERR(comp->cq);
			comp->cq = NULL;
291
			goto out_cq;
292
		}
293 294
	}

295 296 297 298 299 300 301 302 303
	return 0;
out_cq:
	isert_free_comps(device);
	return ret;
}

static int
isert_create_device_ib_res(struct isert_device *device)
{
304
	struct ib_device *ib_dev = device->ib_device;
305
	int ret;
306

307 308
	isert_dbg("devattr->max_sge: %d\n", ib_dev->attrs.max_sge);
	isert_dbg("devattr->max_sge_rd: %d\n", ib_dev->attrs.max_sge_rd);
309

310
	ret = isert_alloc_comps(device);
311
	if (ret)
312
		goto out;
313

314
	device->pd = ib_alloc_pd(ib_dev);
315 316 317 318 319 320 321
	if (IS_ERR(device->pd)) {
		ret = PTR_ERR(device->pd);
		isert_err("failed to allocate pd, device %p, ret=%d\n",
			  device, ret);
		goto out_cq;
	}

322
	/* Check signature cap */
323
	device->pi_capable = ib_dev->attrs.device_cap_flags &
324
			     IB_DEVICE_SIGNATURE_HANDOVER ? true : false;
325

326 327 328
	return 0;

out_cq:
329
	isert_free_comps(device);
330 331 332
out:
	if (ret > 0)
		ret = -EINVAL;
333 334 335 336 337 338
	return ret;
}

static void
isert_free_device_ib_res(struct isert_device *device)
{
339
	isert_info("device %p\n", device);
340

341
	ib_dealloc_pd(device->pd);
342
	isert_free_comps(device);
343 344 345
}

static void
346
isert_device_put(struct isert_device *device)
347 348 349
{
	mutex_lock(&device_list_mutex);
	device->refcount--;
350
	isert_info("device %p refcount %d\n", device, device->refcount);
351 352 353 354 355 356 357 358 359
	if (!device->refcount) {
		isert_free_device_ib_res(device);
		list_del(&device->dev_node);
		kfree(device);
	}
	mutex_unlock(&device_list_mutex);
}

static struct isert_device *
360
isert_device_get(struct rdma_cm_id *cma_id)
361 362 363 364 365 366 367 368
{
	struct isert_device *device;
	int ret;

	mutex_lock(&device_list_mutex);
	list_for_each_entry(device, &device_list, dev_node) {
		if (device->ib_device->node_guid == cma_id->device->node_guid) {
			device->refcount++;
369 370
			isert_info("Found iser device %p refcount %d\n",
				   device, device->refcount);
371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393
			mutex_unlock(&device_list_mutex);
			return device;
		}
	}

	device = kzalloc(sizeof(struct isert_device), GFP_KERNEL);
	if (!device) {
		mutex_unlock(&device_list_mutex);
		return ERR_PTR(-ENOMEM);
	}

	INIT_LIST_HEAD(&device->dev_node);

	device->ib_device = cma_id->device;
	ret = isert_create_device_ib_res(device);
	if (ret) {
		kfree(device);
		mutex_unlock(&device_list_mutex);
		return ERR_PTR(ret);
	}

	device->refcount++;
	list_add_tail(&device->dev_node, &device_list);
394 395
	isert_info("Created a new iser device %p refcount %d\n",
		   device, device->refcount);
396 397 398 399 400
	mutex_unlock(&device_list_mutex);

	return device;
}

401 402
static void
isert_init_conn(struct isert_conn *isert_conn)
403 404
{
	isert_conn->state = ISER_CONN_INIT;
405
	INIT_LIST_HEAD(&isert_conn->node);
406
	init_completion(&isert_conn->login_comp);
407
	init_completion(&isert_conn->login_req_comp);
408 409
	kref_init(&isert_conn->kref);
	mutex_init(&isert_conn->mutex);
410
	INIT_WORK(&isert_conn->release_work, isert_release_work);
411
}
412

413 414 415
static void
isert_free_login_buf(struct isert_conn *isert_conn)
{
416
	struct ib_device *ib_dev = isert_conn->device->ib_device;
417 418

	ib_dma_unmap_single(ib_dev, isert_conn->login_rsp_dma,
419
			    ISER_RX_PAYLOAD_SIZE, DMA_TO_DEVICE);
420 421
	kfree(isert_conn->login_rsp_buf);

422
	ib_dma_unmap_single(ib_dev, isert_conn->login_req_dma,
423
			    ISER_RX_PAYLOAD_SIZE,
424
			    DMA_FROM_DEVICE);
425
	kfree(isert_conn->login_req_buf);
426 427 428 429 430 431 432
}

static int
isert_alloc_login_buf(struct isert_conn *isert_conn,
		      struct ib_device *ib_dev)
{
	int ret;
433

434 435 436
	isert_conn->login_req_buf = kzalloc(sizeof(*isert_conn->login_req_buf),
			GFP_KERNEL);
	if (!isert_conn->login_req_buf) {
437
		isert_err("Unable to allocate isert_conn->login_buf\n");
438
		return -ENOMEM;
439 440 441
	}

	isert_conn->login_req_dma = ib_dma_map_single(ib_dev,
442 443
				isert_conn->login_req_buf,
				ISER_RX_PAYLOAD_SIZE, DMA_FROM_DEVICE);
444 445
	ret = ib_dma_mapping_error(ib_dev, isert_conn->login_req_dma);
	if (ret) {
446
		isert_err("login_req_dma mapping error: %d\n", ret);
447
		isert_conn->login_req_dma = 0;
448 449 450 451 452 453 454
		goto out_free_login_req_buf;
	}

	isert_conn->login_rsp_buf = kzalloc(ISER_RX_PAYLOAD_SIZE, GFP_KERNEL);
	if (!isert_conn->login_rsp_buf) {
		isert_err("Unable to allocate isert_conn->login_rspbuf\n");
		goto out_unmap_login_req_buf;
455 456 457
	}

	isert_conn->login_rsp_dma = ib_dma_map_single(ib_dev,
458
					isert_conn->login_rsp_buf,
459
					ISER_RX_PAYLOAD_SIZE, DMA_TO_DEVICE);
460 461
	ret = ib_dma_mapping_error(ib_dev, isert_conn->login_rsp_dma);
	if (ret) {
462
		isert_err("login_rsp_dma mapping error: %d\n", ret);
463
		isert_conn->login_rsp_dma = 0;
464
		goto out_free_login_rsp_buf;
465 466
	}

467 468
	return 0;

469 470 471
out_free_login_rsp_buf:
	kfree(isert_conn->login_rsp_buf);
out_unmap_login_req_buf:
472
	ib_dma_unmap_single(ib_dev, isert_conn->login_req_dma,
473 474 475
			    ISER_RX_PAYLOAD_SIZE, DMA_FROM_DEVICE);
out_free_login_req_buf:
	kfree(isert_conn->login_req_buf);
476 477 478
	return ret;
}

479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504
static void
isert_set_nego_params(struct isert_conn *isert_conn,
		      struct rdma_conn_param *param)
{
	struct ib_device_attr *attr = &isert_conn->device->ib_device->attrs;

	/* Set max inflight RDMA READ requests */
	isert_conn->initiator_depth = min_t(u8, param->initiator_depth,
				attr->max_qp_init_rd_atom);
	isert_dbg("Using initiator_depth: %u\n", isert_conn->initiator_depth);

	if (param->private_data) {
		u8 flags = *(u8 *)param->private_data;

		/*
		 * use remote invalidation if the both initiator
		 * and the HCA support it
		 */
		isert_conn->snd_w_inv = !(flags & ISER_SEND_W_INV_NOT_SUP) &&
					  (attr->device_cap_flags &
					   IB_DEVICE_MEM_MGT_EXTENSIONS);
		if (isert_conn->snd_w_inv)
			isert_info("Using remote invalidation\n");
	}
}

505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529
static int
isert_connect_request(struct rdma_cm_id *cma_id, struct rdma_cm_event *event)
{
	struct isert_np *isert_np = cma_id->context;
	struct iscsi_np *np = isert_np->np;
	struct isert_conn *isert_conn;
	struct isert_device *device;
	int ret = 0;

	spin_lock_bh(&np->np_thread_lock);
	if (!np->enabled) {
		spin_unlock_bh(&np->np_thread_lock);
		isert_dbg("iscsi_np is not enabled, reject connect request\n");
		return rdma_reject(cma_id, NULL, 0);
	}
	spin_unlock_bh(&np->np_thread_lock);

	isert_dbg("cma_id: %p, portal: %p\n",
		 cma_id, cma_id->context);

	isert_conn = kzalloc(sizeof(struct isert_conn), GFP_KERNEL);
	if (!isert_conn)
		return -ENOMEM;

	isert_init_conn(isert_conn);
530
	isert_conn->cm_id = cma_id;
531 532 533 534 535

	ret = isert_alloc_login_buf(isert_conn, cma_id->device);
	if (ret)
		goto out;

536
	device = isert_device_get(cma_id);
537 538 539 540
	if (IS_ERR(device)) {
		ret = PTR_ERR(device);
		goto out_rsp_dma_map;
	}
541
	isert_conn->device = device;
542

543
	isert_set_nego_params(isert_conn, &event->param.conn);
544

545
	ret = isert_conn_setup_qp(isert_conn, cma_id);
546 547 548
	if (ret)
		goto out_conn_dev;

549
	ret = isert_login_post_recv(isert_conn);
550 551 552 553 554 555 556
	if (ret)
		goto out_conn_dev;

	ret = isert_rdma_accept(isert_conn);
	if (ret)
		goto out_conn_dev;

557
	mutex_lock(&isert_np->mutex);
558
	list_add_tail(&isert_conn->node, &isert_np->accepted);
559
	mutex_unlock(&isert_np->mutex);
560 561 562 563

	return 0;

out_conn_dev:
564
	isert_device_put(device);
565
out_rsp_dma_map:
566
	isert_free_login_buf(isert_conn);
567 568
out:
	kfree(isert_conn);
569
	rdma_reject(cma_id, NULL, 0);
570 571 572 573 574 575
	return ret;
}

static void
isert_connect_release(struct isert_conn *isert_conn)
{
576
	struct isert_device *device = isert_conn->device;
577

578
	isert_dbg("conn %p\n", isert_conn);
579

580 581
	BUG_ON(!device);

582
	isert_free_rx_descriptors(isert_conn);
583 584
	if (isert_conn->cm_id)
		rdma_destroy_id(isert_conn->cm_id);
585

586 587
	if (isert_conn->qp) {
		struct isert_comp *comp = isert_conn->qp->recv_cq->cq_context;
588

589
		isert_comp_put(comp);
590
		ib_destroy_qp(isert_conn->qp);
591 592
	}

593
	if (isert_conn->login_req_buf)
594 595
		isert_free_login_buf(isert_conn);

596
	isert_device_put(device);
597

598
	kfree(isert_conn);
599 600 601 602 603
}

static void
isert_connected_handler(struct rdma_cm_id *cma_id)
{
604
	struct isert_conn *isert_conn = cma_id->qp->qp_context;
605
	struct isert_np *isert_np = cma_id->context;
606

607
	isert_info("conn %p\n", isert_conn);
608

609
	mutex_lock(&isert_conn->mutex);
610 611
	isert_conn->state = ISER_CONN_UP;
	kref_get(&isert_conn->kref);
612
	mutex_unlock(&isert_conn->mutex);
613 614 615 616 617 618 619

	mutex_lock(&isert_np->mutex);
	list_move_tail(&isert_conn->node, &isert_np->pending);
	mutex_unlock(&isert_np->mutex);

	isert_info("np %p: Allow accept_np to continue\n", isert_np);
	up(&isert_np->sem);
620 621 622
}

static void
623
isert_release_kref(struct kref *kref)
624 625
{
	struct isert_conn *isert_conn = container_of(kref,
626
				struct isert_conn, kref);
627

628 629
	isert_info("conn %p final kref %s/%d\n", isert_conn, current->comm,
		   current->pid);
630 631 632 633 634 635 636

	isert_connect_release(isert_conn);
}

static void
isert_put_conn(struct isert_conn *isert_conn)
{
637
	kref_put(&isert_conn->kref, isert_release_kref);
638 639
}

640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657
static void
isert_handle_unbound_conn(struct isert_conn *isert_conn)
{
	struct isert_np *isert_np = isert_conn->cm_id->context;

	mutex_lock(&isert_np->mutex);
	if (!list_empty(&isert_conn->node)) {
		/*
		 * This means iscsi doesn't know this connection
		 * so schedule a cleanup ourselves
		 */
		list_del_init(&isert_conn->node);
		isert_put_conn(isert_conn);
		queue_work(isert_release_wq, &isert_conn->release_work);
	}
	mutex_unlock(&isert_np->mutex);
}

658 659 660 661 662
/**
 * isert_conn_terminate() - Initiate connection termination
 * @isert_conn: isert connection struct
 *
 * Notes:
663
 * In case the connection state is BOUND, move state
664
 * to TEMINATING and start teardown sequence (rdma_disconnect).
665
 * In case the connection state is UP, complete flush as well.
666
 *
667
 * This routine must be called with mutex held. Thus it is
668 669 670 671 672 673 674
 * safe to call multiple times.
 */
static void
isert_conn_terminate(struct isert_conn *isert_conn)
{
	int err;

675 676 677 678 679 680 681 682 683 684
	if (isert_conn->state >= ISER_CONN_TERMINATING)
		return;

	isert_info("Terminating conn %p state %d\n",
		   isert_conn, isert_conn->state);
	isert_conn->state = ISER_CONN_TERMINATING;
	err = rdma_disconnect(isert_conn->cm_id);
	if (err)
		isert_warn("Failed rdma_disconnect isert_conn %p\n",
			   isert_conn);
685 686
}

687
static int
688 689
isert_np_cma_handler(struct isert_np *isert_np,
		     enum rdma_cm_event_type event)
690
{
691 692
	isert_dbg("%s (%d): isert np %p\n",
		  rdma_event_msg(event), event, isert_np);
693

694 695
	switch (event) {
	case RDMA_CM_EVENT_DEVICE_REMOVAL:
696
		isert_np->cm_id = NULL;
697 698
		break;
	case RDMA_CM_EVENT_ADDR_CHANGE:
699 700
		isert_np->cm_id = isert_setup_id(isert_np);
		if (IS_ERR(isert_np->cm_id)) {
701
			isert_err("isert np %p setup id failed: %ld\n",
702 703
				  isert_np, PTR_ERR(isert_np->cm_id));
			isert_np->cm_id = NULL;
704 705 706
		}
		break;
	default:
707
		isert_err("isert np %p Unexpected event %d\n",
708
			  isert_np, event);
709 710
	}

711 712 713 714 715 716 717
	return -1;
}

static int
isert_disconnected_handler(struct rdma_cm_id *cma_id,
			   enum rdma_cm_event_type event)
{
718
	struct isert_conn *isert_conn = cma_id->qp->qp_context;
719

720
	mutex_lock(&isert_conn->mutex);
721 722 723 724 725
	switch (isert_conn->state) {
	case ISER_CONN_TERMINATING:
		break;
	case ISER_CONN_UP:
		isert_conn_terminate(isert_conn);
S
Sagi Grimberg 已提交
726
		ib_drain_qp(isert_conn->qp);
727 728 729 730 731 732 733 734 735
		isert_handle_unbound_conn(isert_conn);
		break;
	case ISER_CONN_BOUND:
	case ISER_CONN_FULL_FEATURE: /* FALLTHRU */
		iscsit_cause_connection_reinstatement(isert_conn->conn, 0);
		break;
	default:
		isert_warn("conn %p teminating in state %d\n",
			   isert_conn, isert_conn->state);
736
	}
737
	mutex_unlock(&isert_conn->mutex);
738

739
	return 0;
740 741
}

742
static int
743 744
isert_connect_error(struct rdma_cm_id *cma_id)
{
745
	struct isert_conn *isert_conn = cma_id->qp->qp_context;
746

747
	list_del_init(&isert_conn->node);
748
	isert_conn->cm_id = NULL;
749
	isert_put_conn(isert_conn);
750 751

	return -1;
752 753
}

754 755 756
static int
isert_cma_handler(struct rdma_cm_id *cma_id, struct rdma_cm_event *event)
{
757
	struct isert_np *isert_np = cma_id->context;
758 759
	int ret = 0;

760 761
	isert_info("%s (%d): status %d id %p np %p\n",
		   rdma_event_msg(event->event), event->event,
762
		   event->status, cma_id, cma_id->context);
763

764 765 766
	if (isert_np->cm_id == cma_id)
		return isert_np_cma_handler(cma_id->context, event->event);

767 768 769
	switch (event->event) {
	case RDMA_CM_EVENT_CONNECT_REQUEST:
		ret = isert_connect_request(cma_id, event);
770
		if (ret)
771
			isert_err("failed handle connect request %d\n", ret);
772 773 774 775
		break;
	case RDMA_CM_EVENT_ESTABLISHED:
		isert_connected_handler(cma_id);
		break;
776 777 778 779
	case RDMA_CM_EVENT_ADDR_CHANGE:    /* FALLTHRU */
	case RDMA_CM_EVENT_DISCONNECTED:   /* FALLTHRU */
	case RDMA_CM_EVENT_DEVICE_REMOVAL: /* FALLTHRU */
	case RDMA_CM_EVENT_TIMEWAIT_EXIT:  /* FALLTHRU */
780
		ret = isert_disconnected_handler(cma_id, event->event);
781
		break;
782 783
	case RDMA_CM_EVENT_REJECTED:       /* FALLTHRU */
	case RDMA_CM_EVENT_UNREACHABLE:    /* FALLTHRU */
784
	case RDMA_CM_EVENT_CONNECT_ERROR:
785
		ret = isert_connect_error(cma_id);
786
		break;
787
	default:
788
		isert_err("Unhandled RDMA CMA event: %d\n", event->event);
789 790 791 792 793 794 795
		break;
	}

	return ret;
}

static int
796
isert_post_recvm(struct isert_conn *isert_conn, u32 count)
797 798 799 800 801
{
	struct ib_recv_wr *rx_wr, *rx_wr_failed;
	int i, ret;
	struct iser_rx_desc *rx_desc;

802
	for (rx_wr = isert_conn->rx_wr, i = 0; i < count; i++, rx_wr++) {
803
		rx_desc = &isert_conn->rx_descs[i];
804 805

		rx_wr->wr_cqe = &rx_desc->rx_cqe;
806 807 808
		rx_wr->sg_list = &rx_desc->rx_sg;
		rx_wr->num_sge = 1;
		rx_wr->next = rx_wr + 1;
809 810 811 812
	}
	rx_wr--;
	rx_wr->next = NULL; /* mark end of work requests list */

813
	ret = ib_post_recv(isert_conn->qp, isert_conn->rx_wr,
814
			   &rx_wr_failed);
815
	if (ret)
816
		isert_err("ib_post_recv() failed with ret: %d\n", ret);
817 818 819 820 821 822 823 824 825 826

	return ret;
}

static int
isert_post_recv(struct isert_conn *isert_conn, struct iser_rx_desc *rx_desc)
{
	struct ib_recv_wr *rx_wr_failed, rx_wr;
	int ret;

827
	rx_wr.wr_cqe = &rx_desc->rx_cqe;
828 829 830 831 832
	rx_wr.sg_list = &rx_desc->rx_sg;
	rx_wr.num_sge = 1;
	rx_wr.next = NULL;

	ret = ib_post_recv(isert_conn->qp, &rx_wr, &rx_wr_failed);
833
	if (ret)
834 835
		isert_err("ib_post_recv() failed with ret: %d\n", ret);

836 837 838 839
	return ret;
}

static int
840
isert_login_post_send(struct isert_conn *isert_conn, struct iser_tx_desc *tx_desc)
841
{
842
	struct ib_device *ib_dev = isert_conn->cm_id->device;
843 844 845 846 847 848
	struct ib_send_wr send_wr, *send_wr_failed;
	int ret;

	ib_dma_sync_single_for_device(ib_dev, tx_desc->dma_addr,
				      ISER_HEADERS_LEN, DMA_TO_DEVICE);

849 850
	tx_desc->tx_cqe.done = isert_login_send_done;

851
	send_wr.next	= NULL;
852
	send_wr.wr_cqe	= &tx_desc->tx_cqe;
853 854 855 856 857
	send_wr.sg_list	= tx_desc->tx_sg;
	send_wr.num_sge	= tx_desc->num_sge;
	send_wr.opcode	= IB_WR_SEND;
	send_wr.send_flags = IB_SEND_SIGNALED;

858
	ret = ib_post_send(isert_conn->qp, &send_wr, &send_wr_failed);
859
	if (ret)
860
		isert_err("ib_post_send() failed, ret: %d\n", ret);
861 862 863 864 865 866 867 868 869

	return ret;
}

static void
isert_create_send_desc(struct isert_conn *isert_conn,
		       struct isert_cmd *isert_cmd,
		       struct iser_tx_desc *tx_desc)
{
870
	struct isert_device *device = isert_conn->device;
871
	struct ib_device *ib_dev = device->ib_device;
872 873 874 875

	ib_dma_sync_single_for_cpu(ib_dev, tx_desc->dma_addr,
				   ISER_HEADERS_LEN, DMA_TO_DEVICE);

876 877
	memset(&tx_desc->iser_header, 0, sizeof(struct iser_ctrl));
	tx_desc->iser_header.flags = ISCSI_CTRL;
878 879 880

	tx_desc->num_sge = 1;

881 882
	if (tx_desc->tx_sg[0].lkey != device->pd->local_dma_lkey) {
		tx_desc->tx_sg[0].lkey = device->pd->local_dma_lkey;
883
		isert_dbg("tx_desc %p lkey mismatch, fixing\n", tx_desc);
884 885 886 887 888 889 890
	}
}

static int
isert_init_tx_hdrs(struct isert_conn *isert_conn,
		   struct iser_tx_desc *tx_desc)
{
891
	struct isert_device *device = isert_conn->device;
892
	struct ib_device *ib_dev = device->ib_device;
893 894 895 896 897
	u64 dma_addr;

	dma_addr = ib_dma_map_single(ib_dev, (void *)tx_desc,
			ISER_HEADERS_LEN, DMA_TO_DEVICE);
	if (ib_dma_mapping_error(ib_dev, dma_addr)) {
898
		isert_err("ib_dma_mapping_error() failed\n");
899 900 901 902 903 904
		return -ENOMEM;
	}

	tx_desc->dma_addr = dma_addr;
	tx_desc->tx_sg[0].addr	= tx_desc->dma_addr;
	tx_desc->tx_sg[0].length = ISER_HEADERS_LEN;
905
	tx_desc->tx_sg[0].lkey = device->pd->local_dma_lkey;
906

907 908 909
	isert_dbg("Setup tx_sg[0].addr: 0x%llx length: %u lkey: 0x%x\n",
		  tx_desc->tx_sg[0].addr, tx_desc->tx_sg[0].length,
		  tx_desc->tx_sg[0].lkey);
910 911 912 913 914

	return 0;
}

static void
915
isert_init_send_wr(struct isert_conn *isert_conn, struct isert_cmd *isert_cmd,
916
		   struct ib_send_wr *send_wr)
917
{
918 919
	struct iser_tx_desc *tx_desc = &isert_cmd->tx_desc;

920 921
	tx_desc->tx_cqe.done = isert_send_done;
	send_wr->wr_cqe = &tx_desc->tx_cqe;
922 923 924 925 926 927 928 929

	if (isert_conn->snd_w_inv && isert_cmd->inv_rkey) {
		send_wr->opcode  = IB_WR_SEND_WITH_INV;
		send_wr->ex.invalidate_rkey = isert_cmd->inv_rkey;
	} else {
		send_wr->opcode = IB_WR_SEND;
	}

930
	send_wr->sg_list = &tx_desc->tx_sg[0];
931
	send_wr->num_sge = isert_cmd->tx_desc.num_sge;
932
	send_wr->send_flags = IB_SEND_SIGNALED;
933 934 935
}

static int
936
isert_login_post_recv(struct isert_conn *isert_conn)
937 938 939 940 941 942 943
{
	struct ib_recv_wr rx_wr, *rx_wr_fail;
	struct ib_sge sge;
	int ret;

	memset(&sge, 0, sizeof(struct ib_sge));
	sge.addr = isert_conn->login_req_dma;
944
	sge.length = ISER_RX_PAYLOAD_SIZE;
945
	sge.lkey = isert_conn->device->pd->local_dma_lkey;
946

947
	isert_dbg("Setup sge: addr: %llx length: %d 0x%08x\n",
948 949
		sge.addr, sge.length, sge.lkey);

950 951
	isert_conn->login_req_buf->rx_cqe.done = isert_login_recv_done;

952
	memset(&rx_wr, 0, sizeof(struct ib_recv_wr));
953
	rx_wr.wr_cqe = &isert_conn->login_req_buf->rx_cqe;
954 955 956
	rx_wr.sg_list = &sge;
	rx_wr.num_sge = 1;

957
	ret = ib_post_recv(isert_conn->qp, &rx_wr, &rx_wr_fail);
958
	if (ret)
959
		isert_err("ib_post_recv() failed: %d\n", ret);
960 961 962 963 964 965 966 967 968

	return ret;
}

static int
isert_put_login_tx(struct iscsi_conn *conn, struct iscsi_login *login,
		   u32 length)
{
	struct isert_conn *isert_conn = conn->context;
969
	struct isert_device *device = isert_conn->device;
970
	struct ib_device *ib_dev = device->ib_device;
971
	struct iser_tx_desc *tx_desc = &isert_conn->login_tx_desc;
972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993
	int ret;

	isert_create_send_desc(isert_conn, NULL, tx_desc);

	memcpy(&tx_desc->iscsi_header, &login->rsp[0],
	       sizeof(struct iscsi_hdr));

	isert_init_tx_hdrs(isert_conn, tx_desc);

	if (length > 0) {
		struct ib_sge *tx_dsg = &tx_desc->tx_sg[1];

		ib_dma_sync_single_for_cpu(ib_dev, isert_conn->login_rsp_dma,
					   length, DMA_TO_DEVICE);

		memcpy(isert_conn->login_rsp_buf, login->rsp_buf, length);

		ib_dma_sync_single_for_device(ib_dev, isert_conn->login_rsp_dma,
					      length, DMA_TO_DEVICE);

		tx_dsg->addr	= isert_conn->login_rsp_dma;
		tx_dsg->length	= length;
994
		tx_dsg->lkey	= isert_conn->device->pd->local_dma_lkey;
995 996 997 998 999 1000 1001 1002
		tx_desc->num_sge = 2;
	}
	if (!login->login_failed) {
		if (login->login_complete) {
			ret = isert_alloc_rx_descriptors(isert_conn);
			if (ret)
				return ret;

1003 1004
			ret = isert_post_recvm(isert_conn,
					       ISERT_QP_MAX_RECV_DTOS);
1005 1006 1007
			if (ret)
				return ret;

1008
			/* Now we are in FULL_FEATURE phase */
1009
			mutex_lock(&isert_conn->mutex);
1010
			isert_conn->state = ISER_CONN_FULL_FEATURE;
1011
			mutex_unlock(&isert_conn->mutex);
1012 1013 1014
			goto post_send;
		}

1015
		ret = isert_login_post_recv(isert_conn);
1016 1017 1018 1019
		if (ret)
			return ret;
	}
post_send:
1020
	ret = isert_login_post_send(isert_conn, tx_desc);
1021 1022 1023 1024 1025 1026 1027
	if (ret)
		return ret;

	return 0;
}

static void
1028
isert_rx_login_req(struct isert_conn *isert_conn)
1029
{
1030
	struct iser_rx_desc *rx_desc = isert_conn->login_req_buf;
1031
	int rx_buflen = isert_conn->login_req_len;
1032 1033 1034 1035
	struct iscsi_conn *conn = isert_conn->conn;
	struct iscsi_login *login = conn->conn_login;
	int size;

1036
	isert_info("conn %p\n", isert_conn);
1037 1038

	WARN_ON_ONCE(!login);
1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063

	if (login->first_request) {
		struct iscsi_login_req *login_req =
			(struct iscsi_login_req *)&rx_desc->iscsi_header;
		/*
		 * Setup the initial iscsi_login values from the leading
		 * login request PDU.
		 */
		login->leading_connection = (!login_req->tsih) ? 1 : 0;
		login->current_stage =
			(login_req->flags & ISCSI_FLAG_LOGIN_CURRENT_STAGE_MASK)
			 >> 2;
		login->version_min	= login_req->min_version;
		login->version_max	= login_req->max_version;
		memcpy(login->isid, login_req->isid, 6);
		login->cmd_sn		= be32_to_cpu(login_req->cmdsn);
		login->init_task_tag	= login_req->itt;
		login->initial_exp_statsn = be32_to_cpu(login_req->exp_statsn);
		login->cid		= be16_to_cpu(login_req->cid);
		login->tsih		= be16_to_cpu(login_req->tsih);
	}

	memcpy(&login->req[0], (void *)&rx_desc->iscsi_header, ISCSI_HDR_LEN);

	size = min(rx_buflen, MAX_KEY_VALUE_PAIRS);
1064 1065 1066
	isert_dbg("Using login payload size: %d, rx_buflen: %d "
		  "MAX_KEY_VALUE_PAIRS: %d\n", size, rx_buflen,
		  MAX_KEY_VALUE_PAIRS);
1067 1068
	memcpy(login->req_buf, &rx_desc->data[0], size);

1069
	if (login->first_request) {
1070
		complete(&isert_conn->login_comp);
1071 1072 1073
		return;
	}
	schedule_delayed_work(&conn->login_work, 0);
1074 1075 1076
}

static struct iscsi_cmd
1077
*isert_allocate_cmd(struct iscsi_conn *conn, struct iser_rx_desc *rx_desc)
1078
{
1079
	struct isert_conn *isert_conn = conn->context;
1080
	struct isert_cmd *isert_cmd;
1081
	struct iscsi_cmd *cmd;
1082

1083
	cmd = iscsit_allocate_cmd(conn, TASK_INTERRUPTIBLE);
1084
	if (!cmd) {
1085
		isert_err("Unable to allocate iscsi_cmd + isert_cmd\n");
1086 1087
		return NULL;
	}
1088
	isert_cmd = iscsit_priv_cmd(cmd);
1089
	isert_cmd->conn = isert_conn;
1090
	isert_cmd->iscsi_cmd = cmd;
1091
	isert_cmd->rx_desc = rx_desc;
1092

1093
	return cmd;
1094 1095 1096 1097
}

static int
isert_handle_scsi_cmd(struct isert_conn *isert_conn,
1098 1099
		      struct isert_cmd *isert_cmd, struct iscsi_cmd *cmd,
		      struct iser_rx_desc *rx_desc, unsigned char *buf)
1100 1101 1102 1103 1104
{
	struct iscsi_conn *conn = isert_conn->conn;
	struct iscsi_scsi_req *hdr = (struct iscsi_scsi_req *)buf;
	int imm_data, imm_data_len, unsol_data, sg_nents, rc;
	bool dump_payload = false;
1105
	unsigned int data_len;
1106 1107 1108 1109 1110 1111 1112 1113

	rc = iscsit_setup_scsi_cmd(conn, cmd, buf);
	if (rc < 0)
		return rc;

	imm_data = cmd->immediate_data;
	imm_data_len = cmd->first_burst_len;
	unsol_data = cmd->unsolicited_data;
1114
	data_len = cmd->se_cmd.data_length;
1115

1116 1117
	if (imm_data && imm_data_len == data_len)
		cmd->se_cmd.se_cmd_flags |= SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC;
1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128
	rc = iscsit_process_scsi_cmd(conn, cmd, hdr);
	if (rc < 0) {
		return 0;
	} else if (rc > 0) {
		dump_payload = true;
		goto sequence_cmd;
	}

	if (!imm_data)
		return 0;

1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142
	if (imm_data_len != data_len) {
		sg_nents = max(1UL, DIV_ROUND_UP(imm_data_len, PAGE_SIZE));
		sg_copy_from_buffer(cmd->se_cmd.t_data_sg, sg_nents,
				    &rx_desc->data[0], imm_data_len);
		isert_dbg("Copy Immediate sg_nents: %u imm_data_len: %d\n",
			  sg_nents, imm_data_len);
	} else {
		sg_init_table(&isert_cmd->sg, 1);
		cmd->se_cmd.t_data_sg = &isert_cmd->sg;
		cmd->se_cmd.t_data_nents = 1;
		sg_set_buf(&isert_cmd->sg, &rx_desc->data[0], imm_data_len);
		isert_dbg("Transfer Immediate imm_data_len: %d\n",
			  imm_data_len);
	}
1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153

	cmd->write_data_done += imm_data_len;

	if (cmd->write_data_done == cmd->se_cmd.data_length) {
		spin_lock_bh(&cmd->istate_lock);
		cmd->cmd_flags |= ICF_GOT_LAST_DATAOUT;
		cmd->i_state = ISTATE_RECEIVED_LAST_DATAOUT;
		spin_unlock_bh(&cmd->istate_lock);
	}

sequence_cmd:
1154
	rc = iscsit_sequence_cmd(conn, cmd, buf, hdr->cmdsn);
1155 1156 1157

	if (!rc && dump_payload == false && unsol_data)
		iscsit_set_unsoliticed_dataout(cmd);
1158
	else if (dump_payload && imm_data)
1159
		target_put_sess_cmd(&cmd->se_cmd);
1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183

	return 0;
}

static int
isert_handle_iscsi_dataout(struct isert_conn *isert_conn,
			   struct iser_rx_desc *rx_desc, unsigned char *buf)
{
	struct scatterlist *sg_start;
	struct iscsi_conn *conn = isert_conn->conn;
	struct iscsi_cmd *cmd = NULL;
	struct iscsi_data *hdr = (struct iscsi_data *)buf;
	u32 unsol_data_len = ntoh24(hdr->dlength);
	int rc, sg_nents, sg_off, page_off;

	rc = iscsit_check_dataout_hdr(conn, buf, &cmd);
	if (rc < 0)
		return rc;
	else if (!cmd)
		return 0;
	/*
	 * FIXME: Unexpected unsolicited_data out
	 */
	if (!cmd->unsolicited_data) {
1184
		isert_err("Received unexpected solicited data payload\n");
1185 1186 1187 1188
		dump_stack();
		return -1;
	}

1189 1190 1191 1192
	isert_dbg("Unsolicited DataOut unsol_data_len: %u, "
		  "write_data_done: %u, data_length: %u\n",
		  unsol_data_len,  cmd->write_data_done,
		  cmd->se_cmd.data_length);
1193 1194 1195 1196 1197 1198 1199 1200 1201

	sg_off = cmd->write_data_done / PAGE_SIZE;
	sg_start = &cmd->se_cmd.t_data_sg[sg_off];
	sg_nents = max(1UL, DIV_ROUND_UP(unsol_data_len, PAGE_SIZE));
	page_off = cmd->write_data_done % PAGE_SIZE;
	/*
	 * FIXME: Non page-aligned unsolicited_data out
	 */
	if (page_off) {
1202
		isert_err("unexpected non-page aligned data payload\n");
1203 1204 1205
		dump_stack();
		return -1;
	}
1206 1207 1208
	isert_dbg("Copying DataOut: sg_start: %p, sg_off: %u "
		  "sg_nents: %u from %p %u\n", sg_start, sg_off,
		  sg_nents, &rx_desc->data[0], unsol_data_len);
1209 1210 1211 1212 1213 1214 1215 1216

	sg_copy_from_buffer(sg_start, sg_nents, &rx_desc->data[0],
			    unsol_data_len);

	rc = iscsit_check_dataout_payload(cmd, hdr, false);
	if (rc < 0)
		return rc;

1217 1218 1219 1220 1221 1222 1223 1224 1225
	/*
	 * multiple data-outs on the same command can arrive -
	 * so post the buffer before hand
	 */
	rc = isert_post_recv(isert_conn, rx_desc);
	if (rc) {
		isert_err("ib_post_recv failed with %d\n", rc);
		return rc;
	}
1226 1227 1228
	return 0;
}

1229 1230
static int
isert_handle_nop_out(struct isert_conn *isert_conn, struct isert_cmd *isert_cmd,
1231 1232
		     struct iscsi_cmd *cmd, struct iser_rx_desc *rx_desc,
		     unsigned char *buf)
1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247
{
	struct iscsi_conn *conn = isert_conn->conn;
	struct iscsi_nopout *hdr = (struct iscsi_nopout *)buf;
	int rc;

	rc = iscsit_setup_nop_out(conn, cmd, hdr);
	if (rc < 0)
		return rc;
	/*
	 * FIXME: Add support for NOPOUT payload using unsolicited RDMA payload
	 */

	return iscsit_process_nop_out(conn, cmd, hdr);
}

1248 1249
static int
isert_handle_text_cmd(struct isert_conn *isert_conn, struct isert_cmd *isert_cmd,
1250 1251
		      struct iscsi_cmd *cmd, struct iser_rx_desc *rx_desc,
		      struct iscsi_text *hdr)
1252 1253 1254 1255
{
	struct iscsi_conn *conn = isert_conn->conn;
	u32 payload_length = ntoh24(hdr->dlength);
	int rc;
1256
	unsigned char *text_in = NULL;
1257 1258 1259 1260 1261

	rc = iscsit_setup_text_cmd(conn, cmd, hdr);
	if (rc < 0)
		return rc;

1262 1263 1264 1265 1266 1267 1268
	if (payload_length) {
		text_in = kzalloc(payload_length, GFP_KERNEL);
		if (!text_in) {
			isert_err("Unable to allocate text_in of payload_length: %u\n",
				  payload_length);
			return -ENOMEM;
		}
1269 1270 1271 1272 1273 1274 1275 1276
	}
	cmd->text_in_ptr = text_in;

	memcpy(cmd->text_in_ptr, &rx_desc->data[0], payload_length);

	return iscsit_process_text_cmd(conn, cmd, hdr);
}

1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288
static int
isert_rx_opcode(struct isert_conn *isert_conn, struct iser_rx_desc *rx_desc,
		uint32_t read_stag, uint64_t read_va,
		uint32_t write_stag, uint64_t write_va)
{
	struct iscsi_hdr *hdr = &rx_desc->iscsi_header;
	struct iscsi_conn *conn = isert_conn->conn;
	struct iscsi_cmd *cmd;
	struct isert_cmd *isert_cmd;
	int ret = -EINVAL;
	u8 opcode = (hdr->opcode & ISCSI_OPCODE_MASK);

1289
	if (conn->sess->sess_ops->SessionType &&
1290
	   (!(opcode & ISCSI_OP_TEXT) || !(opcode & ISCSI_OP_LOGOUT))) {
1291
		isert_err("Got illegal opcode: 0x%02x in SessionType=Discovery,"
1292
			  " ignoring\n", opcode);
1293 1294 1295
		return 0;
	}

1296 1297
	switch (opcode) {
	case ISCSI_OP_SCSI_CMD:
1298
		cmd = isert_allocate_cmd(conn, rx_desc);
1299 1300 1301
		if (!cmd)
			break;

1302
		isert_cmd = iscsit_priv_cmd(cmd);
1303 1304 1305 1306
		isert_cmd->read_stag = read_stag;
		isert_cmd->read_va = read_va;
		isert_cmd->write_stag = write_stag;
		isert_cmd->write_va = write_va;
1307
		isert_cmd->inv_rkey = read_stag ? read_stag : write_stag;
1308

1309
		ret = isert_handle_scsi_cmd(isert_conn, isert_cmd, cmd,
1310 1311 1312
					rx_desc, (unsigned char *)hdr);
		break;
	case ISCSI_OP_NOOP_OUT:
1313
		cmd = isert_allocate_cmd(conn, rx_desc);
1314 1315 1316
		if (!cmd)
			break;

1317 1318
		isert_cmd = iscsit_priv_cmd(cmd);
		ret = isert_handle_nop_out(isert_conn, isert_cmd, cmd,
1319
					   rx_desc, (unsigned char *)hdr);
1320 1321 1322 1323 1324 1325
		break;
	case ISCSI_OP_SCSI_DATA_OUT:
		ret = isert_handle_iscsi_dataout(isert_conn, rx_desc,
						(unsigned char *)hdr);
		break;
	case ISCSI_OP_SCSI_TMFUNC:
1326
		cmd = isert_allocate_cmd(conn, rx_desc);
1327 1328 1329 1330 1331 1332 1333
		if (!cmd)
			break;

		ret = iscsit_handle_task_mgt_cmd(conn, cmd,
						(unsigned char *)hdr);
		break;
	case ISCSI_OP_LOGOUT:
1334
		cmd = isert_allocate_cmd(conn, rx_desc);
1335 1336 1337 1338 1339
		if (!cmd)
			break;

		ret = iscsit_handle_logout_cmd(conn, cmd, (unsigned char *)hdr);
		break;
1340
	case ISCSI_OP_TEXT:
1341
		if (be32_to_cpu(hdr->ttt) != 0xFFFFFFFF)
1342
			cmd = iscsit_find_cmd_from_itt(conn, hdr->itt);
1343 1344 1345 1346 1347
		else
			cmd = isert_allocate_cmd(conn, rx_desc);

		if (!cmd)
			break;
1348

1349 1350
		isert_cmd = iscsit_priv_cmd(cmd);
		ret = isert_handle_text_cmd(isert_conn, isert_cmd, cmd,
1351 1352
					    rx_desc, (struct iscsi_text *)hdr);
		break;
1353
	default:
1354
		isert_err("Got unknown iSCSI OpCode: 0x%02x\n", opcode);
1355 1356 1357 1358 1359 1360 1361 1362
		dump_stack();
		break;
	}

	return ret;
}

static void
1363
isert_print_wc(struct ib_wc *wc, const char *type)
1364
{
1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380
	if (wc->status != IB_WC_WR_FLUSH_ERR)
		isert_err("%s failure: %s (%d) vend_err %x\n", type,
			  ib_wc_status_msg(wc->status), wc->status,
			  wc->vendor_err);
	else
		isert_dbg("%s failure: %s (%d)\n", type,
			  ib_wc_status_msg(wc->status), wc->status);
}

static void
isert_recv_done(struct ib_cq *cq, struct ib_wc *wc)
{
	struct isert_conn *isert_conn = wc->qp->qp_context;
	struct ib_device *ib_dev = isert_conn->cm_id->device;
	struct iser_rx_desc *rx_desc = cqe_to_rx_desc(wc->wr_cqe);
	struct iscsi_hdr *hdr = &rx_desc->iscsi_header;
1381
	struct iser_ctrl *iser_ctrl = &rx_desc->iser_header;
1382 1383 1384
	uint64_t read_va = 0, write_va = 0;
	uint32_t read_stag = 0, write_stag = 0;

1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398
	if (unlikely(wc->status != IB_WC_SUCCESS)) {
		isert_print_wc(wc, "recv");
		if (wc->status != IB_WC_WR_FLUSH_ERR)
			iscsit_cause_connection_reinstatement(isert_conn->conn, 0);
		return;
	}

	ib_dma_sync_single_for_cpu(ib_dev, rx_desc->dma_addr,
			ISER_RX_PAYLOAD_SIZE, DMA_FROM_DEVICE);

	isert_dbg("DMA: 0x%llx, iSCSI opcode: 0x%02x, ITT: 0x%08x, flags: 0x%02x dlen: %d\n",
		 rx_desc->dma_addr, hdr->opcode, hdr->itt, hdr->flags,
		 (int)(wc->byte_len - ISER_HEADERS_LEN));

1399
	switch (iser_ctrl->flags & 0xF0) {
1400
	case ISCSI_CTRL:
1401 1402 1403
		if (iser_ctrl->flags & ISER_RSV) {
			read_stag = be32_to_cpu(iser_ctrl->read_stag);
			read_va = be64_to_cpu(iser_ctrl->read_va);
1404 1405
			isert_dbg("ISER_RSV: read_stag: 0x%x read_va: 0x%llx\n",
				  read_stag, (unsigned long long)read_va);
1406
		}
1407 1408 1409
		if (iser_ctrl->flags & ISER_WSV) {
			write_stag = be32_to_cpu(iser_ctrl->write_stag);
			write_va = be64_to_cpu(iser_ctrl->write_va);
1410 1411
			isert_dbg("ISER_WSV: write_stag: 0x%x write_va: 0x%llx\n",
				  write_stag, (unsigned long long)write_va);
1412 1413
		}

1414
		isert_dbg("ISER ISCSI_CTRL PDU\n");
1415 1416
		break;
	case ISER_HELLO:
1417
		isert_err("iSER Hello message\n");
1418 1419
		break;
	default:
1420
		isert_warn("Unknown iSER hdr flags: 0x%02x\n", iser_ctrl->flags);
1421 1422 1423
		break;
	}

1424 1425
	isert_rx_opcode(isert_conn, rx_desc,
			read_stag, read_va, write_stag, write_va);
1426 1427 1428

	ib_dma_sync_single_for_device(ib_dev, rx_desc->dma_addr,
			ISER_RX_PAYLOAD_SIZE, DMA_FROM_DEVICE);
1429 1430 1431
}

static void
1432
isert_login_recv_done(struct ib_cq *cq, struct ib_wc *wc)
1433
{
1434
	struct isert_conn *isert_conn = wc->qp->qp_context;
1435
	struct ib_device *ib_dev = isert_conn->cm_id->device;
1436 1437 1438 1439

	if (unlikely(wc->status != IB_WC_SUCCESS)) {
		isert_print_wc(wc, "login recv");
		return;
1440 1441
	}

1442 1443
	ib_dma_sync_single_for_cpu(ib_dev, isert_conn->login_req_dma,
			ISER_RX_PAYLOAD_SIZE, DMA_FROM_DEVICE);
1444

1445
	isert_conn->login_req_len = wc->byte_len - ISER_HEADERS_LEN;
1446

1447 1448
	if (isert_conn->conn) {
		struct iscsi_login *login = isert_conn->conn->conn_login;
1449

1450 1451
		if (login && !login->first_request)
			isert_rx_login_req(isert_conn);
1452
	}
1453

1454 1455 1456
	mutex_lock(&isert_conn->mutex);
	complete(&isert_conn->login_req_comp);
	mutex_unlock(&isert_conn->mutex);
1457

1458 1459
	ib_dma_sync_single_for_device(ib_dev, isert_conn->login_req_dma,
				ISER_RX_PAYLOAD_SIZE, DMA_FROM_DEVICE);
1460 1461 1462
}

static void
1463
isert_rdma_rw_ctx_destroy(struct isert_cmd *cmd, struct isert_conn *conn)
1464
{
1465 1466
	struct se_cmd *se_cmd = &cmd->iscsi_cmd->se_cmd;
	enum dma_data_direction dir = target_reverse_dma_direction(se_cmd);
1467

1468 1469
	if (!cmd->rw.nr_ops)
		return;
1470

1471 1472 1473 1474 1475 1476 1477 1478
	if (isert_prot_cmd(conn, se_cmd)) {
		rdma_rw_ctx_destroy_signature(&cmd->rw, conn->qp,
				conn->cm_id->port_num, se_cmd->t_data_sg,
				se_cmd->t_data_nents, se_cmd->t_prot_sg,
				se_cmd->t_prot_nents, dir);
	} else {
		rdma_rw_ctx_destroy(&cmd->rw, conn->qp, conn->cm_id->port_num,
				se_cmd->t_data_sg, se_cmd->t_data_nents, dir);
1479 1480
	}

1481
	cmd->rw.nr_ops = 0;
1482 1483
}

1484
static void
1485
isert_put_cmd(struct isert_cmd *isert_cmd, bool comp_err)
1486
{
1487
	struct iscsi_cmd *cmd = isert_cmd->iscsi_cmd;
1488
	struct isert_conn *isert_conn = isert_cmd->conn;
1489
	struct iscsi_conn *conn = isert_conn->conn;
1490
	struct iscsi_text_rsp *hdr;
1491

1492
	isert_dbg("Cmd %p\n", isert_cmd);
1493 1494 1495 1496 1497

	switch (cmd->iscsi_opcode) {
	case ISCSI_OP_SCSI_CMD:
		spin_lock_bh(&conn->cmd_lock);
		if (!list_empty(&cmd->i_conn_node))
1498
			list_del_init(&cmd->i_conn_node);
1499 1500
		spin_unlock_bh(&conn->cmd_lock);

1501
		if (cmd->data_direction == DMA_TO_DEVICE) {
1502
			iscsit_stop_dataout_timer(cmd);
1503 1504 1505 1506 1507 1508 1509 1510 1511 1512
			/*
			 * Check for special case during comp_err where
			 * WRITE_PENDING has been handed off from core,
			 * but requires an extra target_put_sess_cmd()
			 * before transport_generic_free_cmd() below.
			 */
			if (comp_err &&
			    cmd->se_cmd.t_state == TRANSPORT_WRITE_PENDING) {
				struct se_cmd *se_cmd = &cmd->se_cmd;

1513
				target_put_sess_cmd(se_cmd);
1514 1515
			}
		}
1516

1517
		isert_rdma_rw_ctx_destroy(isert_cmd, isert_conn);
1518 1519
		transport_generic_free_cmd(&cmd->se_cmd, 0);
		break;
1520
	case ISCSI_OP_SCSI_TMFUNC:
1521 1522
		spin_lock_bh(&conn->cmd_lock);
		if (!list_empty(&cmd->i_conn_node))
1523
			list_del_init(&cmd->i_conn_node);
1524 1525
		spin_unlock_bh(&conn->cmd_lock);

1526 1527 1528 1529
		transport_generic_free_cmd(&cmd->se_cmd, 0);
		break;
	case ISCSI_OP_REJECT:
	case ISCSI_OP_NOOP_OUT:
1530
	case ISCSI_OP_TEXT:
1531 1532 1533 1534 1535
		hdr = (struct iscsi_text_rsp *)&isert_cmd->tx_desc.iscsi_header;
		/* If the continue bit is on, keep the command alive */
		if (hdr->flags & ISCSI_FLAG_TEXT_CONTINUE)
			break;

1536 1537
		spin_lock_bh(&conn->cmd_lock);
		if (!list_empty(&cmd->i_conn_node))
1538
			list_del_init(&cmd->i_conn_node);
1539 1540 1541 1542 1543 1544 1545 1546
		spin_unlock_bh(&conn->cmd_lock);

		/*
		 * Handle special case for REJECT when iscsi_add_reject*() has
		 * overwritten the original iscsi_opcode assignment, and the
		 * associated cmd->se_cmd needs to be released.
		 */
		if (cmd->se_cmd.se_tfo != NULL) {
1547
			isert_dbg("Calling transport_generic_free_cmd for 0x%02x\n",
1548
				 cmd->iscsi_opcode);
1549 1550 1551 1552 1553 1554 1555
			transport_generic_free_cmd(&cmd->se_cmd, 0);
			break;
		}
		/*
		 * Fall-through
		 */
	default:
1556
		iscsit_release_cmd(cmd);
1557 1558 1559 1560 1561 1562 1563 1564
		break;
	}
}

static void
isert_unmap_tx_desc(struct iser_tx_desc *tx_desc, struct ib_device *ib_dev)
{
	if (tx_desc->dma_addr != 0) {
1565
		isert_dbg("unmap single for tx_desc->dma_addr\n");
1566 1567 1568 1569 1570 1571 1572 1573
		ib_dma_unmap_single(ib_dev, tx_desc->dma_addr,
				    ISER_HEADERS_LEN, DMA_TO_DEVICE);
		tx_desc->dma_addr = 0;
	}
}

static void
isert_completion_put(struct iser_tx_desc *tx_desc, struct isert_cmd *isert_cmd,
1574
		     struct ib_device *ib_dev, bool comp_err)
1575
{
1576
	if (isert_cmd->pdu_buf_dma != 0) {
1577
		isert_dbg("unmap single for isert_cmd->pdu_buf_dma\n");
1578 1579 1580
		ib_dma_unmap_single(ib_dev, isert_cmd->pdu_buf_dma,
				    isert_cmd->pdu_buf_len, DMA_TO_DEVICE);
		isert_cmd->pdu_buf_dma = 0;
1581 1582 1583
	}

	isert_unmap_tx_desc(tx_desc, ib_dev);
1584
	isert_put_cmd(isert_cmd, comp_err);
1585 1586
}

1587 1588 1589 1590 1591 1592 1593 1594
static int
isert_check_pi_status(struct se_cmd *se_cmd, struct ib_mr *sig_mr)
{
	struct ib_mr_status mr_status;
	int ret;

	ret = ib_check_mr_status(sig_mr, IB_MR_CHECK_SIG_STATUS, &mr_status);
	if (ret) {
1595
		isert_err("ib_check_mr_status failed, ret %d\n", ret);
1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617
		goto fail_mr_status;
	}

	if (mr_status.fail_status & IB_MR_CHECK_SIG_STATUS) {
		u64 sec_offset_err;
		u32 block_size = se_cmd->se_dev->dev_attrib.block_size + 8;

		switch (mr_status.sig_err.err_type) {
		case IB_SIG_BAD_GUARD:
			se_cmd->pi_err = TCM_LOGICAL_BLOCK_GUARD_CHECK_FAILED;
			break;
		case IB_SIG_BAD_REFTAG:
			se_cmd->pi_err = TCM_LOGICAL_BLOCK_REF_TAG_CHECK_FAILED;
			break;
		case IB_SIG_BAD_APPTAG:
			se_cmd->pi_err = TCM_LOGICAL_BLOCK_APP_TAG_CHECK_FAILED;
			break;
		}
		sec_offset_err = mr_status.sig_err.sig_err_offset;
		do_div(sec_offset_err, block_size);
		se_cmd->bad_sector = sec_offset_err + se_cmd->t_task_lba;

1618 1619 1620 1621 1622 1623
		isert_err("PI error found type %d at sector 0x%llx "
			  "expected 0x%x vs actual 0x%x\n",
			  mr_status.sig_err.err_type,
			  (unsigned long long)se_cmd->bad_sector,
			  mr_status.sig_err.expected,
			  mr_status.sig_err.actual);
1624 1625 1626 1627 1628 1629 1630
		ret = 1;
	}

fail_mr_status:
	return ret;
}

1631
static void
1632
isert_rdma_write_done(struct ib_cq *cq, struct ib_wc *wc)
1633
{
1634
	struct isert_conn *isert_conn = wc->qp->qp_context;
1635
	struct isert_device *device = isert_conn->device;
1636
	struct iser_tx_desc *desc = cqe_to_tx_desc(wc->wr_cqe);
1637
	struct isert_cmd *isert_cmd = tx_desc_to_cmd(desc);
1638
	struct se_cmd *cmd = &isert_cmd->iscsi_cmd->se_cmd;
1639 1640
	int ret = 0;

1641 1642 1643 1644 1645 1646 1647 1648 1649 1650
	if (unlikely(wc->status != IB_WC_SUCCESS)) {
		isert_print_wc(wc, "rdma write");
		if (wc->status != IB_WC_WR_FLUSH_ERR)
			iscsit_cause_connection_reinstatement(isert_conn->conn, 0);
		isert_completion_put(desc, isert_cmd, device->ib_device, true);
		return;
	}

	isert_dbg("Cmd %p\n", isert_cmd);

1651 1652
	ret = isert_check_pi_status(cmd, isert_cmd->rw.sig->sig_mr);
	isert_rdma_rw_ctx_destroy(isert_cmd, isert_conn);
1653

1654
	if (ret)
1655
		transport_send_check_condition_and_sense(cmd, cmd->pi_err, 0);
1656
	else
1657
		isert_put_response(isert_conn->conn, isert_cmd->iscsi_cmd);
1658 1659
}

1660
static void
1661
isert_rdma_read_done(struct ib_cq *cq, struct ib_wc *wc)
1662
{
1663 1664 1665
	struct isert_conn *isert_conn = wc->qp->qp_context;
	struct isert_device *device = isert_conn->device;
	struct iser_tx_desc *desc = cqe_to_tx_desc(wc->wr_cqe);
1666
	struct isert_cmd *isert_cmd = tx_desc_to_cmd(desc);
1667
	struct iscsi_cmd *cmd = isert_cmd->iscsi_cmd;
1668
	struct se_cmd *se_cmd = &cmd->se_cmd;
1669
	int ret = 0;
1670

1671 1672 1673 1674 1675 1676 1677 1678 1679 1680
	if (unlikely(wc->status != IB_WC_SUCCESS)) {
		isert_print_wc(wc, "rdma read");
		if (wc->status != IB_WC_WR_FLUSH_ERR)
			iscsit_cause_connection_reinstatement(isert_conn->conn, 0);
		isert_completion_put(desc, isert_cmd, device->ib_device, true);
		return;
	}

	isert_dbg("Cmd %p\n", isert_cmd);

1681
	iscsit_stop_dataout_timer(cmd);
1682 1683 1684 1685 1686

	if (isert_prot_cmd(isert_conn, se_cmd))
		ret = isert_check_pi_status(se_cmd, isert_cmd->rw.sig->sig_mr);
	isert_rdma_rw_ctx_destroy(isert_cmd, isert_conn);
	cmd->write_data_done = 0;
1687

1688
	isert_dbg("Cmd: %p RDMA_READ comp calling execute_cmd\n", isert_cmd);
1689 1690 1691 1692 1693
	spin_lock_bh(&cmd->istate_lock);
	cmd->cmd_flags |= ICF_GOT_LAST_DATAOUT;
	cmd->i_state = ISTATE_RECEIVED_LAST_DATAOUT;
	spin_unlock_bh(&cmd->istate_lock);

1694
	if (ret) {
1695
		target_put_sess_cmd(se_cmd);
1696 1697
		transport_send_check_condition_and_sense(se_cmd,
							 se_cmd->pi_err, 0);
1698
	} else {
1699
		target_execute_cmd(se_cmd);
1700
	}
1701 1702 1703 1704 1705 1706 1707 1708
}

static void
isert_do_control_comp(struct work_struct *work)
{
	struct isert_cmd *isert_cmd = container_of(work,
			struct isert_cmd, comp_work);
	struct isert_conn *isert_conn = isert_cmd->conn;
1709
	struct ib_device *ib_dev = isert_conn->cm_id->device;
1710
	struct iscsi_cmd *cmd = isert_cmd->iscsi_cmd;
1711

1712 1713
	isert_dbg("Cmd %p i_state %d\n", isert_cmd, cmd->i_state);

1714 1715 1716
	switch (cmd->i_state) {
	case ISTATE_SEND_TASKMGTRSP:
		iscsit_tmr_post_handler(cmd, cmd->conn);
1717 1718
	case ISTATE_SEND_REJECT:   /* FALLTHRU */
	case ISTATE_SEND_TEXTRSP:  /* FALLTHRU */
1719
		cmd->i_state = ISTATE_SENT_STATUS;
1720 1721
		isert_completion_put(&isert_cmd->tx_desc, isert_cmd,
				     ib_dev, false);
1722
		break;
1723 1724 1725 1726
	case ISTATE_SEND_LOGOUTRSP:
		iscsit_logout_post_handler(cmd, cmd->conn);
		break;
	default:
1727
		isert_err("Unknown i_state %d\n", cmd->i_state);
1728 1729 1730 1731 1732 1733
		dump_stack();
		break;
	}
}

static void
1734
isert_login_send_done(struct ib_cq *cq, struct ib_wc *wc)
1735
{
1736 1737 1738
	struct isert_conn *isert_conn = wc->qp->qp_context;
	struct ib_device *ib_dev = isert_conn->cm_id->device;
	struct iser_tx_desc *tx_desc = cqe_to_tx_desc(wc->wr_cqe);
1739

1740 1741 1742 1743
	if (unlikely(wc->status != IB_WC_SUCCESS)) {
		isert_print_wc(wc, "login send");
		if (wc->status != IB_WC_WR_FLUSH_ERR)
			iscsit_cause_connection_reinstatement(isert_conn->conn, 0);
1744
	}
1745

1746
	isert_unmap_tx_desc(tx_desc, ib_dev);
1747 1748 1749
}

static void
1750
isert_send_done(struct ib_cq *cq, struct ib_wc *wc)
1751
{
1752
	struct isert_conn *isert_conn = wc->qp->qp_context;
1753
	struct ib_device *ib_dev = isert_conn->cm_id->device;
1754
	struct iser_tx_desc *tx_desc = cqe_to_tx_desc(wc->wr_cqe);
1755
	struct isert_cmd *isert_cmd = tx_desc_to_cmd(tx_desc);
1756

1757 1758 1759 1760 1761
	if (unlikely(wc->status != IB_WC_SUCCESS)) {
		isert_print_wc(wc, "send");
		if (wc->status != IB_WC_WR_FLUSH_ERR)
			iscsit_cause_connection_reinstatement(isert_conn->conn, 0);
		isert_completion_put(tx_desc, isert_cmd, ib_dev, true);
1762 1763 1764
		return;
	}

1765
	isert_dbg("Cmd %p\n", isert_cmd);
1766

1767 1768 1769 1770 1771 1772 1773 1774 1775 1776
	switch (isert_cmd->iscsi_cmd->i_state) {
	case ISTATE_SEND_TASKMGTRSP:
	case ISTATE_SEND_LOGOUTRSP:
	case ISTATE_SEND_REJECT:
	case ISTATE_SEND_TEXTRSP:
		isert_unmap_tx_desc(tx_desc, ib_dev);

		INIT_WORK(&isert_cmd->comp_work, isert_do_control_comp);
		queue_work(isert_comp_wq, &isert_cmd->comp_work);
		return;
1777
	default:
1778 1779
		isert_cmd->iscsi_cmd->i_state = ISTATE_SENT_STATUS;
		isert_completion_put(tx_desc, isert_cmd, ib_dev, false);
1780 1781 1782 1783 1784 1785 1786 1787 1788 1789
		break;
	}
}

static int
isert_post_response(struct isert_conn *isert_conn, struct isert_cmd *isert_cmd)
{
	struct ib_send_wr *wr_failed;
	int ret;

1790 1791 1792 1793 1794 1795
	ret = isert_post_recv(isert_conn, isert_cmd->rx_desc);
	if (ret) {
		isert_err("ib_post_recv failed with %d\n", ret);
		return ret;
	}

1796
	ret = ib_post_send(isert_conn->qp, &isert_cmd->tx_desc.send_wr,
1797 1798
			   &wr_failed);
	if (ret) {
1799
		isert_err("ib_post_send failed with %d\n", ret);
1800 1801 1802 1803 1804 1805 1806 1807
		return ret;
	}
	return ret;
}

static int
isert_put_response(struct iscsi_conn *conn, struct iscsi_cmd *cmd)
{
1808
	struct isert_cmd *isert_cmd = iscsit_priv_cmd(cmd);
1809
	struct isert_conn *isert_conn = conn->context;
1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822
	struct ib_send_wr *send_wr = &isert_cmd->tx_desc.send_wr;
	struct iscsi_scsi_rsp *hdr = (struct iscsi_scsi_rsp *)
				&isert_cmd->tx_desc.iscsi_header;

	isert_create_send_desc(isert_conn, isert_cmd, &isert_cmd->tx_desc);
	iscsit_build_rsp_pdu(cmd, conn, true, hdr);
	isert_init_tx_hdrs(isert_conn, &isert_cmd->tx_desc);
	/*
	 * Attach SENSE DATA payload to iSCSI Response PDU
	 */
	if (cmd->se_cmd.sense_buffer &&
	    ((cmd->se_cmd.se_cmd_flags & SCF_TRANSPORT_TASK_SENSE) ||
	    (cmd->se_cmd.se_cmd_flags & SCF_EMULATED_TASK_SENSE))) {
1823
		struct isert_device *device = isert_conn->device;
1824
		struct ib_device *ib_dev = device->ib_device;
1825
		struct ib_sge *tx_dsg = &isert_cmd->tx_desc.tx_sg[1];
1826
		u32 padding, pdu_len;
1827 1828 1829 1830 1831 1832 1833

		put_unaligned_be16(cmd->se_cmd.scsi_sense_length,
				   cmd->sense_buffer);
		cmd->se_cmd.scsi_sense_length += sizeof(__be16);

		padding = -(cmd->se_cmd.scsi_sense_length) & 3;
		hton24(hdr->dlength, (u32)cmd->se_cmd.scsi_sense_length);
1834
		pdu_len = cmd->se_cmd.scsi_sense_length + padding;
1835

1836 1837
		isert_cmd->pdu_buf_dma = ib_dma_map_single(ib_dev,
				(void *)cmd->sense_buffer, pdu_len,
1838 1839
				DMA_TO_DEVICE);

1840 1841 1842
		isert_cmd->pdu_buf_len = pdu_len;
		tx_dsg->addr	= isert_cmd->pdu_buf_dma;
		tx_dsg->length	= pdu_len;
1843
		tx_dsg->lkey	= device->pd->local_dma_lkey;
1844 1845 1846
		isert_cmd->tx_desc.num_sge = 2;
	}

1847
	isert_init_send_wr(isert_conn, isert_cmd, send_wr);
1848

1849
	isert_dbg("Posting SCSI Response\n");
1850 1851 1852 1853

	return isert_post_response(isert_conn, isert_cmd);
}

1854 1855 1856 1857
static void
isert_aborted_task(struct iscsi_conn *conn, struct iscsi_cmd *cmd)
{
	struct isert_cmd *isert_cmd = iscsit_priv_cmd(cmd);
1858
	struct isert_conn *isert_conn = conn->context;
1859 1860 1861 1862 1863 1864 1865 1866

	spin_lock_bh(&conn->cmd_lock);
	if (!list_empty(&cmd->i_conn_node))
		list_del_init(&cmd->i_conn_node);
	spin_unlock_bh(&conn->cmd_lock);

	if (cmd->data_direction == DMA_TO_DEVICE)
		iscsit_stop_dataout_timer(cmd);
1867
	isert_rdma_rw_ctx_destroy(isert_cmd, isert_conn);
1868 1869
}

1870 1871 1872
static enum target_prot_op
isert_get_sup_prot_ops(struct iscsi_conn *conn)
{
1873
	struct isert_conn *isert_conn = conn->context;
1874
	struct isert_device *device = isert_conn->device;
1875

1876 1877
	if (conn->tpg->tpg_attrib.t10_pi) {
		if (device->pi_capable) {
1878
			isert_info("conn %p PI offload enabled\n", isert_conn);
1879 1880 1881 1882 1883
			isert_conn->pi_support = true;
			return TARGET_PROT_ALL;
		}
	}

1884
	isert_info("conn %p PI offload disabled\n", isert_conn);
1885
	isert_conn->pi_support = false;
1886 1887 1888 1889

	return TARGET_PROT_NORMAL;
}

1890 1891 1892 1893
static int
isert_put_nopin(struct iscsi_cmd *cmd, struct iscsi_conn *conn,
		bool nopout_response)
{
1894
	struct isert_cmd *isert_cmd = iscsit_priv_cmd(cmd);
1895
	struct isert_conn *isert_conn = conn->context;
1896 1897 1898 1899 1900 1901 1902
	struct ib_send_wr *send_wr = &isert_cmd->tx_desc.send_wr;

	isert_create_send_desc(isert_conn, isert_cmd, &isert_cmd->tx_desc);
	iscsit_build_nopin_rsp(cmd, conn, (struct iscsi_nopin *)
			       &isert_cmd->tx_desc.iscsi_header,
			       nopout_response);
	isert_init_tx_hdrs(isert_conn, &isert_cmd->tx_desc);
1903
	isert_init_send_wr(isert_conn, isert_cmd, send_wr);
1904

1905
	isert_dbg("conn %p Posting NOPIN Response\n", isert_conn);
1906 1907 1908 1909 1910 1911 1912

	return isert_post_response(isert_conn, isert_cmd);
}

static int
isert_put_logout_rsp(struct iscsi_cmd *cmd, struct iscsi_conn *conn)
{
1913
	struct isert_cmd *isert_cmd = iscsit_priv_cmd(cmd);
1914
	struct isert_conn *isert_conn = conn->context;
1915 1916 1917 1918 1919 1920
	struct ib_send_wr *send_wr = &isert_cmd->tx_desc.send_wr;

	isert_create_send_desc(isert_conn, isert_cmd, &isert_cmd->tx_desc);
	iscsit_build_logout_rsp(cmd, conn, (struct iscsi_logout_rsp *)
				&isert_cmd->tx_desc.iscsi_header);
	isert_init_tx_hdrs(isert_conn, &isert_cmd->tx_desc);
1921
	isert_init_send_wr(isert_conn, isert_cmd, send_wr);
1922

1923
	isert_dbg("conn %p Posting Logout Response\n", isert_conn);
1924 1925 1926 1927 1928 1929 1930

	return isert_post_response(isert_conn, isert_cmd);
}

static int
isert_put_tm_rsp(struct iscsi_cmd *cmd, struct iscsi_conn *conn)
{
1931
	struct isert_cmd *isert_cmd = iscsit_priv_cmd(cmd);
1932
	struct isert_conn *isert_conn = conn->context;
1933 1934 1935 1936 1937 1938
	struct ib_send_wr *send_wr = &isert_cmd->tx_desc.send_wr;

	isert_create_send_desc(isert_conn, isert_cmd, &isert_cmd->tx_desc);
	iscsit_build_task_mgt_rsp(cmd, conn, (struct iscsi_tm_rsp *)
				  &isert_cmd->tx_desc.iscsi_header);
	isert_init_tx_hdrs(isert_conn, &isert_cmd->tx_desc);
1939
	isert_init_send_wr(isert_conn, isert_cmd, send_wr);
1940

1941
	isert_dbg("conn %p Posting Task Management Response\n", isert_conn);
1942 1943 1944 1945 1946 1947 1948

	return isert_post_response(isert_conn, isert_cmd);
}

static int
isert_put_reject(struct iscsi_cmd *cmd, struct iscsi_conn *conn)
{
1949
	struct isert_cmd *isert_cmd = iscsit_priv_cmd(cmd);
1950
	struct isert_conn *isert_conn = conn->context;
1951
	struct ib_send_wr *send_wr = &isert_cmd->tx_desc.send_wr;
1952
	struct isert_device *device = isert_conn->device;
1953
	struct ib_device *ib_dev = device->ib_device;
1954 1955 1956
	struct ib_sge *tx_dsg = &isert_cmd->tx_desc.tx_sg[1];
	struct iscsi_reject *hdr =
		(struct iscsi_reject *)&isert_cmd->tx_desc.iscsi_header;
1957 1958

	isert_create_send_desc(isert_conn, isert_cmd, &isert_cmd->tx_desc);
1959
	iscsit_build_reject(cmd, conn, hdr);
1960
	isert_init_tx_hdrs(isert_conn, &isert_cmd->tx_desc);
1961 1962

	hton24(hdr->dlength, ISCSI_HDR_LEN);
1963
	isert_cmd->pdu_buf_dma = ib_dma_map_single(ib_dev,
1964 1965
			(void *)cmd->buf_ptr, ISCSI_HDR_LEN,
			DMA_TO_DEVICE);
1966 1967
	isert_cmd->pdu_buf_len = ISCSI_HDR_LEN;
	tx_dsg->addr	= isert_cmd->pdu_buf_dma;
1968
	tx_dsg->length	= ISCSI_HDR_LEN;
1969
	tx_dsg->lkey	= device->pd->local_dma_lkey;
1970 1971
	isert_cmd->tx_desc.num_sge = 2;

1972
	isert_init_send_wr(isert_conn, isert_cmd, send_wr);
1973

1974
	isert_dbg("conn %p Posting Reject\n", isert_conn);
1975 1976 1977 1978

	return isert_post_response(isert_conn, isert_cmd);
}

1979 1980 1981
static int
isert_put_text_rsp(struct iscsi_cmd *cmd, struct iscsi_conn *conn)
{
1982
	struct isert_cmd *isert_cmd = iscsit_priv_cmd(cmd);
1983
	struct isert_conn *isert_conn = conn->context;
1984 1985 1986 1987 1988 1989 1990
	struct ib_send_wr *send_wr = &isert_cmd->tx_desc.send_wr;
	struct iscsi_text_rsp *hdr =
		(struct iscsi_text_rsp *)&isert_cmd->tx_desc.iscsi_header;
	u32 txt_rsp_len;
	int rc;

	isert_create_send_desc(isert_conn, isert_cmd, &isert_cmd->tx_desc);
1991
	rc = iscsit_build_text_rsp(cmd, conn, hdr, ISCSI_INFINIBAND);
1992 1993 1994 1995 1996 1997 1998
	if (rc < 0)
		return rc;

	txt_rsp_len = rc;
	isert_init_tx_hdrs(isert_conn, &isert_cmd->tx_desc);

	if (txt_rsp_len) {
1999
		struct isert_device *device = isert_conn->device;
2000
		struct ib_device *ib_dev = device->ib_device;
2001 2002 2003 2004 2005 2006 2007 2008 2009
		struct ib_sge *tx_dsg = &isert_cmd->tx_desc.tx_sg[1];
		void *txt_rsp_buf = cmd->buf_ptr;

		isert_cmd->pdu_buf_dma = ib_dma_map_single(ib_dev,
				txt_rsp_buf, txt_rsp_len, DMA_TO_DEVICE);

		isert_cmd->pdu_buf_len = txt_rsp_len;
		tx_dsg->addr	= isert_cmd->pdu_buf_dma;
		tx_dsg->length	= txt_rsp_len;
2010
		tx_dsg->lkey	= device->pd->local_dma_lkey;
2011 2012
		isert_cmd->tx_desc.num_sge = 2;
	}
2013
	isert_init_send_wr(isert_conn, isert_cmd, send_wr);
2014

2015
	isert_dbg("conn %p Text Response\n", isert_conn);
2016 2017 2018 2019

	return isert_post_response(isert_conn, isert_cmd);
}

2020 2021 2022 2023
static inline void
isert_set_dif_domain(struct se_cmd *se_cmd, struct ib_sig_attrs *sig_attrs,
		     struct ib_sig_domain *domain)
{
2024
	domain->sig_type = IB_SIG_TYPE_T10_DIF;
2025 2026 2027
	domain->sig.dif.bg_type = IB_T10DIF_CRC;
	domain->sig.dif.pi_interval = se_cmd->se_dev->dev_attrib.block_size;
	domain->sig.dif.ref_tag = se_cmd->reftag_seed;
2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038
	/*
	 * At the moment we hard code those, but if in the future
	 * the target core would like to use it, we will take it
	 * from se_cmd.
	 */
	domain->sig.dif.apptag_check_mask = 0xffff;
	domain->sig.dif.app_escape = true;
	domain->sig.dif.ref_escape = true;
	if (se_cmd->prot_type == TARGET_DIF_TYPE1_PROT ||
	    se_cmd->prot_type == TARGET_DIF_TYPE2_PROT)
		domain->sig.dif.ref_remap = true;
2039 2040
};

2041 2042 2043
static int
isert_set_sig_attrs(struct se_cmd *se_cmd, struct ib_sig_attrs *sig_attrs)
{
2044 2045
	memset(sig_attrs, 0, sizeof(*sig_attrs));

2046 2047 2048
	switch (se_cmd->prot_op) {
	case TARGET_PROT_DIN_INSERT:
	case TARGET_PROT_DOUT_STRIP:
2049
		sig_attrs->mem.sig_type = IB_SIG_TYPE_NONE;
2050
		isert_set_dif_domain(se_cmd, sig_attrs, &sig_attrs->wire);
2051 2052 2053
		break;
	case TARGET_PROT_DOUT_INSERT:
	case TARGET_PROT_DIN_STRIP:
2054
		sig_attrs->wire.sig_type = IB_SIG_TYPE_NONE;
2055
		isert_set_dif_domain(se_cmd, sig_attrs, &sig_attrs->mem);
2056 2057 2058
		break;
	case TARGET_PROT_DIN_PASS:
	case TARGET_PROT_DOUT_PASS:
2059 2060
		isert_set_dif_domain(se_cmd, sig_attrs, &sig_attrs->wire);
		isert_set_dif_domain(se_cmd, sig_attrs, &sig_attrs->mem);
2061 2062
		break;
	default:
2063
		isert_err("Unsupported PI operation %d\n", se_cmd->prot_op);
2064 2065 2066
		return -EINVAL;
	}

2067 2068 2069 2070
	sig_attrs->check_mask =
	       (se_cmd->prot_checks & TARGET_DIF_CHECK_GUARD  ? 0xc0 : 0) |
	       (se_cmd->prot_checks & TARGET_DIF_CHECK_REFTAG ? 0x30 : 0) |
	       (se_cmd->prot_checks & TARGET_DIF_CHECK_REFTAG ? 0x0f : 0);
2071 2072 2073 2074
	return 0;
}

static int
2075 2076 2077 2078 2079 2080 2081 2082
isert_rdma_rw_ctx_post(struct isert_cmd *cmd, struct isert_conn *conn,
		struct ib_cqe *cqe, struct ib_send_wr *chain_wr)
{
	struct se_cmd *se_cmd = &cmd->iscsi_cmd->se_cmd;
	enum dma_data_direction dir = target_reverse_dma_direction(se_cmd);
	u8 port_num = conn->cm_id->port_num;
	u64 addr;
	u32 rkey, offset;
2083 2084
	int ret;

2085 2086 2087 2088
	if (dir == DMA_FROM_DEVICE) {
		addr = cmd->write_va;
		rkey = cmd->write_stag;
		offset = cmd->iscsi_cmd->write_data_done;
2089
	} else {
2090 2091 2092
		addr = cmd->read_va;
		rkey = cmd->read_stag;
		offset = 0;
2093
	}
2094

2095 2096
	if (isert_prot_cmd(conn, se_cmd)) {
		struct ib_sig_attrs sig_attrs;
2097

2098 2099 2100
		ret = isert_set_sig_attrs(se_cmd, &sig_attrs);
		if (ret)
			return ret;
2101

2102 2103 2104 2105 2106
		WARN_ON_ONCE(offset);
		ret = rdma_rw_ctx_signature_init(&cmd->rw, conn->qp, port_num,
				se_cmd->t_data_sg, se_cmd->t_data_nents,
				se_cmd->t_prot_sg, se_cmd->t_prot_nents,
				&sig_attrs, addr, rkey, dir);
2107
	} else {
2108 2109 2110
		ret = rdma_rw_ctx_init(&cmd->rw, conn->qp, port_num,
				se_cmd->t_data_sg, se_cmd->t_data_nents,
				offset, addr, rkey, dir);
2111
	}
2112 2113 2114
	if (ret < 0) {
		isert_err("Cmd: %p failed to prepare RDMA res\n", cmd);
		return ret;
2115 2116
	}

2117 2118 2119
	ret = rdma_rw_ctx_post(&cmd->rw, conn->qp, port_num, cqe, chain_wr);
	if (ret < 0)
		isert_err("Cmd: %p failed to post RDMA res\n", cmd);
2120 2121 2122
	return ret;
}

2123 2124 2125 2126
static int
isert_put_datain(struct iscsi_conn *conn, struct iscsi_cmd *cmd)
{
	struct se_cmd *se_cmd = &cmd->se_cmd;
2127
	struct isert_cmd *isert_cmd = iscsit_priv_cmd(cmd);
2128
	struct isert_conn *isert_conn = conn->context;
2129 2130
	struct ib_cqe *cqe = NULL;
	struct ib_send_wr *chain_wr = NULL;
2131 2132
	int rc;

2133
	isert_dbg("Cmd: %p RDMA_WRITE data_length: %u\n",
2134
		 isert_cmd, se_cmd->data_length);
2135

2136 2137 2138 2139
	if (isert_prot_cmd(isert_conn, se_cmd)) {
		isert_cmd->tx_desc.tx_cqe.done = isert_rdma_write_done;
		cqe = &isert_cmd->tx_desc.tx_cqe;
	} else {
2140 2141 2142 2143 2144 2145 2146 2147 2148
		/*
		 * Build isert_conn->tx_desc for iSCSI response PDU and attach
		 */
		isert_create_send_desc(isert_conn, isert_cmd,
				       &isert_cmd->tx_desc);
		iscsit_build_rsp_pdu(cmd, conn, true, (struct iscsi_scsi_rsp *)
				     &isert_cmd->tx_desc.iscsi_header);
		isert_init_tx_hdrs(isert_conn, &isert_cmd->tx_desc);
		isert_init_send_wr(isert_conn, isert_cmd,
2149
				   &isert_cmd->tx_desc.send_wr);
2150 2151 2152 2153 2154 2155

		rc = isert_post_recv(isert_conn, isert_cmd->rx_desc);
		if (rc) {
			isert_err("ib_post_recv failed with %d\n", rc);
			return rc;
		}
2156

2157 2158
		chain_wr = &isert_cmd->tx_desc.send_wr;
	}
2159

2160 2161
	isert_rdma_rw_ctx_post(isert_cmd, isert_conn, cqe, chain_wr);
	isert_dbg("Cmd: %p posted RDMA_WRITE for iSER Data READ\n", isert_cmd);
2162
	return 1;
2163 2164 2165 2166 2167
}

static int
isert_get_dataout(struct iscsi_conn *conn, struct iscsi_cmd *cmd, bool recovery)
{
2168
	struct isert_cmd *isert_cmd = iscsit_priv_cmd(cmd);
2169

2170
	isert_dbg("Cmd: %p RDMA_READ data_length: %u write_data_done: %u\n",
2171
		 isert_cmd, cmd->se_cmd.data_length, cmd->write_data_done);
2172

2173 2174 2175
	isert_cmd->tx_desc.tx_cqe.done = isert_rdma_read_done;
	isert_rdma_rw_ctx_post(isert_cmd, conn->context,
			&isert_cmd->tx_desc.tx_cqe, NULL);
2176

2177
	isert_dbg("Cmd: %p posted RDMA_READ memory for ISER Data WRITE\n",
2178 2179
		 isert_cmd);
	return 0;
2180 2181 2182 2183 2184
}

static int
isert_immediate_queue(struct iscsi_conn *conn, struct iscsi_cmd *cmd, int state)
{
2185 2186
	struct isert_cmd *isert_cmd = iscsit_priv_cmd(cmd);
	int ret = 0;
2187 2188

	switch (state) {
2189 2190 2191 2192 2193 2194
	case ISTATE_REMOVE:
		spin_lock_bh(&conn->cmd_lock);
		list_del_init(&cmd->i_conn_node);
		spin_unlock_bh(&conn->cmd_lock);
		isert_put_cmd(isert_cmd, true);
		break;
2195 2196 2197 2198
	case ISTATE_SEND_NOPIN_WANT_RESPONSE:
		ret = isert_put_nopin(cmd, conn, false);
		break;
	default:
2199
		isert_err("Unknown immediate state: 0x%02x\n", state);
2200 2201 2202 2203 2204 2205 2206 2207 2208 2209
		ret = -EINVAL;
		break;
	}

	return ret;
}

static int
isert_response_queue(struct iscsi_conn *conn, struct iscsi_cmd *cmd, int state)
{
S
Sagi Grimberg 已提交
2210
	struct isert_conn *isert_conn = conn->context;
2211 2212 2213 2214 2215
	int ret;

	switch (state) {
	case ISTATE_SEND_LOGOUTRSP:
		ret = isert_put_logout_rsp(cmd, conn);
S
Sagi Grimberg 已提交
2216 2217
		if (!ret)
			isert_conn->logout_posted = true;
2218 2219 2220 2221 2222 2223 2224 2225 2226 2227
		break;
	case ISTATE_SEND_NOPIN:
		ret = isert_put_nopin(cmd, conn, true);
		break;
	case ISTATE_SEND_TASKMGTRSP:
		ret = isert_put_tm_rsp(cmd, conn);
		break;
	case ISTATE_SEND_REJECT:
		ret = isert_put_reject(cmd, conn);
		break;
2228 2229 2230
	case ISTATE_SEND_TEXTRSP:
		ret = isert_put_text_rsp(cmd, conn);
		break;
2231 2232 2233 2234 2235 2236 2237 2238
	case ISTATE_SEND_STATUS:
		/*
		 * Special case for sending non GOOD SCSI status from TX thread
		 * context during pre se_cmd excecution failure.
		 */
		ret = isert_put_response(conn, cmd);
		break;
	default:
2239
		isert_err("Unknown response state: 0x%02x\n", state);
2240 2241 2242 2243 2244 2245 2246
		ret = -EINVAL;
		break;
	}

	return ret;
}

2247 2248 2249 2250 2251 2252 2253 2254 2255
struct rdma_cm_id *
isert_setup_id(struct isert_np *isert_np)
{
	struct iscsi_np *np = isert_np->np;
	struct rdma_cm_id *id;
	struct sockaddr *sa;
	int ret;

	sa = (struct sockaddr *)&np->np_sockaddr;
2256
	isert_dbg("ksockaddr: %p, sa: %p\n", &np->np_sockaddr, sa);
2257

2258
	id = rdma_create_id(&init_net, isert_cma_handler, isert_np,
2259 2260
			    RDMA_PS_TCP, IB_QPT_RC);
	if (IS_ERR(id)) {
2261
		isert_err("rdma_create_id() failed: %ld\n", PTR_ERR(id));
2262 2263 2264
		ret = PTR_ERR(id);
		goto out;
	}
2265
	isert_dbg("id %p context %p\n", id, id->context);
2266 2267 2268

	ret = rdma_bind_addr(id, sa);
	if (ret) {
2269
		isert_err("rdma_bind_addr() failed: %d\n", ret);
2270 2271 2272
		goto out_id;
	}

2273
	ret = rdma_listen(id, 0);
2274
	if (ret) {
2275
		isert_err("rdma_listen() failed: %d\n", ret);
2276 2277 2278 2279 2280 2281 2282 2283 2284 2285
		goto out_id;
	}

	return id;
out_id:
	rdma_destroy_id(id);
out:
	return ERR_PTR(ret);
}

2286 2287
static int
isert_setup_np(struct iscsi_np *np,
2288
	       struct sockaddr_storage *ksockaddr)
2289 2290 2291 2292 2293 2294 2295
{
	struct isert_np *isert_np;
	struct rdma_cm_id *isert_lid;
	int ret;

	isert_np = kzalloc(sizeof(struct isert_np), GFP_KERNEL);
	if (!isert_np) {
2296
		isert_err("Unable to allocate struct isert_np\n");
2297 2298
		return -ENOMEM;
	}
2299 2300
	sema_init(&isert_np->sem, 0);
	mutex_init(&isert_np->mutex);
2301 2302
	INIT_LIST_HEAD(&isert_np->accepted);
	INIT_LIST_HEAD(&isert_np->pending);
2303
	isert_np->np = np;
2304 2305 2306 2307 2308 2309

	/*
	 * Setup the np->np_sockaddr from the passed sockaddr setup
	 * in iscsi_target_configfs.c code..
	 */
	memcpy(&np->np_sockaddr, ksockaddr,
2310
	       sizeof(struct sockaddr_storage));
2311

2312
	isert_lid = isert_setup_id(isert_np);
2313 2314 2315 2316 2317
	if (IS_ERR(isert_lid)) {
		ret = PTR_ERR(isert_lid);
		goto out;
	}

2318
	isert_np->cm_id = isert_lid;
2319 2320 2321 2322 2323 2324
	np->np_context = isert_np;

	return 0;

out:
	kfree(isert_np);
2325

2326 2327 2328 2329 2330 2331
	return ret;
}

static int
isert_rdma_accept(struct isert_conn *isert_conn)
{
2332
	struct rdma_cm_id *cm_id = isert_conn->cm_id;
2333 2334
	struct rdma_conn_param cp;
	int ret;
2335
	struct iser_cm_hdr rsp_hdr;
2336 2337 2338 2339 2340 2341

	memset(&cp, 0, sizeof(struct rdma_conn_param));
	cp.initiator_depth = isert_conn->initiator_depth;
	cp.retry_count = 7;
	cp.rnr_retry_count = 7;

2342
	memset(&rsp_hdr, 0, sizeof(rsp_hdr));
2343 2344 2345
	rsp_hdr.flags = ISERT_ZBVA_NOT_USED;
	if (!isert_conn->snd_w_inv)
		rsp_hdr.flags = rsp_hdr.flags | ISERT_SEND_W_INV_NOT_USED;
2346 2347 2348
	cp.private_data = (void *)&rsp_hdr;
	cp.private_data_len = sizeof(rsp_hdr);

2349 2350
	ret = rdma_accept(cm_id, &cp);
	if (ret) {
2351
		isert_err("rdma_accept() failed with: %d\n", ret);
2352 2353 2354 2355 2356 2357 2358 2359 2360
		return ret;
	}

	return 0;
}

static int
isert_get_login_rx(struct iscsi_conn *conn, struct iscsi_login *login)
{
2361
	struct isert_conn *isert_conn = conn->context;
2362 2363
	int ret;

2364
	isert_info("before login_req comp conn: %p\n", isert_conn);
2365 2366
	ret = wait_for_completion_interruptible(&isert_conn->login_req_comp);
	if (ret) {
2367
		isert_err("isert_conn %p interrupted before got login req\n",
2368 2369 2370 2371 2372
			  isert_conn);
		return ret;
	}
	reinit_completion(&isert_conn->login_req_comp);

2373 2374 2375 2376 2377 2378 2379 2380
	/*
	 * For login requests after the first PDU, isert_rx_login_req() will
	 * kick schedule_delayed_work(&conn->login_work) as the packet is
	 * received, which turns this callback from iscsi_target_do_login_rx()
	 * into a NOP.
	 */
	if (!login->first_request)
		return 0;
2381

2382 2383
	isert_rx_login_req(isert_conn);

2384 2385
	isert_info("before login_comp conn: %p\n", conn);
	ret = wait_for_completion_interruptible(&isert_conn->login_comp);
2386 2387 2388
	if (ret)
		return ret;

2389
	isert_info("processing login->req: %p\n", login->req);
2390

2391 2392 2393 2394 2395 2396 2397
	return 0;
}

static void
isert_set_conn_info(struct iscsi_np *np, struct iscsi_conn *conn,
		    struct isert_conn *isert_conn)
{
2398
	struct rdma_cm_id *cm_id = isert_conn->cm_id;
2399 2400 2401 2402
	struct rdma_route *cm_route = &cm_id->route;

	conn->login_family = np->np_sockaddr.ss_family;

2403 2404
	conn->login_sockaddr = cm_route->addr.dst_addr;
	conn->local_sockaddr = cm_route->addr.src_addr;
2405 2406 2407 2408 2409
}

static int
isert_accept_np(struct iscsi_np *np, struct iscsi_conn *conn)
{
2410
	struct isert_np *isert_np = np->np_context;
2411
	struct isert_conn *isert_conn;
2412
	int ret;
2413 2414

accept_wait:
2415
	ret = down_interruptible(&isert_np->sem);
2416
	if (ret)
2417 2418 2419
		return -ENODEV;

	spin_lock_bh(&np->np_thread_lock);
2420
	if (np->np_thread_state >= ISCSI_NP_THREAD_RESET) {
2421
		spin_unlock_bh(&np->np_thread_lock);
2422
		isert_dbg("np_thread_state %d\n",
2423 2424 2425 2426 2427
			 np->np_thread_state);
		/**
		 * No point in stalling here when np_thread
		 * is in state RESET/SHUTDOWN/EXIT - bail
		 **/
2428 2429 2430 2431
		return -ENODEV;
	}
	spin_unlock_bh(&np->np_thread_lock);

2432
	mutex_lock(&isert_np->mutex);
2433
	if (list_empty(&isert_np->pending)) {
2434
		mutex_unlock(&isert_np->mutex);
2435 2436
		goto accept_wait;
	}
2437 2438 2439
	isert_conn = list_first_entry(&isert_np->pending,
			struct isert_conn, node);
	list_del_init(&isert_conn->node);
2440
	mutex_unlock(&isert_np->mutex);
2441 2442 2443

	conn->context = isert_conn;
	isert_conn->conn = conn;
2444
	isert_conn->state = ISER_CONN_BOUND;
2445 2446 2447

	isert_set_conn_info(np, conn, isert_conn);

2448
	isert_dbg("Processing isert_conn: %p\n", isert_conn);
2449

2450 2451 2452 2453 2454 2455
	return 0;
}

static void
isert_free_np(struct iscsi_np *np)
{
2456
	struct isert_np *isert_np = np->np_context;
2457
	struct isert_conn *isert_conn, *n;
2458

2459 2460
	if (isert_np->cm_id)
		rdma_destroy_id(isert_np->cm_id);
2461

2462 2463 2464 2465 2466
	/*
	 * FIXME: At this point we don't have a good way to insure
	 * that at this point we don't have hanging connections that
	 * completed RDMA establishment but didn't start iscsi login
	 * process. So work-around this by cleaning up what ever piled
2467
	 * up in accepted and pending lists.
2468
	 */
2469
	mutex_lock(&isert_np->mutex);
2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482
	if (!list_empty(&isert_np->pending)) {
		isert_info("Still have isert pending connections\n");
		list_for_each_entry_safe(isert_conn, n,
					 &isert_np->pending,
					 node) {
			isert_info("cleaning isert_conn %p state (%d)\n",
				   isert_conn, isert_conn->state);
			isert_connect_release(isert_conn);
		}
	}

	if (!list_empty(&isert_np->accepted)) {
		isert_info("Still have isert accepted connections\n");
2483
		list_for_each_entry_safe(isert_conn, n,
2484 2485
					 &isert_np->accepted,
					 node) {
2486
			isert_info("cleaning isert_conn %p state (%d)\n",
2487 2488 2489 2490
				   isert_conn, isert_conn->state);
			isert_connect_release(isert_conn);
		}
	}
2491
	mutex_unlock(&isert_np->mutex);
2492

2493 2494 2495 2496
	np->np_context = NULL;
	kfree(isert_np);
}

2497 2498 2499 2500 2501 2502
static void isert_release_work(struct work_struct *work)
{
	struct isert_conn *isert_conn = container_of(work,
						     struct isert_conn,
						     release_work);

2503
	isert_info("Starting release conn %p\n", isert_conn);
2504

2505
	mutex_lock(&isert_conn->mutex);
2506
	isert_conn->state = ISER_CONN_DOWN;
2507
	mutex_unlock(&isert_conn->mutex);
2508

2509
	isert_info("Destroying conn %p\n", isert_conn);
2510 2511 2512
	isert_put_conn(isert_conn);
}

S
Sagi Grimberg 已提交
2513 2514 2515 2516 2517
static void
isert_wait4logout(struct isert_conn *isert_conn)
{
	struct iscsi_conn *conn = isert_conn->conn;

2518 2519
	isert_info("conn %p\n", isert_conn);

S
Sagi Grimberg 已提交
2520
	if (isert_conn->logout_posted) {
2521
		isert_info("conn %p wait for conn_logout_comp\n", isert_conn);
S
Sagi Grimberg 已提交
2522 2523 2524 2525 2526
		wait_for_completion_timeout(&conn->conn_logout_comp,
					    SECONDS_FOR_LOGOUT_COMP * HZ);
	}
}

2527 2528 2529
static void
isert_wait4cmds(struct iscsi_conn *conn)
{
2530 2531
	isert_info("iscsi_conn %p\n", conn);

2532 2533 2534 2535 2536 2537
	if (conn->sess) {
		target_sess_cmd_list_set_waiting(conn->sess->se_sess);
		target_wait_for_sess_cmds(conn->sess->se_sess);
	}
}

2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572
/**
 * isert_put_unsol_pending_cmds() - Drop commands waiting for
 *     unsolicitate dataout
 * @conn:    iscsi connection
 *
 * We might still have commands that are waiting for unsolicited
 * dataouts messages. We must put the extra reference on those
 * before blocking on the target_wait_for_session_cmds
 */
static void
isert_put_unsol_pending_cmds(struct iscsi_conn *conn)
{
	struct iscsi_cmd *cmd, *tmp;
	static LIST_HEAD(drop_cmd_list);

	spin_lock_bh(&conn->cmd_lock);
	list_for_each_entry_safe(cmd, tmp, &conn->conn_cmd_list, i_conn_node) {
		if ((cmd->cmd_flags & ICF_NON_IMMEDIATE_UNSOLICITED_DATA) &&
		    (cmd->write_data_done < conn->sess->sess_ops->FirstBurstLength) &&
		    (cmd->write_data_done < cmd->se_cmd.data_length))
			list_move_tail(&cmd->i_conn_node, &drop_cmd_list);
	}
	spin_unlock_bh(&conn->cmd_lock);

	list_for_each_entry_safe(cmd, tmp, &drop_cmd_list, i_conn_node) {
		list_del_init(&cmd->i_conn_node);
		if (cmd->i_state != ISTATE_REMOVE) {
			struct isert_cmd *isert_cmd = iscsit_priv_cmd(cmd);

			isert_info("conn %p dropping cmd %p\n", conn, cmd);
			isert_put_cmd(isert_cmd, true);
		}
	}
}

2573
static void isert_wait_conn(struct iscsi_conn *conn)
2574 2575 2576
{
	struct isert_conn *isert_conn = conn->context;

2577
	isert_info("Starting conn %p\n", isert_conn);
2578

2579
	mutex_lock(&isert_conn->mutex);
2580
	isert_conn_terminate(isert_conn);
2581
	mutex_unlock(&isert_conn->mutex);
2582

S
Sagi Grimberg 已提交
2583
	ib_drain_qp(isert_conn->qp);
2584 2585
	isert_put_unsol_pending_cmds(conn);
	isert_wait4cmds(conn);
S
Sagi Grimberg 已提交
2586
	isert_wait4logout(isert_conn);
2587

2588
	queue_work(isert_release_wq, &isert_conn->release_work);
2589 2590 2591 2592 2593
}

static void isert_free_conn(struct iscsi_conn *conn)
{
	struct isert_conn *isert_conn = conn->context;
2594

S
Sagi Grimberg 已提交
2595
	ib_drain_qp(isert_conn->qp);
2596 2597 2598 2599 2600 2601
	isert_put_conn(isert_conn);
}

static struct iscsit_transport iser_target_transport = {
	.name			= "IB/iSER",
	.transport_type		= ISCSI_INFINIBAND,
2602
	.priv_size		= sizeof(struct isert_cmd),
2603 2604 2605 2606
	.owner			= THIS_MODULE,
	.iscsit_setup_np	= isert_setup_np,
	.iscsit_accept_np	= isert_accept_np,
	.iscsit_free_np		= isert_free_np,
2607
	.iscsit_wait_conn	= isert_wait_conn,
2608 2609 2610 2611 2612 2613 2614 2615
	.iscsit_free_conn	= isert_free_conn,
	.iscsit_get_login_rx	= isert_get_login_rx,
	.iscsit_put_login_tx	= isert_put_login_tx,
	.iscsit_immediate_queue	= isert_immediate_queue,
	.iscsit_response_queue	= isert_response_queue,
	.iscsit_get_dataout	= isert_get_dataout,
	.iscsit_queue_data_in	= isert_put_datain,
	.iscsit_queue_status	= isert_put_response,
2616
	.iscsit_aborted_task	= isert_aborted_task,
2617
	.iscsit_get_sup_prot_ops = isert_get_sup_prot_ops,
2618 2619 2620 2621 2622 2623
};

static int __init isert_init(void)
{
	int ret;

2624 2625
	isert_comp_wq = alloc_workqueue("isert_comp_wq",
					WQ_UNBOUND | WQ_HIGHPRI, 0);
2626
	if (!isert_comp_wq) {
2627
		isert_err("Unable to allocate isert_comp_wq\n");
2628
		ret = -ENOMEM;
2629
		return -ENOMEM;
2630 2631
	}

2632 2633 2634
	isert_release_wq = alloc_workqueue("isert_release_wq", WQ_UNBOUND,
					WQ_UNBOUND_MAX_ACTIVE);
	if (!isert_release_wq) {
2635
		isert_err("Unable to allocate isert_release_wq\n");
2636 2637 2638 2639
		ret = -ENOMEM;
		goto destroy_comp_wq;
	}

2640
	iscsit_register_transport(&iser_target_transport);
2641
	isert_info("iSER_TARGET[0] - Loaded iser_target_transport\n");
2642

2643 2644
	return 0;

2645 2646
destroy_comp_wq:
	destroy_workqueue(isert_comp_wq);
2647

2648 2649 2650 2651 2652
	return ret;
}

static void __exit isert_exit(void)
{
2653
	flush_scheduled_work();
2654
	destroy_workqueue(isert_release_wq);
2655 2656
	destroy_workqueue(isert_comp_wq);
	iscsit_unregister_transport(&iser_target_transport);
2657
	isert_info("iSER_TARGET[0] - Released iser_target_transport\n");
2658 2659 2660
}

MODULE_DESCRIPTION("iSER-Target for mainline target infrastructure");
S
Sagi Grimberg 已提交
2661
MODULE_VERSION("1.0");
2662 2663 2664 2665 2666
MODULE_AUTHOR("nab@Linux-iSCSI.org");
MODULE_LICENSE("GPL");

module_init(isert_init);
module_exit(isert_exit);