Commit 789d910c authored by Jacek Kalwas's avatar Jacek Kalwas Committed by Tomasz Zawadzki
Browse files

nvme: add release flag to nvme_wait_for_adminq_completion



This helps reduce boilerplate code.

While adding the new argument, the util description was moved to header.

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


Reviewed-by: default avatarJim Harris <jim.harris@nvidia.com>
Tested-by: default avatarSPDK Automated Test System <spdkbot@gmail.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarTomasz Zawadzki <tomasz@tzawadzki.com>
parent b101112e
Loading
Loading
Loading
Loading
+5 −15
Original line number Diff line number Diff line
@@ -295,23 +295,9 @@ error:
	return -ECANCELED;
}

/**
 * Poll admin qpair for completions until a command completes.
 *
 * \param ctrlr ctrlr with adminq to poll
 * \param status completion status. The user must fill this structure with zeroes before calling
 * this function
 *
 * \return 0 if command completed without error,
 * -EIO if command completed with error,
 * -ECANCELED if command is not completed due to transport/device error or time expired
 *
 *  The command to wait upon must be submitted with nvme_completion_poll_cb as the callback
 *  and status as the callback argument.
 */
int
nvme_wait_for_adminq_completion(struct spdk_nvme_ctrlr *ctrlr,
				struct nvme_completion_poll_status *status)
				struct nvme_completion_poll_status *status, bool release)
{
	uint64_t timeout_in_usecs = ctrlr->opts.admin_timeout_ms * 1000;
	int rc;
@@ -328,6 +314,10 @@ nvme_wait_for_adminq_completion(struct spdk_nvme_ctrlr *ctrlr,
		rc = nvme_wait_for_completion_poll(ctrlr->adminq, status);
	} while (rc == -EAGAIN);

	if (release && !status->timed_out) {
		free(status);
	}

	return rc;
}

