Commit 75d38a30 authored by Shuhei Matsumoto's avatar Shuhei Matsumoto Committed by Ben Walker
Browse files

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: default avatarShuhei Matsumoto <smatsumoto@nvidia.com>
Change-Id: I2afe920cfd06c374251fccc1c205948fb498dd33
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/11328


Community-CI: Mellanox Build Bot
Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarAleksey Marchuk <alexeymar@mellanox.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
parent 9717b0c3
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -1759,12 +1759,13 @@ 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;
		}
	}

	return total_completions;
}
+3 −3
Original line number Diff line number Diff line
@@ -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