IB/iser: add safety checks for state_mutex lock
authorMax Gurtovoy <mgurtovoy@nvidia.com>
Sun, 16 Oct 2022 09:38:32 +0000 (12:38 +0300)
committerLeon Romanovsky <leon@kernel.org>
Wed, 19 Oct 2022 07:38:35 +0000 (10:38 +0300)
In some cases, we need to make sure that state_mutex is taken. Use
lockdep_assert_held to warn us in case it doesn't while it should.

Signed-off-by: Max Gurtovoy <mgurtovoy@nvidia.com>
Link: https://lore.kernel.org/r/20221016093833.12537-3-mgurtovoy@nvidia.com
Reviewed-by: Sergey Gorenko <sergeygo@nvidia.com>
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
Signed-off-by: Leon Romanovsky <leon@kernel.org>
drivers/infiniband/ulp/iser/iser_verbs.c

index a73c302..f33e3a7 100644 (file)
@@ -448,6 +448,8 @@ int iser_conn_terminate(struct iser_conn *iser_conn)
        struct ib_conn *ib_conn = &iser_conn->ib_conn;
        int err = 0;
 
+       lockdep_assert_held(&iser_conn->state_mutex);
+
        /* terminate the iser conn only if the conn state is UP */
        if (iser_conn->state != ISER_CONN_UP)
                return 0;
@@ -482,9 +484,10 @@ int iser_conn_terminate(struct iser_conn *iser_conn)
  */
 static void iser_connect_error(struct rdma_cm_id *cma_id)
 {
-       struct iser_conn *iser_conn;
+       struct iser_conn *iser_conn = cma_id->context;
+
+       lockdep_assert_held(&iser_conn->state_mutex);
 
-       iser_conn = cma_id->context;
        iser_conn->state = ISER_CONN_TERMINATING;
 }
 
@@ -526,12 +529,13 @@ static void iser_calc_scsi_params(struct iser_conn *iser_conn,
  */
 static void iser_addr_handler(struct rdma_cm_id *cma_id)
 {
+       struct iser_conn *iser_conn = cma_id->context;
        struct iser_device *device;
-       struct iser_conn *iser_conn;
        struct ib_conn *ib_conn;
        int    ret;
 
-       iser_conn = cma_id->context;
+       lockdep_assert_held(&iser_conn->state_mutex);
+
        if (iser_conn->state != ISER_CONN_PENDING)
                /* bailout */
                return;
@@ -581,6 +585,8 @@ static void iser_route_handler(struct rdma_cm_id *cma_id)
        struct ib_conn *ib_conn = &iser_conn->ib_conn;
        struct ib_device *ib_dev = ib_conn->device->ib_device;
 
+       lockdep_assert_held(&iser_conn->state_mutex);
+
        if (iser_conn->state != ISER_CONN_PENDING)
                /* bailout */
                return;
@@ -613,14 +619,18 @@ failure:
        iser_connect_error(cma_id);
 }
 
+/*
+ * Called with state mutex held
+ */
 static void iser_connected_handler(struct rdma_cm_id *cma_id,
                                   const void *private_data)
 {
-       struct iser_conn *iser_conn;
+       struct iser_conn *iser_conn = cma_id->context;
        struct ib_qp_attr attr;
        struct ib_qp_init_attr init_attr;
 
-       iser_conn = cma_id->context;
+       lockdep_assert_held(&iser_conn->state_mutex);
+
        if (iser_conn->state != ISER_CONN_PENDING)
                /* bailout */
                return;
@@ -654,11 +664,15 @@ static void iser_disconnected_handler(struct rdma_cm_id *cma_id)
        }
 }
 
+/*
+ * Called with state mutex held
+ */
 static void iser_cleanup_handler(struct rdma_cm_id *cma_id,
                                 bool destroy)
 {
        struct iser_conn *iser_conn = cma_id->context;
 
+       lockdep_assert_held(&iser_conn->state_mutex);
        /*
         * We are not guaranteed that we visited disconnected_handler
         * by now, call it here to be safe that we handle CM drep