From 21322e01dd49020c4140a079361f4d73f9bffc3b Mon Sep 17 00:00:00 2001 From: Shuhei Matsumoto Date: Sat, 8 Jan 2022 08:21:48 +0900 Subject: [PATCH] nvme: Separate spdk_nvme_ctrlr_disconnect() into disconnect and after it Serparate spdk_nvme_ctrlr_disconnect() into nvme_ctrlr_disconnect() and nvme_ctrlr_disconnect_done() to call nvme_ctrlr_disconnect_done() after adminq is actually disconnected when disconnecting adminq asynchronously. The following patches will add a new flag is_disconnecting to struct spdk_nvme_ctrlr and prevent us from setting ctrlr->is_failed to true between nvme_ctrlr_disconnect() and nvme_ctrlr_disconnect_done(). By this patch, nvme_ctrlr_disconnect() and nvme_ctrlr_disconnect_done() are executed in the same context. So it is not possible to set ctrlr->is_failed to true between nvme_ctrlr_disconnect() and nvme_ctrlr_disconnect_done(). Hence nvme_ctrlr_disconnect_done() does not have to clear ctrlr->is_failed again. Signed-off-by: Shuhei Matsumoto Change-Id: I18b5b68f37e27b54782691823edae9738c26faa1 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/10999 Tested-by: SPDK CI Jenkins Community-CI: Broadcom CI Community-CI: Mellanox Build Bot Reviewed-by: Aleksey Marchuk Reviewed-by: Ben Walker --- lib/nvme/nvme_ctrlr.c | 37 +++++++++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/lib/nvme/nvme_ctrlr.c b/lib/nvme/nvme_ctrlr.c index 7ffa80f5f..5d7e570aa 100644 --- a/lib/nvme/nvme_ctrlr.c +++ b/lib/nvme/nvme_ctrlr.c @@ -1622,12 +1622,11 @@ nvme_ctrlr_abort_queued_aborts(struct spdk_nvme_ctrlr *ctrlr) } } -int -spdk_nvme_ctrlr_disconnect(struct spdk_nvme_ctrlr *ctrlr) +static int +nvme_ctrlr_disconnect(struct spdk_nvme_ctrlr *ctrlr) { struct spdk_nvme_qpair *qpair; - nvme_robust_mutex_lock(&ctrlr->ctrlr_lock); ctrlr->prepare_for_reset = false; if (ctrlr->is_resetting || ctrlr->is_removed) { @@ -1636,7 +1635,6 @@ spdk_nvme_ctrlr_disconnect(struct spdk_nvme_ctrlr *ctrlr) * immediately since there is no need to kick off another * reset in these cases. */ - nvme_robust_mutex_unlock(&ctrlr->ctrlr_lock); return ctrlr->is_resetting ? -EBUSY : -ENXIO; } @@ -1661,6 +1659,12 @@ spdk_nvme_ctrlr_disconnect(struct spdk_nvme_ctrlr *ctrlr) ctrlr->adminq->transport_failure_reason = SPDK_NVME_QPAIR_FAILURE_LOCAL; nvme_transport_ctrlr_disconnect_qpair(ctrlr, ctrlr->adminq); + return 0; +} + +static void +nvme_ctrlr_disconnect_done(struct spdk_nvme_ctrlr *ctrlr) +{ /* Doorbell buffer config is invalid during reset */ nvme_ctrlr_free_doorbell_buffer(ctrlr); @@ -1668,9 +1672,22 @@ spdk_nvme_ctrlr_disconnect(struct spdk_nvme_ctrlr *ctrlr) nvme_ctrlr_free_iocs_specific_data(ctrlr); spdk_bit_array_free(&ctrlr->free_io_qids); +} + +int +spdk_nvme_ctrlr_disconnect(struct spdk_nvme_ctrlr *ctrlr) +{ + int rc; + + nvme_robust_mutex_lock(&ctrlr->ctrlr_lock); + + rc = nvme_ctrlr_disconnect(ctrlr); + if (rc == 0) { + nvme_ctrlr_disconnect_done(ctrlr); + } nvme_robust_mutex_unlock(&ctrlr->ctrlr_lock); - return 0; + return rc; } void @@ -1769,7 +1786,15 @@ spdk_nvme_ctrlr_reset(struct spdk_nvme_ctrlr *ctrlr) { int rc; - rc = spdk_nvme_ctrlr_disconnect(ctrlr); + nvme_robust_mutex_lock(&ctrlr->ctrlr_lock); + + rc = nvme_ctrlr_disconnect(ctrlr); + if (rc == 0) { + nvme_ctrlr_disconnect_done(ctrlr); + } + + nvme_robust_mutex_unlock(&ctrlr->ctrlr_lock); + if (rc != 0) { if (rc == -EBUSY) { rc = 0;