brintos

brintos / linux-shallow public Read only

0
0
Text · 24.7 KiB · 6801b70 Raw
953 lines · c
1/*2 * Copyright (c) 2004, 2005, 2006 Voltaire, Inc. All rights reserved.3 * Copyright (c) 2005, 2006 Cisco Systems.  All rights reserved.4 * Copyright (c) 2013-2014 Mellanox Technologies. All rights reserved.5 *6 * This software is available to you under a choice of one of two7 * licenses.  You may choose to be licensed under the terms of the GNU8 * General Public License (GPL) Version 2, available from the file9 * COPYING in the main directory of this source tree, or the10 * OpenIB.org BSD license below:11 *12 *     Redistribution and use in source and binary forms, with or13 *     without modification, are permitted provided that the following14 *     conditions are met:15 *16 *	- Redistributions of source code must retain the above17 *	  copyright notice, this list of conditions and the following18 *	  disclaimer.19 *20 *	- Redistributions in binary form must reproduce the above21 *	  copyright notice, this list of conditions and the following22 *	  disclaimer in the documentation and/or other materials23 *	  provided with the distribution.24 *25 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,26 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF27 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND28 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS29 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN30 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN31 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE32 * SOFTWARE.33 */34#include <linux/kernel.h>35#include <linux/slab.h>36#include <linux/delay.h>37 38#include "iscsi_iser.h"39 40static void iser_qp_event_callback(struct ib_event *cause, void *context)41{42	iser_err("qp event %s (%d)\n",43		 ib_event_msg(cause->event), cause->event);44}45 46static void iser_event_handler(struct ib_event_handler *handler,47				struct ib_event *event)48{49	iser_err("async event %s (%d) on device %s port %d\n",50		 ib_event_msg(event->event), event->event,51		dev_name(&event->device->dev), event->element.port_num);52}53 54/*55 * iser_create_device_ib_res - creates Protection Domain (PD), Completion56 * Queue (CQ), DMA Memory Region (DMA MR) with the device associated with57 * the adaptor.58 *59 * Return: 0 on success, -1 on failure60 */61static int iser_create_device_ib_res(struct iser_device *device)62{63	struct ib_device *ib_dev = device->ib_device;64 65	if (!(ib_dev->attrs.device_cap_flags & IB_DEVICE_MEM_MGT_EXTENSIONS)) {66		iser_err("IB device does not support memory registrations\n");67		return -1;68	}69 70	device->pd = ib_alloc_pd(ib_dev,71		iser_always_reg ? 0 : IB_PD_UNSAFE_GLOBAL_RKEY);72	if (IS_ERR(device->pd))73		goto pd_err;74 75	INIT_IB_EVENT_HANDLER(&device->event_handler, ib_dev,76			      iser_event_handler);77	ib_register_event_handler(&device->event_handler);78	return 0;79 80pd_err:81	iser_err("failed to allocate an IB resource\n");82	return -1;83}84 85/*86 * iser_free_device_ib_res - destroy/dealloc/dereg the DMA MR,87 * CQ and PD created with the device associated with the adaptor.88 */89static void iser_free_device_ib_res(struct iser_device *device)90{91	ib_unregister_event_handler(&device->event_handler);92	ib_dealloc_pd(device->pd);93 94	device->pd = NULL;95}96 97static struct iser_fr_desc *98iser_create_fastreg_desc(struct iser_device *device,99			 struct ib_pd *pd,100			 bool pi_enable,101			 unsigned int size)102{103	struct iser_fr_desc *desc;104	struct ib_device *ib_dev = device->ib_device;105	enum ib_mr_type mr_type;106	int ret;107 108	desc = kzalloc(sizeof(*desc), GFP_KERNEL);109	if (!desc)110		return ERR_PTR(-ENOMEM);111 112	if (ib_dev->attrs.kernel_cap_flags & IBK_SG_GAPS_REG)113		mr_type = IB_MR_TYPE_SG_GAPS;114	else115		mr_type = IB_MR_TYPE_MEM_REG;116 117	desc->rsc.mr = ib_alloc_mr(pd, mr_type, size);118	if (IS_ERR(desc->rsc.mr)) {119		ret = PTR_ERR(desc->rsc.mr);120		iser_err("Failed to allocate ib_fast_reg_mr err=%d\n", ret);121		goto err_alloc_mr;122	}123 124	if (pi_enable) {125		desc->rsc.sig_mr = ib_alloc_mr_integrity(pd, size, size);126		if (IS_ERR(desc->rsc.sig_mr)) {127			ret = PTR_ERR(desc->rsc.sig_mr);128			iser_err("Failed to allocate sig_mr err=%d\n", ret);129			goto err_alloc_mr_integrity;130		}131	}132 133	return desc;134 135err_alloc_mr_integrity:136	ib_dereg_mr(desc->rsc.mr);137err_alloc_mr:138	kfree(desc);139 140	return ERR_PTR(ret);141}142 143static void iser_destroy_fastreg_desc(struct iser_fr_desc *desc)144{145	struct iser_reg_resources *res = &desc->rsc;146 147	ib_dereg_mr(res->mr);148	if (res->sig_mr) {149		ib_dereg_mr(res->sig_mr);150		res->sig_mr = NULL;151	}152	kfree(desc);153}154 155/**156 * iser_alloc_fastreg_pool - Creates pool of fast_reg descriptors157 * for fast registration work requests.158 * @ib_conn: connection RDMA resources159 * @cmds_max: max number of SCSI commands for this connection160 * @size: max number of pages per map request161 *162 * Return: 0 on success, or errno code on failure163 */164int iser_alloc_fastreg_pool(struct ib_conn *ib_conn,165			    unsigned cmds_max,166			    unsigned int size)167{168	struct iser_device *device = ib_conn->device;169	struct iser_fr_pool *fr_pool = &ib_conn->fr_pool;170	struct iser_fr_desc *desc;171	int i, ret;172 173	INIT_LIST_HEAD(&fr_pool->list);174	INIT_LIST_HEAD(&fr_pool->all_list);175	spin_lock_init(&fr_pool->lock);176	fr_pool->size = 0;177	for (i = 0; i < cmds_max; i++) {178		desc = iser_create_fastreg_desc(device, device->pd,179						ib_conn->pi_support, size);180		if (IS_ERR(desc)) {181			ret = PTR_ERR(desc);182			goto err;183		}184 185		list_add_tail(&desc->list, &fr_pool->list);186		list_add_tail(&desc->all_list, &fr_pool->all_list);187		fr_pool->size++;188	}189 190	return 0;191 192err:193	iser_free_fastreg_pool(ib_conn);194	return ret;195}196 197/**198 * iser_free_fastreg_pool - releases the pool of fast_reg descriptors199 * @ib_conn: connection RDMA resources200 */201void iser_free_fastreg_pool(struct ib_conn *ib_conn)202{203	struct iser_fr_pool *fr_pool = &ib_conn->fr_pool;204	struct iser_fr_desc *desc, *tmp;205	int i = 0;206 207	if (list_empty(&fr_pool->all_list))208		return;209 210	iser_info("freeing conn %p fr pool\n", ib_conn);211 212	list_for_each_entry_safe(desc, tmp, &fr_pool->all_list, all_list) {213		list_del(&desc->all_list);214		iser_destroy_fastreg_desc(desc);215		++i;216	}217 218	if (i < fr_pool->size)219		iser_warn("pool still has %d regions registered\n",220			  fr_pool->size - i);221}222 223/*224 * iser_create_ib_conn_res - Queue-Pair (QP)225 *226 * Return: 0 on success, -1 on failure227 */228static int iser_create_ib_conn_res(struct ib_conn *ib_conn)229{230	struct iser_conn *iser_conn = to_iser_conn(ib_conn);231	struct iser_device	*device;232	struct ib_device	*ib_dev;233	struct ib_qp_init_attr	init_attr;234	int			ret = -ENOMEM;235	unsigned int max_send_wr, cq_size;236 237	BUG_ON(ib_conn->device == NULL);238 239	device = ib_conn->device;240	ib_dev = device->ib_device;241 242	/* +1 for drain */243	if (ib_conn->pi_support)244		max_send_wr = ISER_QP_SIG_MAX_REQ_DTOS + 1;245	else246		max_send_wr = ISER_QP_MAX_REQ_DTOS + 1;247	max_send_wr = min_t(unsigned int, max_send_wr,248			    (unsigned int)ib_dev->attrs.max_qp_wr);249 250	cq_size = max_send_wr + ISER_QP_MAX_RECV_DTOS;251	ib_conn->cq = ib_cq_pool_get(ib_dev, cq_size, -1, IB_POLL_SOFTIRQ);252	if (IS_ERR(ib_conn->cq)) {253		ret = PTR_ERR(ib_conn->cq);254		goto cq_err;255	}256	ib_conn->cq_size = cq_size;257 258	memset(&init_attr, 0, sizeof(init_attr));259 260	init_attr.event_handler = iser_qp_event_callback;261	init_attr.qp_context = (void *)ib_conn;262	init_attr.send_cq = ib_conn->cq;263	init_attr.recv_cq = ib_conn->cq;264	/* +1 for drain */265	init_attr.cap.max_recv_wr = ISER_QP_MAX_RECV_DTOS + 1;266	init_attr.cap.max_send_sge = 2;267	init_attr.cap.max_recv_sge = 1;268	init_attr.sq_sig_type = IB_SIGNAL_REQ_WR;269	init_attr.qp_type = IB_QPT_RC;270	init_attr.cap.max_send_wr = max_send_wr;271	if (ib_conn->pi_support)272		init_attr.create_flags |= IB_QP_CREATE_INTEGRITY_EN;273	iser_conn->max_cmds = ISER_GET_MAX_XMIT_CMDS(max_send_wr - 1);274 275	ret = rdma_create_qp(ib_conn->cma_id, device->pd, &init_attr);276	if (ret)277		goto out_err;278 279	ib_conn->qp = ib_conn->cma_id->qp;280	iser_info("setting conn %p cma_id %p qp %p max_send_wr %d\n", ib_conn,281		  ib_conn->cma_id, ib_conn->cma_id->qp, max_send_wr);282	return ret;283 284out_err:285	ib_cq_pool_put(ib_conn->cq, ib_conn->cq_size);286cq_err:287	iser_err("unable to alloc mem or create resource, err %d\n", ret);288 289	return ret;290}291 292/*293 * based on the resolved device node GUID see if there already allocated294 * device for this device. If there's no such, create one.295 */296static297struct iser_device *iser_device_find_by_ib_device(struct rdma_cm_id *cma_id)298{299	struct iser_device *device;300 301	mutex_lock(&ig.device_list_mutex);302 303	list_for_each_entry(device, &ig.device_list, ig_list)304		/* find if there's a match using the node GUID */305		if (device->ib_device->node_guid == cma_id->device->node_guid)306			goto inc_refcnt;307 308	device = kzalloc(sizeof *device, GFP_KERNEL);309	if (!device)310		goto out;311 312	/* assign this device to the device */313	device->ib_device = cma_id->device;314	/* init the device and link it into ig device list */315	if (iser_create_device_ib_res(device)) {316		kfree(device);317		device = NULL;318		goto out;319	}320	list_add(&device->ig_list, &ig.device_list);321 322inc_refcnt:323	device->refcount++;324out:325	mutex_unlock(&ig.device_list_mutex);326	return device;327}328 329/* if there's no demand for this device, release it */330static void iser_device_try_release(struct iser_device *device)331{332	mutex_lock(&ig.device_list_mutex);333	device->refcount--;334	iser_info("device %p refcount %d\n", device, device->refcount);335	if (!device->refcount) {336		iser_free_device_ib_res(device);337		list_del(&device->ig_list);338		kfree(device);339	}340	mutex_unlock(&ig.device_list_mutex);341}342 343void iser_release_work(struct work_struct *work)344{345	struct iser_conn *iser_conn;346 347	iser_conn = container_of(work, struct iser_conn, release_work);348 349	/* Wait for conn_stop to complete */350	wait_for_completion(&iser_conn->stop_completion);351	/* Wait for IB resouces cleanup to complete */352	wait_for_completion(&iser_conn->ib_completion);353 354	mutex_lock(&iser_conn->state_mutex);355	iser_conn->state = ISER_CONN_DOWN;356	mutex_unlock(&iser_conn->state_mutex);357 358	iser_conn_release(iser_conn);359}360 361/**362 * iser_free_ib_conn_res - release IB related resources363 * @iser_conn: iser connection struct364 * @destroy: indicator if we need to try to release the365 *     iser device and memory regoins pool (only iscsi366 *     shutdown and DEVICE_REMOVAL will use this).367 *368 * This routine is called with the iser state mutex held369 * so the cm_id removal is out of here. It is Safe to370 * be invoked multiple times.371 */372static void iser_free_ib_conn_res(struct iser_conn *iser_conn, bool destroy)373{374	struct ib_conn *ib_conn = &iser_conn->ib_conn;375	struct iser_device *device = ib_conn->device;376 377	iser_info("freeing conn %p cma_id %p qp %p\n",378		  iser_conn, ib_conn->cma_id, ib_conn->qp);379 380	if (ib_conn->qp) {381		rdma_destroy_qp(ib_conn->cma_id);382		ib_cq_pool_put(ib_conn->cq, ib_conn->cq_size);383		ib_conn->qp = NULL;384	}385 386	if (destroy) {387		if (iser_conn->rx_descs)388			iser_free_rx_descriptors(iser_conn);389 390		if (device) {391			iser_device_try_release(device);392			ib_conn->device = NULL;393		}394	}395}396 397/**398 * iser_conn_release - Frees all conn objects and deallocs conn descriptor399 * @iser_conn: iSER connection context400 */401void iser_conn_release(struct iser_conn *iser_conn)402{403	struct ib_conn *ib_conn = &iser_conn->ib_conn;404 405	mutex_lock(&ig.connlist_mutex);406	list_del(&iser_conn->conn_list);407	mutex_unlock(&ig.connlist_mutex);408 409	mutex_lock(&iser_conn->state_mutex);410	/* In case we endup here without ep_disconnect being invoked. */411	if (iser_conn->state != ISER_CONN_DOWN) {412		iser_warn("iser conn %p state %d, expected state down.\n",413			  iser_conn, iser_conn->state);414		iscsi_destroy_endpoint(iser_conn->ep);415		iser_conn->state = ISER_CONN_DOWN;416	}417	/*418	 * In case we never got to bind stage, we still need to419	 * release IB resources (which is safe to call more than once).420	 */421	iser_free_ib_conn_res(iser_conn, true);422	mutex_unlock(&iser_conn->state_mutex);423 424	if (ib_conn->cma_id) {425		rdma_destroy_id(ib_conn->cma_id);426		ib_conn->cma_id = NULL;427	}428 429	kfree(iser_conn);430}431 432/**433 * iser_conn_terminate - triggers start of the disconnect procedures and434 * waits for them to be done435 * @iser_conn: iSER connection context436 *437 * Called with state mutex held438 */439int iser_conn_terminate(struct iser_conn *iser_conn)440{441	struct ib_conn *ib_conn = &iser_conn->ib_conn;442	int err = 0;443 444	lockdep_assert_held(&iser_conn->state_mutex);445 446	/* terminate the iser conn only if the conn state is UP */447	if (iser_conn->state != ISER_CONN_UP)448		return 0;449 450	iser_conn->state = ISER_CONN_TERMINATING;451	iser_info("iser_conn %p state %d\n", iser_conn, iser_conn->state);452 453	/* suspend queuing of new iscsi commands */454	if (iser_conn->iscsi_conn)455		iscsi_suspend_queue(iser_conn->iscsi_conn);456 457	/*458	 * In case we didn't already clean up the cma_id (peer initiated459	 * a disconnection), we need to Cause the CMA to change the QP460	 * state to ERROR.461	 */462	if (ib_conn->cma_id) {463		err = rdma_disconnect(ib_conn->cma_id);464		if (err)465			iser_err("Failed to disconnect, conn: 0x%p err %d\n",466				 iser_conn, err);467 468		/* block until all flush errors are consumed */469		ib_drain_qp(ib_conn->qp);470	}471 472	return 1;473}474 475/*476 * Called with state mutex held477 */478static void iser_connect_error(struct rdma_cm_id *cma_id)479{480	struct iser_conn *iser_conn = cma_id->context;481 482	lockdep_assert_held(&iser_conn->state_mutex);483 484	iser_conn->state = ISER_CONN_TERMINATING;485}486 487static void iser_calc_scsi_params(struct iser_conn *iser_conn,488				  unsigned int max_sectors)489{490	struct iser_device *device = iser_conn->ib_conn.device;491	struct ib_device_attr *attr = &device->ib_device->attrs;492	unsigned short sg_tablesize, sup_sg_tablesize;493	unsigned short reserved_mr_pages;494	u32 max_num_sg;495 496	/*497	 * FRs without SG_GAPS can only map up to a (device) page per entry,498	 * but if the first entry is misaligned we'll end up using two entries499	 * (head and tail) for a single page worth data, so one additional500	 * entry is required.501	 */502	if (attr->kernel_cap_flags & IBK_SG_GAPS_REG)503		reserved_mr_pages = 0;504	else505		reserved_mr_pages = 1;506 507	if (iser_conn->ib_conn.pi_support)508		max_num_sg = attr->max_pi_fast_reg_page_list_len;509	else510		max_num_sg = attr->max_fast_reg_page_list_len;511 512	sg_tablesize = DIV_ROUND_UP(max_sectors * SECTOR_SIZE, SZ_4K);513	sup_sg_tablesize = min_t(uint, ISCSI_ISER_MAX_SG_TABLESIZE,514				 max_num_sg - reserved_mr_pages);515	iser_conn->scsi_sg_tablesize = min(sg_tablesize, sup_sg_tablesize);516	iser_conn->pages_per_mr =517		iser_conn->scsi_sg_tablesize + reserved_mr_pages;518}519 520/*521 * Called with state mutex held522 */523static void iser_addr_handler(struct rdma_cm_id *cma_id)524{525	struct iser_conn *iser_conn = cma_id->context;526	struct iser_device *device;527	struct ib_conn *ib_conn;528	int    ret;529 530	lockdep_assert_held(&iser_conn->state_mutex);531 532	if (iser_conn->state != ISER_CONN_PENDING)533		/* bailout */534		return;535 536	ib_conn = &iser_conn->ib_conn;537	device = iser_device_find_by_ib_device(cma_id);538	if (!device) {539		iser_err("device lookup/creation failed\n");540		iser_connect_error(cma_id);541		return;542	}543 544	ib_conn->device = device;545 546	/* connection T10-PI support */547	if (iser_pi_enable) {548		if (!(device->ib_device->attrs.kernel_cap_flags &549		      IBK_INTEGRITY_HANDOVER)) {550			iser_warn("T10-PI requested but not supported on %s, "551				  "continue without T10-PI\n",552				  dev_name(&ib_conn->device->ib_device->dev));553			ib_conn->pi_support = false;554		} else {555			ib_conn->pi_support = true;556		}557	}558 559	iser_calc_scsi_params(iser_conn, iser_max_sectors);560 561	ret = rdma_resolve_route(cma_id, 1000);562	if (ret) {563		iser_err("resolve route failed: %d\n", ret);564		iser_connect_error(cma_id);565		return;566	}567}568 569/*570 * Called with state mutex held571 */572static void iser_route_handler(struct rdma_cm_id *cma_id)573{574	struct rdma_conn_param conn_param;575	int ret;576	struct iser_cm_hdr req_hdr;577	struct iser_conn *iser_conn = cma_id->context;578	struct ib_conn *ib_conn = &iser_conn->ib_conn;579	struct ib_device *ib_dev = ib_conn->device->ib_device;580 581	lockdep_assert_held(&iser_conn->state_mutex);582 583	if (iser_conn->state != ISER_CONN_PENDING)584		/* bailout */585		return;586 587	ret = iser_create_ib_conn_res(ib_conn);588	if (ret)589		goto failure;590 591	memset(&conn_param, 0, sizeof conn_param);592	conn_param.responder_resources = ib_dev->attrs.max_qp_rd_atom;593	conn_param.initiator_depth = 1;594	conn_param.retry_count = 7;595	conn_param.rnr_retry_count = 6;596 597	memset(&req_hdr, 0, sizeof(req_hdr));598	req_hdr.flags = ISER_ZBVA_NOT_SUP;599	if (!iser_always_reg)600		req_hdr.flags |= ISER_SEND_W_INV_NOT_SUP;601	conn_param.private_data	= (void *)&req_hdr;602	conn_param.private_data_len = sizeof(struct iser_cm_hdr);603 604	ret = rdma_connect_locked(cma_id, &conn_param);605	if (ret) {606		iser_err("failure connecting: %d\n", ret);607		goto failure;608	}609 610	return;611failure:612	iser_connect_error(cma_id);613}614 615/*616 * Called with state mutex held617 */618static void iser_connected_handler(struct rdma_cm_id *cma_id,619				   const void *private_data)620{621	struct iser_conn *iser_conn = cma_id->context;622	struct ib_qp_attr attr;623	struct ib_qp_init_attr init_attr;624 625	lockdep_assert_held(&iser_conn->state_mutex);626 627	if (iser_conn->state != ISER_CONN_PENDING)628		/* bailout */629		return;630 631	(void)ib_query_qp(cma_id->qp, &attr, ~0, &init_attr);632	iser_info("remote qpn:%x my qpn:%x\n", attr.dest_qp_num, cma_id->qp->qp_num);633 634	if (private_data) {635		u8 flags = *(u8 *)private_data;636 637		iser_conn->snd_w_inv = !(flags & ISER_SEND_W_INV_NOT_SUP);638	}639 640	iser_info("conn %p: negotiated %s invalidation\n",641		  iser_conn, iser_conn->snd_w_inv ? "remote" : "local");642 643	iser_conn->state = ISER_CONN_UP;644	complete(&iser_conn->up_completion);645}646 647/*648 * Called with state mutex held649 */650static void iser_cleanup_handler(struct rdma_cm_id *cma_id,651				 bool destroy)652{653	struct iser_conn *iser_conn = cma_id->context;654 655	lockdep_assert_held(&iser_conn->state_mutex);656	/*657	 * We are not guaranteed that we visited disconnected_handler658	 * by now, call it here to be safe that we handle CM drep659	 * and flush errors.660	 */661	if (iser_conn_terminate(iser_conn)) {662		if (iser_conn->iscsi_conn)663			iscsi_conn_failure(iser_conn->iscsi_conn,664					   ISCSI_ERR_CONN_FAILED);665		else666			iser_err("iscsi_iser connection isn't bound\n");667	}668	iser_free_ib_conn_res(iser_conn, destroy);669	complete(&iser_conn->ib_completion);670}671 672static int iser_cma_handler(struct rdma_cm_id *cma_id,673			    struct rdma_cm_event *event)674{675	struct iser_conn *iser_conn;676	int ret = 0;677 678	iser_conn = cma_id->context;679	iser_info("%s (%d): status %d conn %p id %p\n",680		  rdma_event_msg(event->event), event->event,681		  event->status, cma_id->context, cma_id);682 683	mutex_lock(&iser_conn->state_mutex);684	switch (event->event) {685	case RDMA_CM_EVENT_ADDR_RESOLVED:686		iser_addr_handler(cma_id);687		break;688	case RDMA_CM_EVENT_ROUTE_RESOLVED:689		iser_route_handler(cma_id);690		break;691	case RDMA_CM_EVENT_ESTABLISHED:692		iser_connected_handler(cma_id, event->param.conn.private_data);693		break;694	case RDMA_CM_EVENT_REJECTED:695		iser_info("Connection rejected: %s\n",696			 rdma_reject_msg(cma_id, event->status));697		fallthrough;698	case RDMA_CM_EVENT_ADDR_ERROR:699	case RDMA_CM_EVENT_ROUTE_ERROR:700	case RDMA_CM_EVENT_CONNECT_ERROR:701	case RDMA_CM_EVENT_UNREACHABLE:702		iser_connect_error(cma_id);703		break;704	case RDMA_CM_EVENT_DISCONNECTED:705	case RDMA_CM_EVENT_ADDR_CHANGE:706	case RDMA_CM_EVENT_TIMEWAIT_EXIT:707		iser_cleanup_handler(cma_id, false);708		break;709	case RDMA_CM_EVENT_DEVICE_REMOVAL:710		/*711		 * we *must* destroy the device as we cannot rely712		 * on iscsid to be around to initiate error handling.713		 * also if we are not in state DOWN implicitly destroy714		 * the cma_id.715		 */716		iser_cleanup_handler(cma_id, true);717		if (iser_conn->state != ISER_CONN_DOWN) {718			iser_conn->ib_conn.cma_id = NULL;719			ret = 1;720		}721		break;722	default:723		iser_err("Unexpected RDMA CM event: %s (%d)\n",724			 rdma_event_msg(event->event), event->event);725		break;726	}727	mutex_unlock(&iser_conn->state_mutex);728 729	return ret;730}731 732void iser_conn_init(struct iser_conn *iser_conn)733{734	struct ib_conn *ib_conn = &iser_conn->ib_conn;735 736	iser_conn->state = ISER_CONN_INIT;737	init_completion(&iser_conn->stop_completion);738	init_completion(&iser_conn->ib_completion);739	init_completion(&iser_conn->up_completion);740	INIT_LIST_HEAD(&iser_conn->conn_list);741	mutex_init(&iser_conn->state_mutex);742 743	ib_conn->reg_cqe.done = iser_reg_comp;744}745 746/*747 * starts the process of connecting to the target748 * sleeps until the connection is established or rejected749 */750int iser_connect(struct iser_conn *iser_conn, struct sockaddr *src_addr,751		 struct sockaddr *dst_addr, int non_blocking)752{753	struct ib_conn *ib_conn = &iser_conn->ib_conn;754	int err = 0;755 756	mutex_lock(&iser_conn->state_mutex);757 758	sprintf(iser_conn->name, "%pISp", dst_addr);759 760	iser_info("connecting to: %s\n", iser_conn->name);761 762	/* the device is known only --after-- address resolution */763	ib_conn->device = NULL;764 765	iser_conn->state = ISER_CONN_PENDING;766 767	ib_conn->cma_id = rdma_create_id(&init_net, iser_cma_handler,768					 iser_conn, RDMA_PS_TCP, IB_QPT_RC);769	if (IS_ERR(ib_conn->cma_id)) {770		err = PTR_ERR(ib_conn->cma_id);771		iser_err("rdma_create_id failed: %d\n", err);772		goto id_failure;773	}774 775	err = rdma_resolve_addr(ib_conn->cma_id, src_addr, dst_addr, 1000);776	if (err) {777		iser_err("rdma_resolve_addr failed: %d\n", err);778		goto addr_failure;779	}780 781	if (!non_blocking) {782		wait_for_completion_interruptible(&iser_conn->up_completion);783 784		if (iser_conn->state != ISER_CONN_UP) {785			err =  -EIO;786			goto connect_failure;787		}788	}789	mutex_unlock(&iser_conn->state_mutex);790 791	mutex_lock(&ig.connlist_mutex);792	list_add(&iser_conn->conn_list, &ig.connlist);793	mutex_unlock(&ig.connlist_mutex);794	return 0;795 796id_failure:797	ib_conn->cma_id = NULL;798addr_failure:799	iser_conn->state = ISER_CONN_DOWN;800connect_failure:801	mutex_unlock(&iser_conn->state_mutex);802	iser_conn_release(iser_conn);803	return err;804}805 806int iser_post_recvl(struct iser_conn *iser_conn)807{808	struct ib_conn *ib_conn = &iser_conn->ib_conn;809	struct iser_login_desc *desc = &iser_conn->login_desc;810	struct ib_recv_wr wr;811	int ret;812 813	desc->sge.addr = desc->rsp_dma;814	desc->sge.length = ISER_RX_LOGIN_SIZE;815	desc->sge.lkey = ib_conn->device->pd->local_dma_lkey;816 817	desc->cqe.done = iser_login_rsp;818	wr.wr_cqe = &desc->cqe;819	wr.sg_list = &desc->sge;820	wr.num_sge = 1;821	wr.next = NULL;822 823	ret = ib_post_recv(ib_conn->qp, &wr, NULL);824	if (unlikely(ret))825		iser_err("ib_post_recv login failed ret=%d\n", ret);826 827	return ret;828}829 830int iser_post_recvm(struct iser_conn *iser_conn, struct iser_rx_desc *rx_desc)831{832	struct ib_conn *ib_conn = &iser_conn->ib_conn;833	struct ib_recv_wr wr;834	int ret;835 836	rx_desc->cqe.done = iser_task_rsp;837	wr.wr_cqe = &rx_desc->cqe;838	wr.sg_list = &rx_desc->rx_sg;839	wr.num_sge = 1;840	wr.next = NULL;841 842	ret = ib_post_recv(ib_conn->qp, &wr, NULL);843	if (unlikely(ret))844		iser_err("ib_post_recv failed ret=%d\n", ret);845 846	return ret;847}848 849 850/**851 * iser_post_send - Initiate a Send DTO operation852 * @ib_conn: connection RDMA resources853 * @tx_desc: iSER TX descriptor854 *855 * Return: 0 on success, -1 on failure856 */857int iser_post_send(struct ib_conn *ib_conn, struct iser_tx_desc *tx_desc)858{859	struct ib_send_wr *wr = &tx_desc->send_wr;860	struct ib_send_wr *first_wr;861	int ret;862 863	ib_dma_sync_single_for_device(ib_conn->device->ib_device,864				      tx_desc->dma_addr, ISER_HEADERS_LEN,865				      DMA_TO_DEVICE);866 867	wr->next = NULL;868	wr->wr_cqe = &tx_desc->cqe;869	wr->sg_list = tx_desc->tx_sg;870	wr->num_sge = tx_desc->num_sge;871	wr->opcode = IB_WR_SEND;872	wr->send_flags = IB_SEND_SIGNALED;873 874	if (tx_desc->inv_wr.next)875		first_wr = &tx_desc->inv_wr;876	else if (tx_desc->reg_wr.wr.next)877		first_wr = &tx_desc->reg_wr.wr;878	else879		first_wr = wr;880 881	ret = ib_post_send(ib_conn->qp, first_wr, NULL);882	if (unlikely(ret))883		iser_err("ib_post_send failed, ret:%d opcode:%d\n",884			 ret, wr->opcode);885 886	return ret;887}888 889u8 iser_check_task_pi_status(struct iscsi_iser_task *iser_task,890			     enum iser_data_dir cmd_dir, sector_t *sector)891{892	struct iser_mem_reg *reg = &iser_task->rdma_reg[cmd_dir];893	struct iser_fr_desc *desc = reg->desc;894	unsigned long sector_size = iser_task->sc->device->sector_size;895	struct ib_mr_status mr_status;896	int ret;897 898	if (desc && desc->sig_protected) {899		desc->sig_protected = false;900		ret = ib_check_mr_status(desc->rsc.sig_mr,901					 IB_MR_CHECK_SIG_STATUS, &mr_status);902		if (ret) {903			iser_err("ib_check_mr_status failed, ret %d\n", ret);904			/* Not a lot we can do, return ambiguous guard error */905			*sector = 0;906			return 0x1;907		}908 909		if (mr_status.fail_status & IB_MR_CHECK_SIG_STATUS) {910			sector_t sector_off = mr_status.sig_err.sig_err_offset;911 912			sector_div(sector_off, sector_size + 8);913			*sector = scsi_get_sector(iser_task->sc) + sector_off;914 915			iser_err("PI error found type %d at sector %llx "916			       "expected %x vs actual %x\n",917			       mr_status.sig_err.err_type,918			       (unsigned long long)*sector,919			       mr_status.sig_err.expected,920			       mr_status.sig_err.actual);921 922			switch (mr_status.sig_err.err_type) {923			case IB_SIG_BAD_GUARD:924				return 0x1;925			case IB_SIG_BAD_REFTAG:926				return 0x3;927			case IB_SIG_BAD_APPTAG:928				return 0x2;929			}930		}931	}932 933	return 0;934}935 936void iser_err_comp(struct ib_wc *wc, const char *type)937{938	if (wc->status != IB_WC_WR_FLUSH_ERR) {939		struct iser_conn *iser_conn = to_iser_conn(wc->qp->qp_context);940 941		iser_err("%s failure: %s (%d) vend_err %#x\n", type,942			 ib_wc_status_msg(wc->status), wc->status,943			 wc->vendor_err);944 945		if (iser_conn->iscsi_conn)946			iscsi_conn_failure(iser_conn->iscsi_conn,947					   ISCSI_ERR_CONN_FAILED);948	} else {949		iser_dbg("%s failure: %s (%d)\n", type,950			 ib_wc_status_msg(wc->status), wc->status);951	}952}953