IB/iser: Collapse cleanup and disconnect handlers
authorAriel Nahum <arieln@mellanox.com>
Sun, 7 Dec 2014 14:09:54 +0000 (16:09 +0200)
committerRoland Dreier <roland@purestorage.com>
Tue, 16 Dec 2014 02:11:44 +0000 (18:11 -0800)
No real need to wait for TIMEWAIT_EXIT before we destroy the RDMA
resources (also TIMEAWAIT_EXIT is not guarenteed to always arrive).  As
for the cma_id, only destroy it if the state is not DOWN where in this
case, conn_release is already running and we don't want to compete.

Signed-off-by: Ariel Nahum <arieln@mellanox.com>
Signed-off-by: Sagi Grimberg <sagig@mellanox.com>
Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: Roland Dreier <roland@purestorage.com>
drivers/infiniband/ulp/iser/iser_verbs.c

index cd4acc5d94f10a27ec031f027612951618edbc2f..6a2a91c7cdb7a5572d0df4338a6c7a82e0e70f27 100644 (file)
@@ -629,9 +629,11 @@ void iser_conn_release(struct iser_conn *iser_conn)
        mutex_unlock(&ig.connlist_mutex);
 
        mutex_lock(&iser_conn->state_mutex);
-       if (iser_conn->state != ISER_CONN_DOWN)
+       if (iser_conn->state != ISER_CONN_DOWN) {
                iser_warn("iser conn %p state %d, expected state down.\n",
                          iser_conn, iser_conn->state);
+               iser_conn->state = ISER_CONN_DOWN;
+       }
        /*
         * In case we never got to bind stage, we still need to
         * release IB resources (which is safe to call more than once).
@@ -867,20 +869,21 @@ static int iser_cma_handler(struct rdma_cm_id *cma_id, struct rdma_cm_event *eve
                break;
        case RDMA_CM_EVENT_DISCONNECTED:
        case RDMA_CM_EVENT_ADDR_CHANGE:
-               iser_disconnected_handler(cma_id);
+       case RDMA_CM_EVENT_TIMEWAIT_EXIT:
+               iser_cleanup_handler(cma_id, false);
                break;
        case RDMA_CM_EVENT_DEVICE_REMOVAL:
                /*
                 * we *must* destroy the device as we cannot rely
                 * on iscsid to be around to initiate error handling.
-                * also implicitly destroy the cma_id.
+                * also if we are not in state DOWN implicitly destroy
+                * the cma_id.
                 */
                iser_cleanup_handler(cma_id, true);
-               iser_conn->ib_conn.cma_id = NULL;
-               ret = 1;
-               break;
-       case RDMA_CM_EVENT_TIMEWAIT_EXIT:
-               iser_cleanup_handler(cma_id, false);
+               if (iser_conn->state != ISER_CONN_DOWN) {
+                       iser_conn->ib_conn.cma_id = NULL;
+                       ret = 1;
+               }
                break;
        default:
                iser_err("Unexpected RDMA CM event (%d)\n", event->event);