From 09c7c76876c239c62179dba6e9ac8855c65784bb Mon Sep 17 00:00:00 2001 From: Shuhei Matsumoto Date: Thu, 19 May 2022 10:44:10 +0900 Subject: [PATCH] nvme: Set I/O qpairs to failed only if reset is synchronous For PCIe transport, we need to stop any activity of the controller before deleting I/O qpair resource in a controller reset sequence. However, we set I/O qpairs to failed before disabling a controller. In the NVMe bdev module, this caused disconnected qpair callback to delete I/O qpairs before disabling the controller. Hence, change the code slightly to set I/O qpairs to failed only if reset is synchronous to keep backward compatibility. Signed-off-by: Shuhei Matsumoto Change-Id: Ica71aad0a1dabce45616dfdfff5f11b07131bbd1 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/12736 Community-CI: Broadcom CI Tested-by: SPDK CI Jenkins Reviewed-by: Ben Walker Reviewed-by: Michael Haeuptle Reviewed-by: Jim Harris Reviewed-by: Aleksey Marchuk --- lib/nvme/nvme_ctrlr.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/lib/nvme/nvme_ctrlr.c b/lib/nvme/nvme_ctrlr.c index 30bbab3a6..9dce3e262 100644 --- a/lib/nvme/nvme_ctrlr.c +++ b/lib/nvme/nvme_ctrlr.c @@ -1632,8 +1632,6 @@ nvme_ctrlr_abort_queued_aborts(struct spdk_nvme_ctrlr *ctrlr) static int nvme_ctrlr_disconnect(struct spdk_nvme_ctrlr *ctrlr) { - struct spdk_nvme_qpair *qpair; - if (ctrlr->is_resetting || ctrlr->is_removed) { /* * Controller is already resetting or has been removed. Return @@ -1658,11 +1656,6 @@ nvme_ctrlr_disconnect(struct spdk_nvme_ctrlr *ctrlr) nvme_transport_admin_qpair_abort_aers(ctrlr->adminq); - /* Disable all queues before disabling the controller hardware. */ - TAILQ_FOREACH(qpair, &ctrlr->active_io_qpairs, tailq) { - qpair->transport_failure_reason = SPDK_NVME_QPAIR_FAILURE_LOCAL; - } - ctrlr->adminq->transport_failure_reason = SPDK_NVME_QPAIR_FAILURE_LOCAL; nvme_transport_ctrlr_disconnect_qpair(ctrlr, ctrlr->adminq); @@ -1820,6 +1813,16 @@ nvme_ctrlr_disable_poll(struct spdk_nvme_ctrlr *ctrlr) return rc; } +static void +nvme_ctrlr_fail_io_qpairs(struct spdk_nvme_ctrlr *ctrlr) +{ + struct spdk_nvme_qpair *qpair; + + TAILQ_FOREACH(qpair, &ctrlr->active_io_qpairs, tailq) { + qpair->transport_failure_reason = SPDK_NVME_QPAIR_FAILURE_LOCAL; + } +} + int spdk_nvme_ctrlr_reset(struct spdk_nvme_ctrlr *ctrlr) { @@ -1828,6 +1831,9 @@ spdk_nvme_ctrlr_reset(struct spdk_nvme_ctrlr *ctrlr) nvme_robust_mutex_lock(&ctrlr->ctrlr_lock); rc = nvme_ctrlr_disconnect(ctrlr); + if (rc == 0) { + nvme_ctrlr_fail_io_qpairs(ctrlr); + } nvme_robust_mutex_unlock(&ctrlr->ctrlr_lock);