From 9d1063d732a05bf594923b54604bc4f0e0720342 Mon Sep 17 00:00:00 2001 From: Shuhei Matsumoto Date: Tue, 11 Jan 2022 20:32:57 +0900 Subject: [PATCH] nvme: qpair_process_completions() processes if qpair is disconnecting If poll group is not used and if qpair is disconnecting, spdk_nvme_qpair_process_completions() has to poll qpair until it is actually disconnected even if ctrlr is failed. Signed-off-by: Shuhei Matsumoto Change-Id: I6da84f1e35780d21480fbe6f07e76af3048a777b Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/11018 Community-CI: Broadcom CI Community-CI: Mellanox Build Bot Reviewed-by: Aleksey Marchuk Reviewed-by: Ben Walker Tested-by: SPDK CI Jenkins --- lib/nvme/nvme_qpair.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/lib/nvme/nvme_qpair.c b/lib/nvme/nvme_qpair.c index c48d4083b..1d0eb6ddd 100644 --- a/lib/nvme/nvme_qpair.c +++ b/lib/nvme/nvme_qpair.c @@ -719,7 +719,8 @@ spdk_nvme_qpair_process_completions(struct spdk_nvme_qpair *qpair, uint32_t max_ int32_t ret; struct nvme_request *req, *tmp; - if (spdk_unlikely(qpair->ctrlr->is_failed)) { + if (spdk_unlikely(qpair->ctrlr->is_failed && + nvme_qpair_get_state(qpair) != NVME_QPAIR_DISCONNECTING)) { if (qpair->ctrlr->is_removed) { nvme_qpair_set_state(qpair, NVME_QPAIR_DESTROYING); nvme_qpair_abort_all_queued_reqs(qpair, 0); @@ -729,7 +730,8 @@ spdk_nvme_qpair_process_completions(struct spdk_nvme_qpair *qpair, uint32_t max_ } if (spdk_unlikely(!nvme_qpair_check_enabled(qpair) && - !(nvme_qpair_get_state(qpair) == NVME_QPAIR_CONNECTING))) { + !(nvme_qpair_get_state(qpair) == NVME_QPAIR_CONNECTING || + nvme_qpair_get_state(qpair) == NVME_QPAIR_DISCONNECTING))) { /* * qpair is not enabled, likely because a controller reset is * in progress. @@ -752,9 +754,14 @@ spdk_nvme_qpair_process_completions(struct spdk_nvme_qpair *qpair, uint32_t max_ qpair->in_completion_context = 1; ret = nvme_transport_qpair_process_completions(qpair, max_completions); if (ret < 0) { - SPDK_ERRLOG("CQ transport error %d (%s) on qpair id %hu\n", ret, spdk_strerror(-ret), qpair->id); - if (nvme_qpair_is_admin_queue(qpair)) { - nvme_ctrlr_fail(qpair->ctrlr, false); + if (ret == -ENXIO && nvme_qpair_get_state(qpair) == NVME_QPAIR_DISCONNECTING) { + ret = 0; + } else { + SPDK_ERRLOG("CQ transport error %d (%s) on qpair id %hu\n", + ret, spdk_strerror(-ret), qpair->id); + if (nvme_qpair_is_admin_queue(qpair)) { + nvme_ctrlr_fail(qpair->ctrlr, false); + } } } qpair->in_completion_context = 0;