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:
parent
1d58eb038b
commit
0e4b13dc53
@ -2001,10 +2001,6 @@ static void nvme_rdma_qpair_abort_reqs(struct spdk_nvme_qpair *qpair, uint32_t d
|
|||||||
static int
|
static int
|
||||||
nvme_rdma_qpair_disconnected(struct nvme_rdma_qpair *rqpair, int ret)
|
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);
|
nvme_rdma_qpair_abort_reqs(&rqpair->qpair, 0);
|
||||||
|
|
||||||
if (ret) {
|
if (ret) {
|
||||||
@ -2012,9 +2008,9 @@ nvme_rdma_qpair_disconnected(struct nvme_rdma_qpair *rqpair, int ret)
|
|||||||
goto quiet;
|
goto quiet;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (qpair->poll_group == NULL) {
|
if (rqpair->poller == NULL) {
|
||||||
/* If poll group is not used, cq is already destroyed. So complete
|
/* If poller is not used, cq is not shared or already destroyed.
|
||||||
* disconnecting qpair immediately.
|
* So complete disconnecting qpair immediately.
|
||||||
*/
|
*/
|
||||||
goto quiet;
|
goto quiet;
|
||||||
}
|
}
|
||||||
@ -2030,6 +2026,7 @@ nvme_rdma_qpair_disconnected(struct nvme_rdma_qpair *rqpair, int ret)
|
|||||||
quiet:
|
quiet:
|
||||||
rqpair->state = NVME_RDMA_QPAIR_STATE_EXITED;
|
rqpair->state = NVME_RDMA_QPAIR_STATE_EXITED;
|
||||||
|
|
||||||
|
nvme_rdma_qpair_destroy(rqpair);
|
||||||
nvme_transport_ctrlr_disconnect_qpair_done(&rqpair->qpair);
|
nvme_transport_ctrlr_disconnect_qpair_done(&rqpair->qpair);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -2045,6 +2042,7 @@ nvme_rdma_qpair_wait_until_quiet(struct nvme_rdma_qpair *rqpair)
|
|||||||
|
|
||||||
rqpair->state = NVME_RDMA_QPAIR_STATE_EXITED;
|
rqpair->state = NVME_RDMA_QPAIR_STATE_EXITED;
|
||||||
|
|
||||||
|
nvme_rdma_qpair_destroy(rqpair);
|
||||||
nvme_transport_ctrlr_disconnect_qpair_done(&rqpair->qpair);
|
nvme_transport_ctrlr_disconnect_qpair_done(&rqpair->qpair);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user