Commit 34479d74 authored by Kaiqi Chen's avatar Kaiqi Chen Committed by Tomasz Zawadzki
Browse files

nvmf/rdma: allow each spdk_nvmf_rdma_qpair save its own listen_trid



This patch allows spdk_nvmf_rdma_qpair to save its own listen_trid
instead of retrieving it from listen_id each time. With this change, the
listener can be stopped and the listen_id can be freed even while qpairs
still exist.

Change-Id: I0a5f0592b1d6ca181ba51c8e9fd42cbbd549fd11
Signed-off-by: default avatarKaiqi Chen <kaiqi.chen@smartx.com>
Reviewed-on: https://review.spdk.io/c/spdk/spdk/+/26262


Community-CI: Mellanox Build Bot
Reviewed-by: default avatarChangpeng Liu <changpeliu@tencent.com>
Tested-by: default avatarSPDK Automated Test System <spdkbot@gmail.com>
Reviewed-by: default avatarJim Harris <jim.harris@nvidia.com>
parent 4d01c21b
Loading
Loading
Loading
Loading
+11 −6
Original line number Diff line number Diff line
@@ -387,6 +387,10 @@ struct spdk_nvmf_rdma_qpair {

	/* Indicate that nvmf_rdma_close_qpair is called */
	bool					to_close;

	/* Save the listen_trid by rqpair itself instead of get it from listen_id
	 * everytime, because the listen_id may be freed before the qpair is destroyed */
	struct spdk_nvme_transport_id		listen_trid;
};

struct spdk_nvmf_rdma_poller_stat {
@@ -1272,6 +1276,10 @@ nvmf_rdma_event_reject(struct rdma_cm_id *id, enum spdk_nvmf_rdma_transport_erro
	rdma_reject(id, &rej_data, sizeof(rej_data));
}

static void nvmf_rdma_trid_from_cm_id(struct rdma_cm_id *id,
				      struct spdk_nvme_transport_id *trid,
				      bool peer);

static int
nvmf_rdma_connect(struct spdk_nvmf_transport *transport, struct rdma_cm_event *event)
{
@@ -1390,6 +1398,8 @@ nvmf_rdma_connect(struct spdk_nvmf_transport *transport, struct rdma_cm_event *e

	spdk_nvmf_tgt_new_qpair(transport->tgt, &rqpair->qpair);

	nvmf_rdma_trid_from_cm_id(rqpair->listen_id, &rqpair->listen_trid, false);

	return 0;
}

@@ -5062,12 +5072,7 @@ nvmf_rdma_qpair_get_listen_trid(struct spdk_nvmf_qpair *qpair,

	rqpair = SPDK_CONTAINEROF(qpair, struct spdk_nvmf_rdma_qpair, qpair);

	if (rqpair->listen_id == NULL) {
		SPDK_ERRLOG("listen_id is NULL for qpair %p\n", qpair);
		assert(false);
	}

	nvmf_rdma_trid_from_cm_id(rqpair->listen_id, trid, false);
	memcpy(trid, &rqpair->listen_trid, sizeof(struct spdk_nvme_transport_id));

	return 0;
}