Commit 0354bb8e authored by Alexey Marchuk's avatar Alexey Marchuk Committed by Ben Walker
Browse files

nvme/rdma: Force qp disconnect on pg remove



If a qpair is removed from a poll group and it still
has a poller, we must force qpair disconnect because
otherwise group reference is removed an we wont' be
able to release the poller

Signed-off-by: default avatarAlexey Marchuk <alexeymar@nvidia.com>
Change-Id: I42699e4a692e6b878a828812328737a729e0295e
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/25513


Reviewed-by: default avatarJim Harris <jim.harris@nvidia.com>
Reviewed-by: default avatarBen Walker <ben@nvidia.com>
Community-CI: Community CI Samsung <spdk.community.ci.samsung@gmail.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Mellanox Build Bot
parent 0ea9ac02
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -3369,6 +3369,15 @@ nvme_rdma_poll_group_remove(struct spdk_nvme_transport_poll_group *tgroup,
	struct nvme_rdma_qpair *rqpair = nvme_rdma_qpair(qpair);
	struct nvme_rdma_poll_group *group = nvme_rdma_poll_group(qpair->poll_group);

	if (rqpair->poller) {
		/* A qpair may skip transport disconnect part if it was already disconnecting. But on RDMA level a qpair
		 * may still have a poller reference. In that case we should continue transport disconnect here
		 * because a poller depends on the poll group reference which is going to be removed */
		SPDK_INFOLOG(nvme, "qpair %p, id %u, nvme state %d, rdma state %d, force disconnect\n",
			     qpair, qpair->id, qpair->state, rqpair->state);
		nvme_rdma_ctrlr_disconnect_qpair(qpair->ctrlr, qpair);
	}

	if (rqpair->link_active.tqe_prev) {
		TAILQ_REMOVE(&group->active_qpairs, rqpair, link_active);
		rqpair->link_active.tqe_prev = NULL;