From 2db77dc9c7074510f16105a3249309d81ee96793 Mon Sep 17 00:00:00 2001 From: Alexey Marchuk Date: Fri, 19 Nov 2021 18:23:56 +0300 Subject: [PATCH] nvme: Explicitly disconnect qpair before destroy spdk_nvme_ctrlr_free_io_qpair can be called when qpair is already disconnected. In that case qpair's state is changed to NVME_QPAIR_DESTROYING and transport's ctrlr_delete_io_qpair callback is called. RDMA and TCP transports call nvme_transport_ctrlr_disconnect_qpair in the callback and since qpair's state is not DISCONNECTED or DISCONNECTING, qpair is disconnected for the second time. If spdk_nvme_ctrlr_free_io_qpair is called when qpair is in ENABLED state than nothing changes, qpair will be disconnected before destroy. PCIE/vfio_user don't implement transport disconnect callback, so they are not affected. Signed-off-by: Alexey Marchuk Change-Id: I23e11856ecafb51669acf4a3118be049c11eecda Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/10326 Community-CI: Broadcom CI Community-CI: Mellanox Build Bot Tested-by: SPDK CI Jenkins Reviewed-by: Jim Harris Reviewed-by: Dong Yi Reviewed-by: Konrad Sztyber Reviewed-by: Tomasz Zawadzki --- lib/nvme/nvme_ctrlr.c | 2 ++ lib/nvme/nvme_rdma.c | 2 +- lib/nvme/nvme_tcp.c | 1 - 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/nvme/nvme_ctrlr.c b/lib/nvme/nvme_ctrlr.c index 5ceb81446..efbe09b2d 100644 --- a/lib/nvme/nvme_ctrlr.c +++ b/lib/nvme/nvme_ctrlr.c @@ -611,6 +611,8 @@ spdk_nvme_ctrlr_free_io_qpair(struct spdk_nvme_qpair *qpair) spdk_nvme_poll_group_remove(qpair->poll_group->group, qpair); } + nvme_transport_ctrlr_disconnect_qpair(ctrlr, qpair); + /* Do not retry. */ nvme_qpair_set_state(qpair, NVME_QPAIR_DESTROYING); diff --git a/lib/nvme/nvme_rdma.c b/lib/nvme/nvme_rdma.c index dcefe1337..ba70bc25b 100644 --- a/lib/nvme/nvme_rdma.c +++ b/lib/nvme/nvme_rdma.c @@ -1853,7 +1853,7 @@ nvme_rdma_ctrlr_delete_io_qpair(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_ assert(qpair != NULL); rqpair = nvme_rdma_qpair(qpair); - nvme_transport_ctrlr_disconnect_qpair(ctrlr, qpair); + if (rqpair->defer_deletion_to_pg) { nvme_qpair_set_state(qpair, NVME_QPAIR_DESTROYING); return 0; diff --git a/lib/nvme/nvme_tcp.c b/lib/nvme/nvme_tcp.c index 962289399..6ddeed41e 100644 --- a/lib/nvme/nvme_tcp.c +++ b/lib/nvme/nvme_tcp.c @@ -350,7 +350,6 @@ nvme_tcp_ctrlr_delete_io_qpair(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_q struct nvme_tcp_qpair *tqpair; assert(qpair != NULL); - nvme_transport_ctrlr_disconnect_qpair(ctrlr, qpair); nvme_tcp_qpair_abort_reqs(qpair, 1); nvme_qpair_deinit(qpair); tqpair = nvme_tcp_qpair(qpair);