From 6d18ea425b9aad7d3f26eb7fb40c29d3b0df29fc Mon Sep 17 00:00:00 2001 From: Seth Howell Date: Tue, 21 Apr 2020 16:19:02 -0700 Subject: [PATCH] lib/nvme: force qpair disconnect before aborting rdma requests. This is needed for shared completion queues which can still give us successful completions on aborted requests if the qpair hasn't been disconnected. Signed-off-by: Seth Howell Change-Id: I85cf1a81ef563d8c02d684b09d2f7ad5008e38cb Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/1961 Community-CI: Mellanox Build Bot Tested-by: SPDK CI Jenkins Reviewed-by: Ben Walker Reviewed-by: Shuhei Matsumoto Reviewed-by: Aleksey Marchuk --- lib/nvme/nvme_rdma.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lib/nvme/nvme_rdma.c b/lib/nvme/nvme_rdma.c index 3e66d0368..53c120945 100644 --- a/lib/nvme/nvme_rdma.c +++ b/lib/nvme/nvme_rdma.c @@ -2011,6 +2011,16 @@ nvme_rdma_qpair_abort_reqs(struct spdk_nvme_qpair *qpair, uint32_t dnr) cpl.status.sct = SPDK_NVME_SCT_GENERIC; cpl.status.dnr = dnr; + /* + * We cannot abort requests at the RDMA layer without + * unregistering them. If we do, we can still get error + * free completions on the shared completion queue. + */ + if (nvme_qpair_get_state(qpair) > NVME_QPAIR_DISCONNECTING && + nvme_qpair_get_state(qpair) != NVME_QPAIR_DESTROYING) { + nvme_ctrlr_disconnect_qpair(qpair); + } + TAILQ_FOREACH_SAFE(rdma_req, &rqpair->outstanding_reqs, link, tmp) { assert(rdma_req->req != NULL); req = rdma_req->req;