Commit a75243ae authored by Max Gurtovoy's avatar Max Gurtovoy Committed by Leon Romanovsky
Browse files

IB/iser: add safety checks for state_mutex lock



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: default avatarMax Gurtovoy <mgurtovoy@nvidia.com>
Link: https://lore.kernel.org/r/20221016093833.12537-3-mgurtovoy@nvidia.com


Reviewed-by: default avatarSergey Gorenko <sergeygo@nvidia.com>
Reviewed-by: default avatarSagi Grimberg <sagi@grimberg.me>
Signed-off-by: default avatarLeon Romanovsky <leon@kernel.org>
parent acc7d94a
Loading
Loading
Loading
Loading
+20 −6
Original line number Diff line number Diff line
@@ -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 @@ static void iser_route_handler(struct rdma_cm_id *cma_id)
	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