Commit 2a4e86ee authored by Jacek Kalwas's avatar Jacek Kalwas Committed by Tomasz Zawadzki
Browse files

nvme: use explicit fabric poll cleanup



Because a single poll may not reliably reach the cleanup phase, perform
cleanup explicitly.

Change-Id: I99c61ad59bc306d4c0b4d5d85d68f6d266d0df9d
Signed-off-by: default avatarJacek Kalwas <jacek.kalwas@nutanix.com>
Reviewed-on: https://review.spdk.io/c/spdk/spdk/+/26538


Tested-by: default avatarSPDK Automated Test System <spdkbot@gmail.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarKonrad Sztyber <ksztyber@nvidia.com>
Reviewed-by: default avatarBen Walker <ben@nvidia.com>
parent d6473178
Loading
Loading
Loading
Loading
+1 −5
Original line number Diff line number Diff line
@@ -1205,11 +1205,7 @@ nvme_fabric_qpair_authenticate_poll(struct spdk_nvme_qpair *qpair)
			nvme_auth_set_state(qpair, NVME_QPAIR_AUTH_STATE_DONE);
			break;
		case NVME_QPAIR_AUTH_STATE_DONE:
			qpair->fabric_poll_status = NULL;
			if (!status->timed_out) {
				spdk_free(status->dma_data);
				free(status);
			}
			nvme_fabric_qpair_poll_cleanup(qpair);
			if (auth->cb_fn != NULL) {
				auth->cb_fn(auth->cb_ctx, auth->status);
				auth->cb_fn = NULL;
+13 −6
Original line number Diff line number Diff line
@@ -573,6 +573,18 @@ nvme_fabric_qpair_connect_async(struct spdk_nvme_qpair *qpair, uint32_t num_entr
	return 0;
}

void
nvme_fabric_qpair_poll_cleanup(struct spdk_nvme_qpair *qpair)
{
	struct nvme_completion_poll_status *status = qpair->fabric_poll_status;

	qpair->fabric_poll_status = NULL;
	if (!status->timed_out) {
		spdk_free(status->dma_data);
		free(status);
	}
}

int
nvme_fabric_qpair_connect_poll(struct spdk_nvme_qpair *qpair)
{
@@ -620,12 +632,7 @@ nvme_fabric_qpair_connect_poll(struct spdk_nvme_qpair *qpair)
		qpair->auth.flags.ascr = true;
	}
finish:
	qpair->fabric_poll_status = NULL;
	if (!status->timed_out) {
		spdk_free(status->dma_data);
		free(status);
	}

	nvme_fabric_qpair_poll_cleanup(qpair);
	return rc;
}

+1 −0
Original line number Diff line number Diff line
@@ -1458,6 +1458,7 @@ int nvme_fabric_qpair_connect_poll(struct spdk_nvme_qpair *qpair);
bool	nvme_fabric_qpair_auth_required(struct spdk_nvme_qpair *qpair);
int	nvme_fabric_qpair_authenticate_async(struct spdk_nvme_qpair *qpair);
int	nvme_fabric_qpair_authenticate_poll(struct spdk_nvme_qpair *qpair);
void	nvme_fabric_qpair_poll_cleanup(struct spdk_nvme_qpair *qpair);

typedef int (*spdk_nvme_parse_ana_log_page_cb)(
	const struct spdk_nvme_ana_group_descriptor *desc, void *cb_arg);
+7 −8
Original line number Diff line number Diff line
@@ -446,16 +446,14 @@ nvme_tcp_ctrlr_disconnect_qpair(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_
		nvme_transport_ctrlr_disconnect_qpair_done(qpair);
	}

	/* A non-NULL fabric poll status indicates that a fabric command was outstanding
	 * and the qpair state was CONNECTING before the disconnect was invoked. That
	 * command was aborted by the socket close. To avoid leaking this status and dma_data,
	 * nvme_tcp_ctrlr_connect_qpair_poll is used to releases them. */
	/* A Fabric command may be outstanding before a disconnect is invoked. */
	if (qpair->fabric_poll_status &&
	    !(qpair->auth.flags.in_auth_poll || tqpair->flags.in_connect_poll)) {
		assert(qpair->fabric_poll_status->done);
		rc = nvme_tcp_ctrlr_connect_qpair_poll(qpair->ctrlr, qpair);
		assert(rc != -EAGAIN);
		assert(!qpair->fabric_poll_status);
		nvme_fabric_qpair_poll_cleanup(qpair);
		if (qpair->auth.cb_fn != NULL) {
			qpair->auth.cb_fn(qpair->auth.cb_ctx, -ECANCELED);
			qpair->auth.cb_fn = NULL;
		}
	}
}

@@ -468,6 +466,7 @@ nvme_tcp_ctrlr_delete_io_qpair(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_q
	nvme_tcp_qpair_abort_reqs(qpair, qpair->abort_dnr);
	assert(TAILQ_EMPTY(&tqpair->outstanding_reqs));

	assert(!qpair->fabric_poll_status);
	nvme_qpair_deinit(qpair);
	nvme_tcp_free_reqs(tqpair);
	if (!tqpair->shared_stats) {
+2 −0
Original line number Diff line number Diff line
@@ -62,6 +62,8 @@ DEFINE_STUB(spdk_memory_domain_translate_data, int,
DEFINE_STUB_V(spdk_memory_domain_invalidate_data, (struct spdk_memory_domain *domain,
		void *domain_ctx, struct iovec *iov, uint32_t iovcnt));

DEFINE_STUB_V(nvme_fabric_qpair_poll_cleanup, (struct spdk_nvme_qpair *qpair));

static void
nvme_transport_ctrlr_disconnect_qpair_done_mocked(struct spdk_nvme_qpair *qpair)
{