aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/infiniband')
-rw-r--r--drivers/infiniband/ulp/iser/iser_verbs.c58
1 files changed, 30 insertions, 28 deletions
diff --git a/drivers/infiniband/ulp/iser/iser_verbs.c b/drivers/infiniband/ulp/iser/iser_verbs.c
index e69aba8eabec..e4299743c459 100644
--- a/drivers/infiniband/ulp/iser/iser_verbs.c
+++ b/drivers/infiniband/ulp/iser/iser_verbs.c
@@ -496,27 +496,6 @@ out_err:
496} 496}
497 497
498/** 498/**
499 * releases the QP object
500 */
501static void iser_free_ib_conn_res(struct iser_conn *iser_conn)
502{
503 struct ib_conn *ib_conn = &iser_conn->ib_conn;
504
505 iser_info("freeing conn %p cma_id %p qp %p\n",
506 ib_conn, ib_conn->cma_id,
507 ib_conn->qp);
508
509 /* qp is created only once both addr & route are resolved */
510
511 if (ib_conn->qp != NULL) {
512 ib_conn->device->cq_active_qps[ib_conn->cq_index]--;
513 rdma_destroy_qp(ib_conn->cma_id);
514 }
515
516 ib_conn->qp = NULL;
517}
518
519/**
520 * based on the resolved device node GUID see if there already allocated 499 * based on the resolved device node GUID see if there already allocated
521 * device for this device. If there's no such, create one. 500 * device for this device. If there's no such, create one.
522 */ 501 */
@@ -608,12 +587,41 @@ void iser_release_work(struct work_struct *work)
608} 587}
609 588
610/** 589/**
590 * iser_free_ib_conn_res - release IB related resources
591 * @iser_conn: iser connection struct
592 *
593 * This routine is called with the iser state mutex held
594 * so the cm_id removal is out of here. It is Safe to
595 * be invoked multiple times.
596 */
597static void iser_free_ib_conn_res(struct iser_conn *iser_conn)
598{
599 struct ib_conn *ib_conn = &iser_conn->ib_conn;
600 struct iser_device *device = ib_conn->device;
601
602 iser_info("freeing conn %p cma_id %p qp %p\n",
603 iser_conn, ib_conn->cma_id, ib_conn->qp);
604
605 iser_free_rx_descriptors(iser_conn);
606
607 if (ib_conn->qp != NULL) {
608 ib_conn->device->cq_active_qps[ib_conn->cq_index]--;
609 rdma_destroy_qp(ib_conn->cma_id);
610 ib_conn->qp = NULL;
611 }
612
613 if (device != NULL) {
614 iser_device_try_release(device);
615 ib_conn->device = NULL;
616 }
617}
618
619/**
611 * Frees all conn objects and deallocs conn descriptor 620 * Frees all conn objects and deallocs conn descriptor
612 */ 621 */
613void iser_conn_release(struct iser_conn *iser_conn) 622void iser_conn_release(struct iser_conn *iser_conn)
614{ 623{
615 struct ib_conn *ib_conn = &iser_conn->ib_conn; 624 struct ib_conn *ib_conn = &iser_conn->ib_conn;
616 struct iser_device *device = ib_conn->device;
617 625
618 mutex_lock(&ig.connlist_mutex); 626 mutex_lock(&ig.connlist_mutex);
619 list_del(&iser_conn->conn_list); 627 list_del(&iser_conn->conn_list);
@@ -621,13 +629,7 @@ void iser_conn_release(struct iser_conn *iser_conn)
621 629
622 mutex_lock(&iser_conn->state_mutex); 630 mutex_lock(&iser_conn->state_mutex);
623 BUG_ON(iser_conn->state != ISER_CONN_DOWN); 631 BUG_ON(iser_conn->state != ISER_CONN_DOWN);
624
625 iser_free_rx_descriptors(iser_conn);
626 iser_free_ib_conn_res(iser_conn); 632 iser_free_ib_conn_res(iser_conn);
627 ib_conn->device = NULL;
628 /* on EVENT_ADDR_ERROR there's no device yet for this conn */
629 if (device != NULL)
630 iser_device_try_release(device);
631 mutex_unlock(&iser_conn->state_mutex); 633 mutex_unlock(&iser_conn->state_mutex);
632 634
633 if (ib_conn->cma_id != NULL) { 635 if (ib_conn->cma_id != NULL) {