+13 −49
Original line number Diff line number Diff line
@@ -801,11 +801,7 @@ nvme_ctrlr_update_ana_log_page(struct spdk_nvme_ctrlr *ctrlr)
		return rc;
	}

	rc = nvme_wait_for_adminq_completion(ctrlr, status);
	if (!status->timed_out) {
		free(status);
	}

	rc = nvme_wait_for_adminq_completion(ctrlr, status, true);
	if (rc) {
		NVME_CTRLR_ERRLOG(ctrlr, "wait for spdk_nvme_ctrlr_cmd_get_log_page failed: rc=%s\n",
				  spdk_strerror(abs(rc)));
@@ -970,11 +966,7 @@ nvme_ctrlr_set_arbitration_feature(struct spdk_nvme_ctrlr *ctrlr)
		return;
	}

	rc = nvme_wait_for_adminq_completion(ctrlr, status);
	if (!status->timed_out) {
		free(status);
	}

	rc = nvme_wait_for_adminq_completion(ctrlr, status, true);
	if (rc) {
		NVME_CTRLR_ERRLOG(ctrlr, "wait for spdk_nvme_ctrlr_cmd_set_feature failed: rc=%s\n",
				  spdk_strerror(abs(rc)));
@@ -2601,7 +2593,7 @@ nvme_ctrlr_identify_active_ns(struct spdk_nvme_ctrlr *ctrlr)
	}

	nvme_ctrlr_identify_active_ns_async(ctx);
	rc = nvme_wait_for_adminq_completion(ctrlr, &ctx->status);
	rc = nvme_wait_for_adminq_completion(ctrlr, &ctx->status, false);
	if (rc || ctx->state == NVME_ACTIVE_NS_STATE_ERROR) {
		if (!ctx->status.timed_out) {
			nvme_active_ns_ctx_destroy(ctx);
@@ -3288,11 +3280,7 @@ nvme_ctrlr_clear_changed_ns_log(struct spdk_nvme_ctrlr_aer_completion *async_eve
		goto out;
	}

	rc = nvme_wait_for_adminq_completion(ctrlr, status);
	if (!status->timed_out) {
		free(status);
	}

	rc = nvme_wait_for_adminq_completion(ctrlr, status, true);
	if (rc) {
		NVME_CTRLR_ERRLOG(ctrlr, "wait for spdk_nvme_ctrlr_cmd_get_log_page failed: rc=%s\n",
				  spdk_strerror(abs(rc)));
@@ -4942,11 +4930,7 @@ spdk_nvme_ctrlr_attach_ns(struct spdk_nvme_ctrlr *ctrlr, uint32_t nsid,
		return res;
	}

	res = nvme_wait_for_adminq_completion(ctrlr, status);
	if (!status->timed_out) {
		free(status);
	}

	res = nvme_wait_for_adminq_completion(ctrlr, status, true);
	if (res) {
		NVME_CTRLR_ERRLOG(ctrlr, "wait for spdk_nvme_ctrlr_attach_ns failed: rc=%s\n",
				  spdk_strerror(abs(res)));
@@ -4991,11 +4975,7 @@ spdk_nvme_ctrlr_detach_ns(struct spdk_nvme_ctrlr *ctrlr, uint32_t nsid,
		return res;
	}

	res = nvme_wait_for_adminq_completion(ctrlr, status);
	if (!status->timed_out) {
		free(status);
	}

	res = nvme_wait_for_adminq_completion(ctrlr, status, true);
	if (res) {
		NVME_CTRLR_ERRLOG(ctrlr, "wait for spdk_nvme_ctrlr_detach_ns failed: rc=%s\n",
				  spdk_strerror(abs(res)));
@@ -5024,7 +5004,7 @@ spdk_nvme_ctrlr_create_ns(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_ns_dat
		return 0;
	}

	res = nvme_wait_for_adminq_completion(ctrlr, status);
	res = nvme_wait_for_adminq_completion(ctrlr, status, false);
	nsid = status->cpl.cdw0;
	if (!status->timed_out) {
		free(status);
@@ -5064,11 +5044,7 @@ spdk_nvme_ctrlr_delete_ns(struct spdk_nvme_ctrlr *ctrlr, uint32_t nsid)
		return res;
	}

	res = nvme_wait_for_adminq_completion(ctrlr, status);
	if (!status->timed_out) {
		free(status);
	}

	res = nvme_wait_for_adminq_completion(ctrlr, status, true);
	if (res) {
		NVME_CTRLR_ERRLOG(ctrlr, "wait for spdk_nvme_ctrlr_delete_ns failed: rc=%s\n",
				  spdk_strerror(abs(res)));
@@ -5098,11 +5074,7 @@ spdk_nvme_ctrlr_format(struct spdk_nvme_ctrlr *ctrlr, uint32_t nsid,
		return res;
	}

	res = nvme_wait_for_adminq_completion(ctrlr, status);
	if (!status->timed_out) {
		free(status);
	}

	res = nvme_wait_for_adminq_completion(ctrlr, status, true);
	if (res) {
		NVME_CTRLR_ERRLOG(ctrlr, "wait for spdk_nvme_ctrlr_format failed: rc=%s\n",
				  spdk_strerror(abs(res)));
@@ -5165,7 +5137,7 @@ spdk_nvme_ctrlr_update_firmware(struct spdk_nvme_ctrlr *ctrlr, void *payload, ui
			return res;
		}

		res = nvme_wait_for_adminq_completion(ctrlr, status);
		res = nvme_wait_for_adminq_completion(ctrlr, status, false);
		if (res) {
			if (!status->timed_out) {
				free(status);
@@ -5194,7 +5166,7 @@ spdk_nvme_ctrlr_update_firmware(struct spdk_nvme_ctrlr *ctrlr, void *payload, ui
		return res;
	}

	res = nvme_wait_for_adminq_completion(ctrlr, status);
	res = nvme_wait_for_adminq_completion(ctrlr, status, false);
	memcpy(completion_status, &status->cpl.status, sizeof(struct spdk_nvme_status));
	if (!status->timed_out) {
		free(status);
@@ -5540,11 +5512,7 @@ spdk_nvme_ctrlr_security_receive(struct spdk_nvme_ctrlr *ctrlr, uint8_t secp,
		return res;
	}

	res = nvme_wait_for_adminq_completion(ctrlr, status);
	if (!status->timed_out) {
		free(status);
	}

	res = nvme_wait_for_adminq_completion(ctrlr, status, true);
	if (res) {
		NVME_CTRLR_ERRLOG(ctrlr, "wait for spdk_nvme_ctrlr_cmd_security_receive failed: rc=%s\n",
				  spdk_strerror(abs(res)));
@@ -5574,11 +5542,7 @@ spdk_nvme_ctrlr_security_send(struct spdk_nvme_ctrlr *ctrlr, uint8_t secp,
		return res;
	}

	res = nvme_wait_for_adminq_completion(ctrlr, status);
	if (!status->timed_out) {
		free(status);
	}

	res = nvme_wait_for_adminq_completion(ctrlr, status, true);
	if (res) {
		NVME_CTRLR_ERRLOG(ctrlr, "spdk_nvme_ctrlr_cmd_security_send failed: rc=%s\n",
				  spdk_strerror(abs(res)));
+4 −16
Original line number Diff line number Diff line
@@ -59,11 +59,7 @@ nvme_fabric_prop_set_cmd_sync(struct spdk_nvme_ctrlr *ctrlr,
		return rc;
	}

	rc = nvme_wait_for_adminq_completion(ctrlr, status);
	if (!status->timed_out) {
		free(status);
	}

	rc = nvme_wait_for_adminq_completion(ctrlr, status, true);
	if (rc) {
		NVME_CTRLR_ERRLOG(ctrlr, "wait for nvme_fabric_prop_set_cmd offset=%x, size=%u failed: rc=%s\n",
				  offset, size, spdk_strerror(abs(rc)));
@@ -147,7 +143,7 @@ nvme_fabric_prop_get_cmd_sync(struct spdk_nvme_ctrlr *ctrlr,
		return rc;
	}

	rc = nvme_wait_for_adminq_completion(ctrlr, status);
	rc = nvme_wait_for_adminq_completion(ctrlr, status, false);
	response = *(struct spdk_nvmf_fabric_prop_get_rsp *)&status->cpl;
	if (!status->timed_out) {
		free(status);
@@ -366,11 +362,7 @@ nvme_fabric_get_discovery_log_page(struct spdk_nvme_ctrlr *ctrlr,
		return -1;
	}

	rc = nvme_wait_for_adminq_completion(ctrlr, status);
	if (!status->timed_out) {
		free(status);
	}

	rc = nvme_wait_for_adminq_completion(ctrlr, status, true);
	if (rc) {
		SPDK_ERRLOG("wait for spdk_nvme_ctrlr_cmd_get_log_page failed: rc=%s\n", spdk_strerror(abs(rc)));
		return -1;
@@ -429,11 +421,7 @@ nvme_fabric_ctrlr_scan(struct spdk_nvme_probe_ctx *probe_ctx,
		return rc;
	}

	rc = nvme_wait_for_adminq_completion(discovery_ctrlr, status);
	if (!status->timed_out) {
		free(status);
	}

	rc = nvme_wait_for_adminq_completion(discovery_ctrlr, status, true);
	if (rc) {
		NVME_CTRLR_ERRLOG(discovery_ctrlr, "wait for nvme_identify_controller failed: rc=%s\n",
				  spdk_strerror(abs(rc)));
+19 −1
Original line number Diff line number Diff line
@@ -1330,8 +1330,26 @@ int nvme_ctrlr_cmd_sanitize(struct spdk_nvme_ctrlr *ctrlr, uint32_t nsid,
				struct spdk_nvme_sanitize *sanitize, uint32_t cdw11,
				spdk_nvme_cmd_cb cb_fn, void *cb_arg);
void	nvme_completion_poll_cb(void *arg, const struct spdk_nvme_cpl *cpl);

/**
 * Poll admin qpair for completions until a command completes.
 *
 * \param ctrlr ctrlr with adminq to poll
 * \param status completion status. The user must fill this structure with zeroes before calling
 * this function
 * \param release When set to true, releases the status before exit (if the timeout is not hit).
 * Otherwise, it is the caller's responsibility.
 *
 * \return 0 if command completed without error,
 * -EIO if command completed with error,
 * -ECANCELED if command is not completed due to transport/device error or time expired
 *
 *  The command to wait upon must be submitted with nvme_completion_poll_cb as the callback
 *  and status as the callback argument.
 */
int	nvme_wait_for_adminq_completion(struct spdk_nvme_ctrlr *ctrlr,
					struct nvme_completion_poll_status *status);
					struct nvme_completion_poll_status *status, bool release);

int	nvme_wait_for_completion_poll(struct spdk_nvme_qpair *qpair,
				      struct nvme_completion_poll_status *status);

+4 −20
Original line number Diff line number Diff line
@@ -122,11 +122,7 @@ nvme_ctrlr_identify_ns(struct spdk_nvme_ns *ns)
		return rc;
	}

	rc = nvme_wait_for_adminq_completion(ns->ctrlr, status);
	if (!status->timed_out) {
		free(status);
	}

	rc = nvme_wait_for_adminq_completion(ns->ctrlr, status, true);
	if (rc) {
		/* This can occur if the namespace is not active. Simply zero the
		 * namespace data and continue. */
@@ -171,11 +167,7 @@ nvme_ctrlr_identify_ns_zns_specific(struct spdk_nvme_ns *ns)
		return rc;
	}

	rc = nvme_wait_for_adminq_completion(ctrlr, status);
	if (!status->timed_out) {
		free(status);
	}

	rc = nvme_wait_for_adminq_completion(ctrlr, status, true);
	if (rc) {
		NVME_CTRLR_ERRLOG(ctrlr, "wait for nvme_ctrlr_cmd_identify failed: %s\n", spdk_strerror(abs(rc)));
		spdk_free(nsdata_zns);
@@ -218,11 +210,7 @@ nvme_ctrlr_identify_ns_nvm_specific(struct spdk_nvme_ns *ns)
		return rc;
	}

	rc = nvme_wait_for_adminq_completion(ctrlr, status);
	if (!status->timed_out) {
		free(status);
	}

	rc = nvme_wait_for_adminq_completion(ctrlr, status, true);
	if (rc) {
		NVME_CTRLR_ERRLOG(ctrlr, "wait for nvme_ctrlr_cmd_identify failed: rc=%s\n",
				  spdk_strerror(abs(rc)));
@@ -287,11 +275,7 @@ nvme_ctrlr_identify_id_desc(struct spdk_nvme_ns *ns)
		return rc;
	}

	rc = nvme_wait_for_adminq_completion(ns->ctrlr, status);
	if (!status->timed_out) {
		free(status);
	}

	rc = nvme_wait_for_adminq_completion(ns->ctrlr, status, true);
	if (rc) {
		NVME_CTRLR_WARNLOG(ns->ctrlr, "Failed to retrieve NS ID Descriptor List\n");
		memset(ns->id_desc_list, 0, sizeof(ns->id_desc_list));
Loading