From 813756e75e5d36b72066b901a2d2d66898b21ff1 Mon Sep 17 00:00:00 2001 From: Ben Walker Date: Mon, 14 Mar 2022 14:23:55 -0700 Subject: [PATCH] nvme: Do not abort transport commands when disconnecting a qpair Make this a transport-level decision instead. TCP and RDMA do want to abort, but PCIe cannot because these commands may still be receiving DMA operations from the device. Change-Id: I305acddc3819c903eb3217e8f710d4216d0b3931 Signed-off-by: Ben Walker Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/11509 Community-CI: Mellanox Build Bot Community-CI: Broadcom CI Tested-by: SPDK CI Jenkins Reviewed-by: Shuhei Matsumoto Reviewed-by: Konrad Sztyber Reviewed-by: Aleksey Marchuk Reviewed-by: Michael Haeuptle --- lib/nvme/nvme_rdma.c | 6 ++++-- lib/nvme/nvme_tcp.c | 5 +++-- lib/nvme/nvme_transport.c | 1 - 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/lib/nvme/nvme_rdma.c b/lib/nvme/nvme_rdma.c index 62eb7472e..2c2936a8b 100644 --- a/lib/nvme/nvme_rdma.c +++ b/lib/nvme/nvme_rdma.c @@ -1994,6 +1994,8 @@ nvme_rdma_qpair_destroy(struct nvme_rdma_qpair *rqpair) } } +static void nvme_rdma_qpair_abort_reqs(struct spdk_nvme_qpair *qpair, uint32_t dnr); + static int nvme_rdma_qpair_disconnected(struct nvme_rdma_qpair *rqpair, int ret) { @@ -2001,6 +2003,8 @@ nvme_rdma_qpair_disconnected(struct nvme_rdma_qpair *rqpair, int ret) nvme_rdma_qpair_destroy(rqpair); + nvme_rdma_qpair_abort_reqs(&rqpair->qpair, 0); + if (ret) { SPDK_DEBUGLOG(nvme, "Target did not respond to qpair disconnect.\n"); goto quiet; @@ -2178,8 +2182,6 @@ nvme_rdma_stale_conn_retry(struct nvme_rdma_qpair *rqpair) return 0; } -static void nvme_rdma_qpair_abort_reqs(struct spdk_nvme_qpair *qpair, uint32_t dnr); - static int nvme_rdma_ctrlr_delete_io_qpair(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_qpair *qpair) { diff --git a/lib/nvme/nvme_tcp.c b/lib/nvme/nvme_tcp.c index 3306e6eba..d1d35e9b6 100644 --- a/lib/nvme/nvme_tcp.c +++ b/lib/nvme/nvme_tcp.c @@ -320,6 +320,8 @@ fail: return -ENOMEM; } +static void nvme_tcp_qpair_abort_reqs(struct spdk_nvme_qpair *qpair, uint32_t dnr); + static void nvme_tcp_ctrlr_disconnect_qpair(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_qpair *qpair) { @@ -351,11 +353,10 @@ nvme_tcp_ctrlr_disconnect_qpair(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_ TAILQ_REMOVE(&tqpair->send_queue, pdu, tailq); } + nvme_tcp_qpair_abort_reqs(qpair, 0); nvme_transport_ctrlr_disconnect_qpair_done(qpair); } -static void nvme_tcp_qpair_abort_reqs(struct spdk_nvme_qpair *qpair, uint32_t dnr); - static int nvme_tcp_ctrlr_delete_io_qpair(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_qpair *qpair) { diff --git a/lib/nvme/nvme_transport.c b/lib/nvme/nvme_transport.c index 29cc2e037..e8e91acc2 100644 --- a/lib/nvme/nvme_transport.c +++ b/lib/nvme/nvme_transport.c @@ -546,7 +546,6 @@ void nvme_transport_ctrlr_disconnect_qpair_done(struct spdk_nvme_qpair *qpair) { nvme_qpair_abort_all_queued_reqs(qpair, 0); - nvme_transport_qpair_abort_reqs(qpair, 0); nvme_qpair_set_state(qpair, NVME_QPAIR_DISCONNECTED); }