Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 96f15198 authored by Sagi Grimberg's avatar Sagi Grimberg Committed by Roland Dreier
Browse files

IB/iser: Extend iser_free_ib_conn_res()



Put all connection IB related resources release in this routine.  One
exception is the cm_id which cannot be destroyed as the routine is
protected by the state mutex.  Also move its position to avoid forward
declaration.  While at it fix qp NULL assignment.

Signed-off-by: default avatarSagi Grimberg <sagig@mellanox.com>
Signed-off-by: default avatarAriel Nahum <arieln@mellanox.com>
Signed-off-by: default avatarOr Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: default avatarRoland Dreier <roland@purestorage.com>
parent 6bb0279f
Loading
Loading
Loading
Loading
+30 −28
Original line number Diff line number Diff line
@@ -495,27 +495,6 @@ static int iser_create_ib_conn_res(struct ib_conn *ib_conn)
	return ret;
}

/**
 * releases the QP object
 */
static void iser_free_ib_conn_res(struct iser_conn *iser_conn)
{
	struct ib_conn *ib_conn = &iser_conn->ib_conn;

	iser_info("freeing conn %p cma_id %p qp %p\n",
		  ib_conn, ib_conn->cma_id,
		  ib_conn->qp);

	/* qp is created only once both addr & route are resolved */

	if (ib_conn->qp != NULL) {
		ib_conn->device->cq_active_qps[ib_conn->cq_index]--;
		rdma_destroy_qp(ib_conn->cma_id);
	}

	ib_conn->qp	  = NULL;
}

/**
 * based on the resolved device node GUID see if there already allocated
 * device for this device. If there's no such, create one.
@@ -607,13 +586,42 @@ void iser_release_work(struct work_struct *work)
	iser_conn_release(iser_conn);
}

/**
 * iser_free_ib_conn_res - release IB related resources
 * @iser_conn: iser connection struct
 *
 * This routine is called with the iser state mutex held
 * so the cm_id removal is out of here. It is Safe to
 * be invoked multiple times.
 */
static void iser_free_ib_conn_res(struct iser_conn *iser_conn)
{
	struct ib_conn *ib_conn = &iser_conn->ib_conn;
	struct iser_device *device = ib_conn->device;

	iser_info("freeing conn %p cma_id %p qp %p\n",
		  iser_conn, ib_conn->cma_id, ib_conn->qp);

	iser_free_rx_descriptors(iser_conn);

	if (ib_conn->qp != NULL) {
		ib_conn->device->cq_active_qps[ib_conn->cq_index]--;
		rdma_destroy_qp(ib_conn->cma_id);
		ib_conn->qp = NULL;
	}

	if (device != NULL) {
		iser_device_try_release(device);
		ib_conn->device = NULL;
	}
}

/**
 * Frees all conn objects and deallocs conn descriptor
 */
void iser_conn_release(struct iser_conn *iser_conn)
{
	struct ib_conn *ib_conn = &iser_conn->ib_conn;
	struct iser_device  *device = ib_conn->device;

	mutex_lock(&ig.connlist_mutex);
	list_del(&iser_conn->conn_list);
@@ -621,13 +629,7 @@ void iser_conn_release(struct iser_conn *iser_conn)

	mutex_lock(&iser_conn->state_mutex);
	BUG_ON(iser_conn->state != ISER_CONN_DOWN);

	iser_free_rx_descriptors(iser_conn);
	iser_free_ib_conn_res(iser_conn);
	ib_conn->device = NULL;
	/* on EVENT_ADDR_ERROR there's no device yet for this conn */
	if (device != NULL)
		iser_device_try_release(device);
	mutex_unlock(&iser_conn->state_mutex);

	if (ib_conn->cma_id != NULL) {