From f366e261a623fb17e6a8b36b17e16db0d36cb40a Mon Sep 17 00:00:00 2001 From: Jim Harris Date: Mon, 6 May 2019 15:29:24 -0700 Subject: [PATCH] nvme: abort aers at common layer We submit AERs to all controllers - both pcie and fabrics. But currently we only manually abort the aers when disabling the qpair for pcie. Make this common instead by creating a new transport function for aborting aers. Signed-off-by: Jim Harris Change-Id: I1e926b61b8035488cdc6e8cb4336b373732f985e Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/453482 Tested-by: SPDK CI Jenkins Reviewed-by: Ben Walker Reviewed-by: Shuhei Matsumoto Reviewed-by: Changpeng Liu --- lib/nvme/nvme_ctrlr.c | 5 ++++ lib/nvme/nvme_internal.h | 3 ++- lib/nvme/nvme_pcie.c | 3 +-- lib/nvme/nvme_rdma.c | 23 +++++++++++++++++++ lib/nvme/nvme_tcp.c | 23 +++++++++++++++++++ lib/nvme/nvme_transport.c | 6 +++++ .../lib/nvme/nvme_ctrlr.c/nvme_ctrlr_ut.c | 5 ++++ 7 files changed, 65 insertions(+), 3 deletions(-) diff --git a/lib/nvme/nvme_ctrlr.c b/lib/nvme/nvme_ctrlr.c index 80a39765b..b6c204dd6 100644 --- a/lib/nvme/nvme_ctrlr.c +++ b/lib/nvme/nvme_ctrlr.c @@ -842,6 +842,8 @@ spdk_nvme_ctrlr_reset(struct spdk_nvme_ctrlr *ctrlr) ctrlr->outstanding_aborts--; } + nvme_transport_admin_qpair_abort_aers(ctrlr->adminq); + /* Disable all queues before disabling the controller hardware. */ nvme_qpair_disable(ctrlr->adminq); TAILQ_FOREACH(qpair, &ctrlr->active_io_qpairs, tailq) { @@ -2283,6 +2285,9 @@ nvme_ctrlr_destruct(struct spdk_nvme_ctrlr *ctrlr) struct spdk_nvme_qpair *qpair, *tmp; SPDK_DEBUGLOG(SPDK_LOG_NVME, "Prepare to destruct SSD: %s\n", ctrlr->trid.traddr); + + nvme_transport_admin_qpair_abort_aers(ctrlr->adminq); + TAILQ_FOREACH_SAFE(qpair, &ctrlr->active_io_qpairs, tailq, tmp) { spdk_nvme_ctrlr_free_io_qpair(qpair); } diff --git a/lib/nvme/nvme_internal.h b/lib/nvme/nvme_internal.h index 4bed02521..9e3c75dc1 100644 --- a/lib/nvme/nvme_internal.h +++ b/lib/nvme/nvme_internal.h @@ -993,7 +993,8 @@ struct spdk_nvme_ctrlr *spdk_nvme_get_ctrlr_by_trid_unsafe( int nvme_ ## name ## _qpair_reset(struct spdk_nvme_qpair *qpair); \ int nvme_ ## name ## _qpair_fail(struct spdk_nvme_qpair *qpair); \ int nvme_ ## name ## _qpair_submit_request(struct spdk_nvme_qpair *qpair, struct nvme_request *req); \ - int32_t nvme_ ## name ## _qpair_process_completions(struct spdk_nvme_qpair *qpair, uint32_t max_completions); + int32_t nvme_ ## name ## _qpair_process_completions(struct spdk_nvme_qpair *qpair, uint32_t max_completions); \ + void nvme_ ## name ## _admin_qpair_abort_aers(struct spdk_nvme_qpair *qpair); \ DECLARE_TRANSPORT(transport) /* generic transport dispatch functions */ DECLARE_TRANSPORT(pcie) diff --git a/lib/nvme/nvme_pcie.c b/lib/nvme/nvme_pcie.c index 66c778993..1540be63e 100644 --- a/lib/nvme/nvme_pcie.c +++ b/lib/nvme/nvme_pcie.c @@ -1360,7 +1360,7 @@ nvme_pcie_qpair_abort_trackers(struct spdk_nvme_qpair *qpair, uint32_t dnr) } } -static void +void nvme_pcie_admin_qpair_abort_aers(struct spdk_nvme_qpair *qpair) { struct nvme_pcie_qpair *pqpair = nvme_pcie_qpair(qpair); @@ -1448,7 +1448,6 @@ nvme_pcie_qpair_enable(struct spdk_nvme_qpair *qpair) static void nvme_pcie_admin_qpair_disable(struct spdk_nvme_qpair *qpair) { - nvme_pcie_admin_qpair_abort_aers(qpair); } static void diff --git a/lib/nvme/nvme_rdma.c b/lib/nvme/nvme_rdma.c index 00ff4a1b9..5055af252 100644 --- a/lib/nvme/nvme_rdma.c +++ b/lib/nvme/nvme_rdma.c @@ -1790,6 +1790,29 @@ nvme_rdma_ctrlr_free_cmb_io_buffer(struct spdk_nvme_ctrlr *ctrlr, void *buf, siz return 0; } +void +nvme_rdma_admin_qpair_abort_aers(struct spdk_nvme_qpair *qpair) +{ + struct spdk_nvme_rdma_req *rdma_req, *tmp; + struct nvme_request *req; + struct spdk_nvme_cpl cpl; + struct nvme_rdma_qpair *rqpair = nvme_rdma_qpair(qpair); + + cpl.status.sc = SPDK_NVME_SC_ABORTED_SQ_DELETION; + cpl.status.sct = SPDK_NVME_SCT_GENERIC; + + TAILQ_FOREACH_SAFE(rdma_req, &rqpair->outstanding_reqs, link, tmp) { + if (rdma_req->req->cmd.opc != SPDK_NVME_OPC_ASYNC_EVENT_REQUEST) { + continue; + } + assert(rdma_req->req != NULL); + req = rdma_req->req; + + nvme_rdma_req_complete(req, &cpl); + nvme_rdma_req_put(rqpair, rdma_req); + } +} + void spdk_nvme_rdma_init_hooks(struct spdk_nvme_rdma_hooks *hooks) { diff --git a/lib/nvme/nvme_tcp.c b/lib/nvme/nvme_tcp.c index 031f88d21..d4aeec082 100644 --- a/lib/nvme/nvme_tcp.c +++ b/lib/nvme/nvme_tcp.c @@ -1878,3 +1878,26 @@ nvme_tcp_ctrlr_free_cmb_io_buffer(struct spdk_nvme_ctrlr *ctrlr, void *buf, size { return 0; } + +void +nvme_tcp_admin_qpair_abort_aers(struct spdk_nvme_qpair *qpair) +{ + struct nvme_tcp_req *tcp_req, *tmp; + struct nvme_request *req; + struct spdk_nvme_cpl cpl; + struct nvme_tcp_qpair *tqpair = nvme_tcp_qpair(qpair); + + cpl.status.sc = SPDK_NVME_SC_ABORTED_SQ_DELETION; + cpl.status.sct = SPDK_NVME_SCT_GENERIC; + + TAILQ_FOREACH_SAFE(tcp_req, &tqpair->outstanding_reqs, link, tmp) { + if (tcp_req->req->cmd.opc != SPDK_NVME_OPC_ASYNC_EVENT_REQUEST) { + continue; + } + assert(tcp_req->req != NULL); + req = tcp_req->req; + + nvme_tcp_req_complete(req, &cpl); + nvme_tcp_req_put(tqpair, tcp_req); + } +} diff --git a/lib/nvme/nvme_transport.c b/lib/nvme/nvme_transport.c index a4cf39e50..c408f5b4d 100644 --- a/lib/nvme/nvme_transport.c +++ b/lib/nvme/nvme_transport.c @@ -220,3 +220,9 @@ nvme_transport_qpair_process_completions(struct spdk_nvme_qpair *qpair, uint32_t { NVME_TRANSPORT_CALL(qpair->trtype, qpair_process_completions, (qpair, max_completions)); } + +void +nvme_transport_admin_qpair_abort_aers(struct spdk_nvme_qpair *qpair) +{ + NVME_TRANSPORT_CALL(qpair->trtype, admin_qpair_abort_aers, (qpair)); +} diff --git a/test/unit/lib/nvme/nvme_ctrlr.c/nvme_ctrlr_ut.c b/test/unit/lib/nvme/nvme_ctrlr.c/nvme_ctrlr_ut.c index 9257ea055..ef5e1d7b6 100644 --- a/test/unit/lib/nvme/nvme_ctrlr.c/nvme_ctrlr_ut.c +++ b/test/unit/lib/nvme/nvme_ctrlr.c/nvme_ctrlr_ut.c @@ -180,6 +180,11 @@ nvme_transport_qpair_reset(struct spdk_nvme_qpair *qpair) return 0; } +void +nvme_transport_admin_qpair_abort_aers(struct spdk_nvme_qpair *qpair) +{ +} + int nvme_driver_init(void) {