From 75d38a301d1dc30e88f00c7024383cbeb23cb04e Mon Sep 17 00:00:00 2001 From: Shuhei Matsumoto Date: Thu, 27 Jan 2022 21:26:31 +0900 Subject: [PATCH] nvme: poll_group_process_completions() returns -ENXIO if any qpair failed TCP transport already does it but was not documented clearly. RDMA and PCIe transports follow it and document it clearly. Then we can check each qpair's state if spdk_nvme_poll_group_process_completions() returns -ENXIO before disconnected_qpair_cb() is called. Signed-off-by: Shuhei Matsumoto Change-Id: I2afe920cfd06c374251fccc1c205948fb498dd33 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/11328 Community-CI: Mellanox Build Bot Community-CI: Broadcom CI Tested-by: SPDK CI Jenkins Reviewed-by: Aleksey Marchuk Reviewed-by: Ben Walker --- lib/nvme/nvme_pcie_common.c | 7 ++++--- lib/nvme/nvme_rdma.c | 6 +++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/lib/nvme/nvme_pcie_common.c b/lib/nvme/nvme_pcie_common.c index 4a9bd749b..a74388afd 100644 --- a/lib/nvme/nvme_pcie_common.c +++ b/lib/nvme/nvme_pcie_common.c @@ -1759,11 +1759,12 @@ nvme_pcie_poll_group_process_completions(struct spdk_nvme_transport_poll_group * STAILQ_FOREACH_SAFE(qpair, &tgroup->connected_qpairs, poll_group_stailq, tmp_qpair) { local_completions = spdk_nvme_qpair_process_completions(qpair, completions_per_qpair); - if (local_completions < 0) { + if (spdk_unlikely(local_completions < 0)) { disconnected_qpair_cb(qpair, tgroup->group->ctx); - local_completions = 0; + total_completions = -ENXIO; + } else if (spdk_likely(total_completions >= 0)) { + total_completions += local_completions; } - total_completions += local_completions; } return total_completions; diff --git a/lib/nvme/nvme_rdma.c b/lib/nvme/nvme_rdma.c index 3b48092d1..92659ce77 100644 --- a/lib/nvme/nvme_rdma.c +++ b/lib/nvme/nvme_rdma.c @@ -2910,14 +2910,13 @@ nvme_rdma_poll_group_process_completions(struct spdk_nvme_transport_poll_group * struct nvme_rdma_qpair *rqpair; struct nvme_rdma_poll_group *group; struct nvme_rdma_poller *poller; - int num_qpairs = 0, batch_size, rc; + int num_qpairs = 0, batch_size, rc, rc2 = 0; int64_t total_completions = 0; uint64_t completions_allowed = 0; uint64_t completions_per_poller = 0; uint64_t poller_completions = 0; uint64_t rdma_completions; - if (completions_per_qpair == 0) { completions_per_qpair = MAX_COMPLETIONS_PER_POLL; } @@ -2949,6 +2948,7 @@ nvme_rdma_poll_group_process_completions(struct spdk_nvme_transport_poll_group * } if (spdk_unlikely(qpair->transport_failure_reason != SPDK_NVME_QPAIR_FAILURE_NONE)) { + rc2 = -ENXIO; nvme_rdma_fail_qpair(qpair, 0); continue; } @@ -3012,7 +3012,7 @@ nvme_rdma_poll_group_process_completions(struct spdk_nvme_transport_poll_group * } } - return total_completions; + return rc2 != 0 ? rc2 : total_completions; } static int