Lines Matching +full:retain +full:- +full:state +full:- +full:shutdown
4 * Copyright (c) 2013-2014 Mellanox Technologies. All rights reserved.
16 * - Redistributions of source code must retain the above
20 * - Redistributions in binary form must reproduce the above
50 ib_event_msg(cause->event), cause->event); in iser_qp_event_callback()
57 ib_event_msg(event->event), event->event, in iser_event_handler()
58 dev_name(&event->device->dev), event->element.port_num); in iser_event_handler()
62 * iser_create_device_ib_res - creates Protection Domain (PD), Completion
66 * Return: 0 on success, -1 on failure
70 struct ib_device *ib_dev = device->ib_device; in iser_create_device_ib_res()
72 if (!(ib_dev->attrs.device_cap_flags & IB_DEVICE_MEM_MGT_EXTENSIONS)) { in iser_create_device_ib_res()
74 return -1; in iser_create_device_ib_res()
77 device->pd = ib_alloc_pd(ib_dev, in iser_create_device_ib_res()
79 if (IS_ERR(device->pd)) in iser_create_device_ib_res()
82 INIT_IB_EVENT_HANDLER(&device->event_handler, ib_dev, in iser_create_device_ib_res()
84 ib_register_event_handler(&device->event_handler); in iser_create_device_ib_res()
89 return -1; in iser_create_device_ib_res()
93 * iser_free_device_ib_res - destroy/dealloc/dereg the DMA MR,
98 ib_unregister_event_handler(&device->event_handler); in iser_free_device_ib_res()
99 ib_dealloc_pd(device->pd); in iser_free_device_ib_res()
101 device->pd = NULL; in iser_free_device_ib_res()
111 struct ib_device *ib_dev = device->ib_device; in iser_create_fastreg_desc()
117 return ERR_PTR(-ENOMEM); in iser_create_fastreg_desc()
119 if (ib_dev->attrs.device_cap_flags & IB_DEVICE_SG_GAPS_REG) in iser_create_fastreg_desc()
124 desc->rsc.mr = ib_alloc_mr(pd, mr_type, size); in iser_create_fastreg_desc()
125 if (IS_ERR(desc->rsc.mr)) { in iser_create_fastreg_desc()
126 ret = PTR_ERR(desc->rsc.mr); in iser_create_fastreg_desc()
132 desc->rsc.sig_mr = ib_alloc_mr_integrity(pd, size, size); in iser_create_fastreg_desc()
133 if (IS_ERR(desc->rsc.sig_mr)) { in iser_create_fastreg_desc()
134 ret = PTR_ERR(desc->rsc.sig_mr); in iser_create_fastreg_desc()
139 desc->rsc.mr_valid = 0; in iser_create_fastreg_desc()
144 ib_dereg_mr(desc->rsc.mr); in iser_create_fastreg_desc()
153 struct iser_reg_resources *res = &desc->rsc; in iser_destroy_fastreg_desc()
155 ib_dereg_mr(res->mr); in iser_destroy_fastreg_desc()
156 if (res->sig_mr) { in iser_destroy_fastreg_desc()
157 ib_dereg_mr(res->sig_mr); in iser_destroy_fastreg_desc()
158 res->sig_mr = NULL; in iser_destroy_fastreg_desc()
164 * iser_alloc_fastreg_pool - Creates pool of fast_reg descriptors
176 struct iser_device *device = ib_conn->device; in iser_alloc_fastreg_pool()
177 struct iser_fr_pool *fr_pool = &ib_conn->fr_pool; in iser_alloc_fastreg_pool()
181 INIT_LIST_HEAD(&fr_pool->list); in iser_alloc_fastreg_pool()
182 INIT_LIST_HEAD(&fr_pool->all_list); in iser_alloc_fastreg_pool()
183 spin_lock_init(&fr_pool->lock); in iser_alloc_fastreg_pool()
184 fr_pool->size = 0; in iser_alloc_fastreg_pool()
186 desc = iser_create_fastreg_desc(device, device->pd, in iser_alloc_fastreg_pool()
187 ib_conn->pi_support, size); in iser_alloc_fastreg_pool()
193 list_add_tail(&desc->list, &fr_pool->list); in iser_alloc_fastreg_pool()
194 list_add_tail(&desc->all_list, &fr_pool->all_list); in iser_alloc_fastreg_pool()
195 fr_pool->size++; in iser_alloc_fastreg_pool()
206 * iser_free_fastreg_pool - releases the pool of fast_reg descriptors
211 struct iser_fr_pool *fr_pool = &ib_conn->fr_pool; in iser_free_fastreg_pool()
215 if (list_empty(&fr_pool->all_list)) in iser_free_fastreg_pool()
220 list_for_each_entry_safe(desc, tmp, &fr_pool->all_list, all_list) { in iser_free_fastreg_pool()
221 list_del(&desc->all_list); in iser_free_fastreg_pool()
226 if (i < fr_pool->size) in iser_free_fastreg_pool()
228 fr_pool->size - i); in iser_free_fastreg_pool()
232 * iser_create_ib_conn_res - Queue-Pair (QP)
234 * Return: 0 on success, -1 on failure
242 int ret = -ENOMEM; in iser_create_ib_conn_res()
245 BUG_ON(ib_conn->device == NULL); in iser_create_ib_conn_res()
247 device = ib_conn->device; in iser_create_ib_conn_res()
248 ib_dev = device->ib_device; in iser_create_ib_conn_res()
250 if (ib_conn->pi_support) in iser_create_ib_conn_res()
255 (unsigned int)ib_dev->attrs.max_qp_wr); in iser_create_ib_conn_res()
258 ib_conn->cq = ib_cq_pool_get(ib_dev, cq_size, -1, IB_POLL_SOFTIRQ); in iser_create_ib_conn_res()
259 if (IS_ERR(ib_conn->cq)) { in iser_create_ib_conn_res()
260 ret = PTR_ERR(ib_conn->cq); in iser_create_ib_conn_res()
263 ib_conn->cq_size = cq_size; in iser_create_ib_conn_res()
269 init_attr.send_cq = ib_conn->cq; in iser_create_ib_conn_res()
270 init_attr.recv_cq = ib_conn->cq; in iser_create_ib_conn_res()
277 if (ib_conn->pi_support) in iser_create_ib_conn_res()
279 iser_conn->max_cmds = ISER_GET_MAX_XMIT_CMDS(max_send_wr - 1); in iser_create_ib_conn_res()
281 ret = rdma_create_qp(ib_conn->cma_id, device->pd, &init_attr); in iser_create_ib_conn_res()
285 ib_conn->qp = ib_conn->cma_id->qp; in iser_create_ib_conn_res()
287 ib_conn, ib_conn->cma_id, in iser_create_ib_conn_res()
288 ib_conn->cma_id->qp, max_send_wr); in iser_create_ib_conn_res()
292 ib_cq_pool_put(ib_conn->cq, ib_conn->cq_size); in iser_create_ib_conn_res()
312 if (device->ib_device->node_guid == cma_id->device->node_guid) in iser_device_find_by_ib_device()
320 device->ib_device = cma_id->device; in iser_device_find_by_ib_device()
327 list_add(&device->ig_list, &ig.device_list); in iser_device_find_by_ib_device()
330 device->refcount++; in iser_device_find_by_ib_device()
340 device->refcount--; in iser_device_try_release()
341 iser_info("device %p refcount %d\n", device, device->refcount); in iser_device_try_release()
342 if (!device->refcount) { in iser_device_try_release()
344 list_del(&device->ig_list); in iser_device_try_release()
351 * Called with state mutex held
359 ret = (iser_conn->state == comp); in iser_conn_state_comp_exch()
361 iser_conn->state = exch; in iser_conn_state_comp_exch()
373 wait_for_completion(&iser_conn->stop_completion); in iser_release_work()
375 wait_for_completion(&iser_conn->ib_completion); in iser_release_work()
377 mutex_lock(&iser_conn->state_mutex); in iser_release_work()
378 iser_conn->state = ISER_CONN_DOWN; in iser_release_work()
379 mutex_unlock(&iser_conn->state_mutex); in iser_release_work()
385 * iser_free_ib_conn_res - release IB related resources
389 * shutdown and DEVICE_REMOVAL will use this).
391 * This routine is called with the iser state mutex held
398 struct ib_conn *ib_conn = &iser_conn->ib_conn; in iser_free_ib_conn_res()
399 struct iser_device *device = ib_conn->device; in iser_free_ib_conn_res()
402 iser_conn, ib_conn->cma_id, ib_conn->qp); in iser_free_ib_conn_res()
404 if (ib_conn->qp != NULL) { in iser_free_ib_conn_res()
405 rdma_destroy_qp(ib_conn->cma_id); in iser_free_ib_conn_res()
406 ib_cq_pool_put(ib_conn->cq, ib_conn->cq_size); in iser_free_ib_conn_res()
407 ib_conn->qp = NULL; in iser_free_ib_conn_res()
411 if (iser_conn->rx_descs) in iser_free_ib_conn_res()
416 ib_conn->device = NULL; in iser_free_ib_conn_res()
422 * iser_conn_release - Frees all conn objects and deallocs conn descriptor
427 struct ib_conn *ib_conn = &iser_conn->ib_conn; in iser_conn_release()
430 list_del(&iser_conn->conn_list); in iser_conn_release()
433 mutex_lock(&iser_conn->state_mutex); in iser_conn_release()
435 if (iser_conn->state != ISER_CONN_DOWN) { in iser_conn_release()
436 iser_warn("iser conn %p state %d, expected state down.\n", in iser_conn_release()
437 iser_conn, iser_conn->state); in iser_conn_release()
438 iscsi_destroy_endpoint(iser_conn->ep); in iser_conn_release()
439 iser_conn->state = ISER_CONN_DOWN; in iser_conn_release()
446 mutex_unlock(&iser_conn->state_mutex); in iser_conn_release()
448 if (ib_conn->cma_id != NULL) { in iser_conn_release()
449 rdma_destroy_id(ib_conn->cma_id); in iser_conn_release()
450 ib_conn->cma_id = NULL; in iser_conn_release()
457 * iser_conn_terminate - triggers start of the disconnect procedures and
461 * Called with state mutex held
465 struct ib_conn *ib_conn = &iser_conn->ib_conn; in iser_conn_terminate()
468 /* terminate the iser conn only if the conn state is UP */ in iser_conn_terminate()
473 iser_info("iser_conn %p state %d\n", iser_conn, iser_conn->state); in iser_conn_terminate()
476 if (iser_conn->iscsi_conn) in iser_conn_terminate()
477 iscsi_suspend_queue(iser_conn->iscsi_conn); in iser_conn_terminate()
482 * state to ERROR. in iser_conn_terminate()
484 if (ib_conn->cma_id) { in iser_conn_terminate()
485 err = rdma_disconnect(ib_conn->cma_id); in iser_conn_terminate()
491 ib_drain_sq(ib_conn->qp); in iser_conn_terminate()
498 * Called with state mutex held
504 iser_conn = (struct iser_conn *)cma_id->context; in iser_connect_error()
505 iser_conn->state = ISER_CONN_TERMINATING; in iser_connect_error()
512 struct iser_device *device = iser_conn->ib_conn.device; in iser_calc_scsi_params()
513 struct ib_device_attr *attr = &device->ib_device->attrs; in iser_calc_scsi_params()
524 if (attr->device_cap_flags & IB_DEVICE_SG_GAPS_REG) in iser_calc_scsi_params()
529 if (iser_conn->ib_conn.pi_support) in iser_calc_scsi_params()
530 max_num_sg = attr->max_pi_fast_reg_page_list_len; in iser_calc_scsi_params()
532 max_num_sg = attr->max_fast_reg_page_list_len; in iser_calc_scsi_params()
536 max_num_sg - reserved_mr_pages); in iser_calc_scsi_params()
537 iser_conn->scsi_sg_tablesize = min(sg_tablesize, sup_sg_tablesize); in iser_calc_scsi_params()
538 iser_conn->pages_per_mr = in iser_calc_scsi_params()
539 iser_conn->scsi_sg_tablesize + reserved_mr_pages; in iser_calc_scsi_params()
543 * Called with state mutex held
552 iser_conn = (struct iser_conn *)cma_id->context; in iser_addr_handler()
553 if (iser_conn->state != ISER_CONN_PENDING) in iser_addr_handler()
557 ib_conn = &iser_conn->ib_conn; in iser_addr_handler()
565 ib_conn->device = device; in iser_addr_handler()
567 /* connection T10-PI support */ in iser_addr_handler()
569 if (!(device->ib_device->attrs.device_cap_flags & in iser_addr_handler()
571 iser_warn("T10-PI requested but not supported on %s, " in iser_addr_handler()
572 "continue without T10-PI\n", in iser_addr_handler()
573 dev_name(&ib_conn->device->ib_device->dev)); in iser_addr_handler()
574 ib_conn->pi_support = false; in iser_addr_handler()
576 ib_conn->pi_support = true; in iser_addr_handler()
591 * Called with state mutex held
598 struct iser_conn *iser_conn = (struct iser_conn *)cma_id->context; in iser_route_handler()
599 struct ib_conn *ib_conn = &iser_conn->ib_conn; in iser_route_handler()
600 struct ib_device *ib_dev = ib_conn->device->ib_device; in iser_route_handler()
602 if (iser_conn->state != ISER_CONN_PENDING) in iser_route_handler()
611 conn_param.responder_resources = ib_dev->attrs.max_qp_rd_atom; in iser_route_handler()
641 iser_conn = (struct iser_conn *)cma_id->context; in iser_connected_handler()
642 if (iser_conn->state != ISER_CONN_PENDING) in iser_connected_handler()
646 (void)ib_query_qp(cma_id->qp, &attr, ~0, &init_attr); in iser_connected_handler()
647 iser_info("remote qpn:%x my qpn:%x\n", attr.dest_qp_num, cma_id->qp->qp_num); in iser_connected_handler()
652 iser_conn->snd_w_inv = !(flags & ISER_SEND_W_INV_NOT_SUP); in iser_connected_handler()
656 iser_conn, iser_conn->snd_w_inv ? "remote" : "local"); in iser_connected_handler()
658 iser_conn->state = ISER_CONN_UP; in iser_connected_handler()
659 complete(&iser_conn->up_completion); in iser_connected_handler()
664 struct iser_conn *iser_conn = (struct iser_conn *)cma_id->context; in iser_disconnected_handler()
667 if (iser_conn->iscsi_conn) in iser_disconnected_handler()
668 iscsi_conn_failure(iser_conn->iscsi_conn, in iser_disconnected_handler()
678 struct iser_conn *iser_conn = (struct iser_conn *)cma_id->context; in iser_cleanup_handler()
687 complete(&iser_conn->ib_completion); in iser_cleanup_handler()
695 iser_conn = (struct iser_conn *)cma_id->context; in iser_cma_handler()
697 rdma_event_msg(event->event), event->event, in iser_cma_handler()
698 event->status, cma_id->context, cma_id); in iser_cma_handler()
700 mutex_lock(&iser_conn->state_mutex); in iser_cma_handler()
701 switch (event->event) { in iser_cma_handler()
709 iser_connected_handler(cma_id, event->param.conn.private_data); in iser_cma_handler()
713 rdma_reject_msg(cma_id, event->status)); in iser_cma_handler()
730 * also if we are not in state DOWN implicitly destroy in iser_cma_handler()
734 if (iser_conn->state != ISER_CONN_DOWN) { in iser_cma_handler()
735 iser_conn->ib_conn.cma_id = NULL; in iser_cma_handler()
741 rdma_event_msg(event->event), event->event); in iser_cma_handler()
744 mutex_unlock(&iser_conn->state_mutex); in iser_cma_handler()
751 struct ib_conn *ib_conn = &iser_conn->ib_conn; in iser_conn_init()
753 iser_conn->state = ISER_CONN_INIT; in iser_conn_init()
754 init_completion(&iser_conn->stop_completion); in iser_conn_init()
755 init_completion(&iser_conn->ib_completion); in iser_conn_init()
756 init_completion(&iser_conn->up_completion); in iser_conn_init()
757 INIT_LIST_HEAD(&iser_conn->conn_list); in iser_conn_init()
758 mutex_init(&iser_conn->state_mutex); in iser_conn_init()
760 ib_conn->post_recv_buf_count = 0; in iser_conn_init()
761 ib_conn->reg_cqe.done = iser_reg_comp; in iser_conn_init()
773 struct ib_conn *ib_conn = &iser_conn->ib_conn; in iser_connect()
776 mutex_lock(&iser_conn->state_mutex); in iser_connect()
778 sprintf(iser_conn->name, "%pISp", dst_addr); in iser_connect()
780 iser_info("connecting to: %s\n", iser_conn->name); in iser_connect()
782 /* the device is known only --after-- address resolution */ in iser_connect()
783 ib_conn->device = NULL; in iser_connect()
785 iser_conn->state = ISER_CONN_PENDING; in iser_connect()
787 ib_conn->cma_id = rdma_create_id(&init_net, iser_cma_handler, in iser_connect()
790 if (IS_ERR(ib_conn->cma_id)) { in iser_connect()
791 err = PTR_ERR(ib_conn->cma_id); in iser_connect()
796 err = rdma_resolve_addr(ib_conn->cma_id, src_addr, dst_addr, 1000); in iser_connect()
803 wait_for_completion_interruptible(&iser_conn->up_completion); in iser_connect()
805 if (iser_conn->state != ISER_CONN_UP) { in iser_connect()
806 err = -EIO; in iser_connect()
810 mutex_unlock(&iser_conn->state_mutex); in iser_connect()
813 list_add(&iser_conn->conn_list, &ig.connlist); in iser_connect()
818 ib_conn->cma_id = NULL; in iser_connect()
820 iser_conn->state = ISER_CONN_DOWN; in iser_connect()
822 mutex_unlock(&iser_conn->state_mutex); in iser_connect()
829 struct ib_conn *ib_conn = &iser_conn->ib_conn; in iser_post_recvl()
830 struct iser_login_desc *desc = &iser_conn->login_desc; in iser_post_recvl()
834 desc->sge.addr = desc->rsp_dma; in iser_post_recvl()
835 desc->sge.length = ISER_RX_LOGIN_SIZE; in iser_post_recvl()
836 desc->sge.lkey = ib_conn->device->pd->local_dma_lkey; in iser_post_recvl()
838 desc->cqe.done = iser_login_rsp; in iser_post_recvl()
839 wr.wr_cqe = &desc->cqe; in iser_post_recvl()
840 wr.sg_list = &desc->sge; in iser_post_recvl()
844 ib_conn->post_recv_buf_count++; in iser_post_recvl()
845 ib_ret = ib_post_recv(ib_conn->qp, &wr, NULL); in iser_post_recvl()
848 ib_conn->post_recv_buf_count--; in iser_post_recvl()
856 struct ib_conn *ib_conn = &iser_conn->ib_conn; in iser_post_recvm()
857 unsigned int my_rx_head = iser_conn->rx_desc_head; in iser_post_recvm()
862 for (wr = ib_conn->rx_wr, i = 0; i < count; i++, wr++) { in iser_post_recvm()
863 rx_desc = &iser_conn->rx_descs[my_rx_head]; in iser_post_recvm()
864 rx_desc->cqe.done = iser_task_rsp; in iser_post_recvm()
865 wr->wr_cqe = &rx_desc->cqe; in iser_post_recvm()
866 wr->sg_list = &rx_desc->rx_sg; in iser_post_recvm()
867 wr->num_sge = 1; in iser_post_recvm()
868 wr->next = wr + 1; in iser_post_recvm()
869 my_rx_head = (my_rx_head + 1) & iser_conn->qp_max_recv_dtos_mask; in iser_post_recvm()
872 wr--; in iser_post_recvm()
873 wr->next = NULL; /* mark end of work requests list */ in iser_post_recvm()
875 ib_conn->post_recv_buf_count += count; in iser_post_recvm()
876 ib_ret = ib_post_recv(ib_conn->qp, ib_conn->rx_wr, NULL); in iser_post_recvm()
879 ib_conn->post_recv_buf_count -= count; in iser_post_recvm()
881 iser_conn->rx_desc_head = my_rx_head; in iser_post_recvm()
888 * iser_post_send - Initiate a Send DTO operation
893 * Return: 0 on success, -1 on failure
898 struct ib_send_wr *wr = &tx_desc->send_wr; in iser_post_send()
902 ib_dma_sync_single_for_device(ib_conn->device->ib_device, in iser_post_send()
903 tx_desc->dma_addr, ISER_HEADERS_LEN, in iser_post_send()
906 wr->next = NULL; in iser_post_send()
907 wr->wr_cqe = &tx_desc->cqe; in iser_post_send()
908 wr->sg_list = tx_desc->tx_sg; in iser_post_send()
909 wr->num_sge = tx_desc->num_sge; in iser_post_send()
910 wr->opcode = IB_WR_SEND; in iser_post_send()
911 wr->send_flags = signal ? IB_SEND_SIGNALED : 0; in iser_post_send()
913 if (tx_desc->inv_wr.next) in iser_post_send()
914 first_wr = &tx_desc->inv_wr; in iser_post_send()
915 else if (tx_desc->reg_wr.wr.next) in iser_post_send()
916 first_wr = &tx_desc->reg_wr.wr; in iser_post_send()
920 ib_ret = ib_post_send(ib_conn->qp, first_wr, NULL); in iser_post_send()
923 ib_ret, wr->opcode); in iser_post_send()
931 struct iser_mem_reg *reg = &iser_task->rdma_reg[cmd_dir]; in iser_check_task_pi_status()
932 struct iser_fr_desc *desc = reg->mem_h; in iser_check_task_pi_status()
933 unsigned long sector_size = iser_task->sc->device->sector_size; in iser_check_task_pi_status()
937 if (desc && desc->sig_protected) { in iser_check_task_pi_status()
938 desc->sig_protected = false; in iser_check_task_pi_status()
939 ret = ib_check_mr_status(desc->rsc.sig_mr, in iser_check_task_pi_status()
952 *sector = scsi_get_lba(iser_task->sc) + sector_off; in iser_check_task_pi_status()
977 if (wc->status != IB_WC_WR_FLUSH_ERR) { in iser_err_comp()
978 struct iser_conn *iser_conn = to_iser_conn(wc->qp->qp_context); in iser_err_comp()
981 ib_wc_status_msg(wc->status), wc->status, in iser_err_comp()
982 wc->vendor_err); in iser_err_comp()
984 if (iser_conn->iscsi_conn) in iser_err_comp()
985 iscsi_conn_failure(iser_conn->iscsi_conn, in iser_err_comp()
989 ib_wc_status_msg(wc->status), wc->status); in iser_err_comp()