From b874f65743bf2ee03e06418047bcecf1d3b7a063 Mon Sep 17 00:00:00 2001 From: Seth Howell Date: Tue, 14 Apr 2020 15:47:47 -0700 Subject: [PATCH] lib/nvme: disconnect qpairs if they are failed during reset. Signed-off-by: Seth Howell Change-Id: I15079cb35d48221bd92b7ca41766148fdb58e668 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/1855 Community-CI: Mellanox Build Bot Reviewed-by: Ben Walker Reviewed-by: Aleksey Marchuk Reviewed-by: Shuhei Matsumoto Tested-by: SPDK CI Jenkins --- lib/nvme/nvme_qpair.c | 16 ++++++++++++++++ test/unit/lib/nvme/nvme_qpair.c/nvme_qpair_ut.c | 3 +++ 2 files changed, 19 insertions(+) diff --git a/lib/nvme/nvme_qpair.c b/lib/nvme/nvme_qpair.c index b5562a713..e943852ac 100644 --- a/lib/nvme/nvme_qpair.c +++ b/lib/nvme/nvme_qpair.c @@ -429,6 +429,22 @@ nvme_qpair_check_enabled(struct spdk_nvme_qpair *qpair) } } + /* + * When doing a reset, we must disconnect the qpair on the proper core. + * Note, reset is the only case where we set the failure reason without + * setting the qpair state since reset is done at the generic layer on the + * controller thread and we can't disconnect I/O qpairs from the controller + * thread. + */ + if (qpair->transport_failure_reason != SPDK_NVME_QPAIR_FAILURE_NONE && + nvme_qpair_get_state(qpair) == NVME_QPAIR_ENABLED) { + /* Don't disconnect PCIe qpairs. They are a special case for reset. */ + if (qpair->ctrlr->trid.trtype != SPDK_NVME_TRANSPORT_PCIE) { + nvme_ctrlr_disconnect_qpair(qpair); + } + return false; + } + return nvme_qpair_get_state(qpair) == NVME_QPAIR_ENABLED; } diff --git a/test/unit/lib/nvme/nvme_qpair.c/nvme_qpair_ut.c b/test/unit/lib/nvme/nvme_qpair.c/nvme_qpair_ut.c index 3457c6680..e34c70413 100644 --- a/test/unit/lib/nvme/nvme_qpair.c/nvme_qpair_ut.c +++ b/test/unit/lib/nvme/nvme_qpair.c/nvme_qpair_ut.c @@ -52,6 +52,9 @@ DEFINE_STUB_V(nvme_transport_qpair_abort_reqs, (struct spdk_nvme_qpair *qpair, u DEFINE_STUB(nvme_transport_qpair_submit_request, int, (struct spdk_nvme_qpair *qpair, struct nvme_request *req), 0); DEFINE_STUB(spdk_nvme_ctrlr_free_io_qpair, int, (struct spdk_nvme_qpair *qpair), 0); +DEFINE_STUB_V(nvme_transport_ctrlr_disconnect_qpair, (struct spdk_nvme_ctrlr *ctrlr, + struct spdk_nvme_qpair *qpair)); +DEFINE_STUB_V(nvme_ctrlr_disconnect_qpair, (struct spdk_nvme_qpair *qpair)); void nvme_ctrlr_fail(struct spdk_nvme_ctrlr *ctrlr, bool hot_remove)