From 584a63028725393cc35d5323767baa20e3b61189 Mon Sep 17 00:00:00 2001 From: Seth Howell Date: Mon, 30 Sep 2019 11:01:15 -0700 Subject: [PATCH] nvme: don't fail the ctrlr from ctrlr_process_init If we are to have multiple reconnect attempts, we have to control whetehr the controller is placed in the failed state from outside the reset function itself. This will allow us to fail the controller only after all of our retries are exhausted. Change-Id: Ia82e10325272f25b2b8527336dc3bc507c93b401 Signed-off-by: Seth Howell Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/469932 Tested-by: SPDK CI Jenkins Reviewed-by: Ben Walker Reviewed-by: Jim Harris Reviewed-by: Alexey Marchuk Reviewed-by: Paul Luse Community-CI: Broadcom SPDK FC-NVMe CI --- lib/nvme/nvme.c | 1 + lib/nvme/nvme_ctrlr.c | 5 ----- test/unit/lib/nvme/nvme.c/nvme_ut.c | 1 + 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/lib/nvme/nvme.c b/lib/nvme/nvme.c index 5edc1a7d6..49c75e54f 100644 --- a/lib/nvme/nvme.c +++ b/lib/nvme/nvme.c @@ -446,6 +446,7 @@ nvme_ctrlr_poll_internal(struct spdk_nvme_ctrlr *ctrlr, /* Controller failed to initialize. */ TAILQ_REMOVE(&probe_ctx->init_ctrlrs, ctrlr, tailq); SPDK_ERRLOG("Failed to initialize SSD: %s\n", ctrlr->trid.traddr); + nvme_ctrlr_fail(ctrlr, false); nvme_ctrlr_destruct(ctrlr); return rc; } diff --git a/lib/nvme/nvme_ctrlr.c b/lib/nvme/nvme_ctrlr.c index b717fd948..24ba487f9 100644 --- a/lib/nvme/nvme_ctrlr.c +++ b/lib/nvme/nvme_ctrlr.c @@ -2114,7 +2114,6 @@ nvme_ctrlr_process_init(struct spdk_nvme_ctrlr *ctrlr) goto init_timeout; } SPDK_ERRLOG("Failed to read CC and CSTS in state %d\n", ctrlr->state); - nvme_ctrlr_fail(ctrlr, false); return -EIO; } @@ -2161,7 +2160,6 @@ nvme_ctrlr_process_init(struct spdk_nvme_ctrlr *ctrlr) cc.bits.en = 0; if (nvme_ctrlr_set_cc(ctrlr, &cc)) { SPDK_ERRLOG("set_cc() failed\n"); - nvme_ctrlr_fail(ctrlr, false); return -EIO; } nvme_ctrlr_set_state(ctrlr, NVME_CTRLR_STATE_DISABLE_WAIT_FOR_READY_0, ready_timeout_in_ms); @@ -2193,7 +2191,6 @@ nvme_ctrlr_process_init(struct spdk_nvme_ctrlr *ctrlr) cc.bits.en = 0; if (nvme_ctrlr_set_cc(ctrlr, &cc)) { SPDK_ERRLOG("set_cc() failed\n"); - nvme_ctrlr_fail(ctrlr, false); return -EIO; } nvme_ctrlr_set_state(ctrlr, NVME_CTRLR_STATE_DISABLE_WAIT_FOR_READY_0, ready_timeout_in_ms); @@ -2348,7 +2345,6 @@ nvme_ctrlr_process_init(struct spdk_nvme_ctrlr *ctrlr) default: assert(0); - nvme_ctrlr_fail(ctrlr, false); return -1; } @@ -2356,7 +2352,6 @@ init_timeout: if (ctrlr->state_timeout_tsc != NVME_TIMEOUT_INFINITE && spdk_get_ticks() > ctrlr->state_timeout_tsc) { SPDK_ERRLOG("Initialization timed out in state %d\n", ctrlr->state); - nvme_ctrlr_fail(ctrlr, false); return -1; } diff --git a/test/unit/lib/nvme/nvme.c/nvme_ut.c b/test/unit/lib/nvme/nvme.c/nvme_ut.c index 21414c58b..a4acc9196 100644 --- a/test/unit/lib/nvme/nvme.c/nvme_ut.c +++ b/test/unit/lib/nvme/nvme.c/nvme_ut.c @@ -43,6 +43,7 @@ DEFINE_STUB_V(nvme_ctrlr_proc_get_ref, (struct spdk_nvme_ctrlr *ctrlr)); DEFINE_STUB_V(nvme_ctrlr_proc_put_ref, (struct spdk_nvme_ctrlr *ctrlr)); +DEFINE_STUB_V(nvme_ctrlr_fail, (struct spdk_nvme_ctrlr *ctrlr, bool hotremove)); DEFINE_STUB(spdk_nvme_transport_available, bool, (enum spdk_nvme_transport_type trtype), true); /* return anything non-NULL, this won't be deferenced anywhere in this test */