Commit 0e4b13dc authored by Shuhei Matsumoto's avatar Shuhei Matsumoto Committed by Tomasz Zawadzki
Browse files

nvme_rdma: Destroy qpair after it is disconnected and drained



By the previous patches, a qpair is destroyed after it is actually
disconnected.

But after the qpair is destroyed, it is checked if drained by using
rqpair->current_num_sends and rqpair->current_num_recvs.

However, if the qpair is the last of a poller of a poll group,
CQ is destroyed before checking if the qpair is drained.

If CQ is destroyed, at least rqpair->current_num_recvs is not updated,
and we may get one second timeout.

This should be avoided.

Hence, destroy the qpair after it is disconnected and drained.

Signed-off-by: default avatarShuhei Matsumoto <smatsumoto@nvidia.com>
Change-Id: Ibd6c83e8a3e7b6e11e9b45cee42669da6d42a621
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/14278


Community-CI: Mellanox Build Bot
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarAleksey Marchuk <alexeymar@nvidia.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
parent 1d58eb03
Loading
Loading
Loading
Loading
+5 −7
Original line number Diff line number Diff line
@@ -2001,10 +2001,6 @@ static void nvme_rdma_qpair_abort_reqs(struct spdk_nvme_qpair *qpair, uint32_t d
static int
nvme_rdma_qpair_disconnected(struct nvme_rdma_qpair *rqpair, int ret)
{
	struct spdk_nvme_qpair *qpair = &rqpair->qpair;

	nvme_rdma_qpair_destroy(rqpair);

	nvme_rdma_qpair_abort_reqs(&rqpair->qpair, 0);

	if (ret) {
@@ -2012,9 +2008,9 @@ nvme_rdma_qpair_disconnected(struct nvme_rdma_qpair *rqpair, int ret)
		goto quiet;
	}

	if (qpair->poll_group == NULL) {
		/* If poll group is not used, cq is already destroyed. So complete
		 * disconnecting qpair immediately.
	if (rqpair->poller == NULL) {
		/* If poller is not used, cq is not shared or already destroyed.
		 * So complete disconnecting qpair immediately.
		 */
		goto quiet;
	}
@@ -2030,6 +2026,7 @@ nvme_rdma_qpair_disconnected(struct nvme_rdma_qpair *rqpair, int ret)
quiet:
	rqpair->state = NVME_RDMA_QPAIR_STATE_EXITED;

	nvme_rdma_qpair_destroy(rqpair);
	nvme_transport_ctrlr_disconnect_qpair_done(&rqpair->qpair);

	return 0;
@@ -2045,6 +2042,7 @@ nvme_rdma_qpair_wait_until_quiet(struct nvme_rdma_qpair *rqpair)

	rqpair->state = NVME_RDMA_QPAIR_STATE_EXITED;

	nvme_rdma_qpair_destroy(rqpair);
	nvme_transport_ctrlr_disconnect_qpair_done(&rqpair->qpair);

	return 0;