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: Shuhei 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: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Aleksey Marchuk <alexeymar@nvidia.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
This commit is contained in:
Shuhei Matsumoto 2022-08-31 12:19:29 +09:00 committed by Tomasz Zawadzki
parent 1d58eb038b
commit 0e4b13dc53

View File

@ -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;