Commit 9d1063d7 authored by Shuhei Matsumoto's avatar Shuhei Matsumoto Committed by Tomasz Zawadzki
Browse files

nvme: qpair_process_completions() processes if qpair is disconnecting



If poll group is not used and if qpair is disconnecting,
spdk_nvme_qpair_process_completions() has to poll qpair until it is
actually disconnected even if ctrlr is failed.

Signed-off-by: default avatarShuhei Matsumoto <smatsumoto@nvidia.com>
Change-Id: I6da84f1e35780d21480fbe6f07e76af3048a777b
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/11018


Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarAleksey Marchuk <alexeymar@mellanox.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
parent 21322e01
Loading
Loading
Loading
Loading
+12 −5
Original line number Diff line number Diff line
@@ -719,7 +719,8 @@ spdk_nvme_qpair_process_completions(struct spdk_nvme_qpair *qpair, uint32_t max_
	int32_t ret;
	struct nvme_request *req, *tmp;

	if (spdk_unlikely(qpair->ctrlr->is_failed)) {
	if (spdk_unlikely(qpair->ctrlr->is_failed &&
			  nvme_qpair_get_state(qpair) != NVME_QPAIR_DISCONNECTING)) {
		if (qpair->ctrlr->is_removed) {
			nvme_qpair_set_state(qpair, NVME_QPAIR_DESTROYING);
			nvme_qpair_abort_all_queued_reqs(qpair, 0);
@@ -729,7 +730,8 @@ spdk_nvme_qpair_process_completions(struct spdk_nvme_qpair *qpair, uint32_t max_
	}

	if (spdk_unlikely(!nvme_qpair_check_enabled(qpair) &&
			  !(nvme_qpair_get_state(qpair) == NVME_QPAIR_CONNECTING))) {
			  !(nvme_qpair_get_state(qpair) == NVME_QPAIR_CONNECTING ||
			    nvme_qpair_get_state(qpair) == NVME_QPAIR_DISCONNECTING))) {
		/*
		 * qpair is not enabled, likely because a controller reset is
		 *  in progress.
@@ -752,11 +754,16 @@ spdk_nvme_qpair_process_completions(struct spdk_nvme_qpair *qpair, uint32_t max_
	qpair->in_completion_context = 1;
	ret = nvme_transport_qpair_process_completions(qpair, max_completions);
	if (ret < 0) {
		SPDK_ERRLOG("CQ transport error %d (%s) on qpair id %hu\n", ret, spdk_strerror(-ret), qpair->id);
		if (ret == -ENXIO && nvme_qpair_get_state(qpair) == NVME_QPAIR_DISCONNECTING) {
			ret = 0;
		} else {
			SPDK_ERRLOG("CQ transport error %d (%s) on qpair id %hu\n",
				    ret, spdk_strerror(-ret), qpair->id);
			if (nvme_qpair_is_admin_queue(qpair)) {
				nvme_ctrlr_fail(qpair->ctrlr, false);
			}
		}
	}
	qpair->in_completion_context = 0;
	if (qpair->delete_after_completion_context) {
		/*