Commit 28f448a6 authored by Jacek Kalwas's avatar Jacek Kalwas Committed by Tomasz Zawadzki
Browse files

nvme: unify handling of nvme_wait_for_adminq_completion



This should help with readability and more consistent err logs for
debug purposes.

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


Community-CI: Mellanox Build Bot
Tested-by: default avatarSPDK Automated Test System <spdkbot@gmail.com>
Reviewed-by: default avatarTomasz Zawadzki <tomasz@tzawadzki.com>
Reviewed-by: default avatarJim Harris <jim.harris@nvidia.com>
parent 38a0992b
Loading
Loading
Loading
Loading
+100 −72
Original line number Diff line number Diff line
@@ -801,15 +801,17 @@ nvme_ctrlr_update_ana_log_page(struct spdk_nvme_ctrlr *ctrlr)
		return rc;
	}

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

	if (rc) {
		NVME_CTRLR_ERRLOG(ctrlr, "wait for spdk_nvme_ctrlr_cmd_get_log_page failed: rc=%s\n",
				  spdk_strerror(abs(rc)));
	}

	free(status);
	return 0;
	return rc;
}

static int
@@ -935,6 +937,7 @@ nvme_ctrlr_set_arbitration_feature(struct spdk_nvme_ctrlr *ctrlr)
{
	uint32_t cdw11;
	struct nvme_completion_poll_status *status;
	int rc;

	if (ctrlr->opts.arbitration_burst == 0) {
		return;
@@ -967,13 +970,15 @@ nvme_ctrlr_set_arbitration_feature(struct spdk_nvme_ctrlr *ctrlr)
		return;
	}

	if (nvme_wait_for_adminq_completion(ctrlr, status)) {
		NVME_CTRLR_ERRLOG(ctrlr, "Timeout to set arbitration feature\n");
	}

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

	if (rc) {
		NVME_CTRLR_ERRLOG(ctrlr, "wait for spdk_nvme_ctrlr_cmd_set_feature failed: rc=%s\n",
				  spdk_strerror(abs(rc)));
	}
}

static void
@@ -2602,7 +2607,8 @@ nvme_ctrlr_identify_active_ns(struct spdk_nvme_ctrlr *ctrlr)
			nvme_active_ns_ctx_destroy(ctx);
		}

		NVME_CTRLR_ERRLOG(ctrlr, "wait for nvme_ctrlr_identify_active_ns_async failed: rc=%d\n", rc);
		NVME_CTRLR_ERRLOG(ctrlr, "wait for nvme_ctrlr_identify_active_ns_async failed: rc=%s\n",
				  spdk_strerror(abs(rc)));
		return -ENXIO;
	}

@@ -3288,7 +3294,8 @@ nvme_ctrlr_clear_changed_ns_log(struct spdk_nvme_ctrlr_aer_completion *async_eve
	}

	if (rc) {
		NVME_CTRLR_ERRLOG(ctrlr, "wait for spdk_nvme_ctrlr_cmd_get_log_page failed: rc=%d\n", rc);
		NVME_CTRLR_ERRLOG(ctrlr, "wait for spdk_nvme_ctrlr_cmd_get_log_page failed: rc=%s\n",
				  spdk_strerror(abs(rc)));
		goto out;
	}

@@ -4934,14 +4941,17 @@ spdk_nvme_ctrlr_attach_ns(struct spdk_nvme_ctrlr *ctrlr, uint32_t nsid,
		free(status);
		return res;
	}
	if (nvme_wait_for_adminq_completion(ctrlr, status)) {
		NVME_CTRLR_ERRLOG(ctrlr, "spdk_nvme_ctrlr_attach_ns failed!\n");

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

	if (res) {
		NVME_CTRLR_ERRLOG(ctrlr, "wait for spdk_nvme_ctrlr_attach_ns failed: rc=%s\n",
				  spdk_strerror(abs(res)));
		return res;
	}
	free(status);

	res = nvme_ctrlr_identify_active_ns(ctrlr);
	if (res) {
@@ -4980,14 +4990,17 @@ spdk_nvme_ctrlr_detach_ns(struct spdk_nvme_ctrlr *ctrlr, uint32_t nsid,
		free(status);
		return res;
	}
	if (nvme_wait_for_adminq_completion(ctrlr, status)) {
		NVME_CTRLR_ERRLOG(ctrlr, "spdk_nvme_ctrlr_detach_ns failed!\n");

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

	if (res) {
		NVME_CTRLR_ERRLOG(ctrlr, "wait for spdk_nvme_ctrlr_detach_ns failed: rc=%s\n",
				  spdk_strerror(abs(res)));
		return res;
	}
	free(status);

	return nvme_ctrlr_identify_active_ns(ctrlr);
}
@@ -5010,17 +5023,19 @@ spdk_nvme_ctrlr_create_ns(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_ns_dat
		free(status);
		return 0;
	}
	if (nvme_wait_for_adminq_completion(ctrlr, status)) {
		NVME_CTRLR_ERRLOG(ctrlr, "spdk_nvme_ctrlr_create_ns failed!\n");

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

	if (res) {
		NVME_CTRLR_ERRLOG(ctrlr, "wait for spdk_nvme_ctrlr_create_ns failed: rc=%s\n",
				  spdk_strerror(abs(res)));
		return 0;
	}

	nsid = status->cpl.cdw0;
	free(status);

	assert(nsid > 0);

	/* Return the namespace ID that was created */
@@ -5048,14 +5063,17 @@ spdk_nvme_ctrlr_delete_ns(struct spdk_nvme_ctrlr *ctrlr, uint32_t nsid)
		free(status);
		return res;
	}
	if (nvme_wait_for_adminq_completion(ctrlr, status)) {
		NVME_CTRLR_ERRLOG(ctrlr, "spdk_nvme_ctrlr_delete_ns failed!\n");

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

	if (res) {
		NVME_CTRLR_ERRLOG(ctrlr, "wait for spdk_nvme_ctrlr_delete_ns failed: rc=%s\n",
				  spdk_strerror(abs(res)));
		return res;
	}
	free(status);

	return nvme_ctrlr_identify_active_ns(ctrlr);
}
@@ -5079,14 +5097,17 @@ spdk_nvme_ctrlr_format(struct spdk_nvme_ctrlr *ctrlr, uint32_t nsid,
		free(status);
		return res;
	}
	if (nvme_wait_for_adminq_completion(ctrlr, status)) {
		NVME_CTRLR_ERRLOG(ctrlr, "spdk_nvme_ctrlr_format failed!\n");

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

	if (res) {
		NVME_CTRLR_ERRLOG(ctrlr, "wait for spdk_nvme_ctrlr_format failed: rc=%s\n",
				  spdk_strerror(abs(res)));
		return res;
	}
	free(status);

	return spdk_nvme_ctrlr_reset(ctrlr);
}
@@ -5144,13 +5165,17 @@ spdk_nvme_ctrlr_update_firmware(struct spdk_nvme_ctrlr *ctrlr, void *payload, ui
			return res;
		}

		if (nvme_wait_for_adminq_completion(ctrlr, status)) {
			NVME_CTRLR_ERRLOG(ctrlr, "spdk_nvme_ctrlr_fw_image_download failed!\n");
		res = nvme_wait_for_adminq_completion(ctrlr, status);
		if (res) {
			if (!status->timed_out) {
				free(status);
			}
			return -ENXIO;

			NVME_CTRLR_ERRLOG(ctrlr, "spdk_nvme_ctrlr_fw_image_download failed: rc=%s\n",
					  spdk_strerror(abs(res)));
			return res;
		}

		p += transfer;
		offset += transfer;
		size_remaining -= transfer;
@@ -5170,9 +5195,7 @@ spdk_nvme_ctrlr_update_firmware(struct spdk_nvme_ctrlr *ctrlr, void *payload, ui
	}

	res = nvme_wait_for_adminq_completion(ctrlr, status);

	memcpy(completion_status, &status->cpl.status, sizeof(struct spdk_nvme_status));

	if (!status->timed_out) {
		free(status);
	}
@@ -5185,9 +5208,11 @@ spdk_nvme_ctrlr_update_firmware(struct spdk_nvme_ctrlr *ctrlr, void *payload, ui
				NVME_CTRLR_NOTICELOG(ctrlr,
						     "firmware activation requires conventional reset to be performed. !\n");
			} else {
				NVME_CTRLR_ERRLOG(ctrlr, "nvme_ctrlr_cmd_fw_commit failed!\n");
				NVME_CTRLR_ERRLOG(ctrlr, "wait for nvme_ctrlr_cmd_fw_commit failed: rc=%s\n",
						  spdk_strerror(abs(res)));
			}
			return -ENXIO;

			return res;
		}
	}

@@ -5514,16 +5539,18 @@ spdk_nvme_ctrlr_security_receive(struct spdk_nvme_ctrlr *ctrlr, uint8_t secp,
		free(status);
		return res;
	}
	if (nvme_wait_for_adminq_completion(ctrlr, status)) {
		NVME_CTRLR_ERRLOG(ctrlr, "spdk_nvme_ctrlr_cmd_security_receive failed!\n");

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

	if (res) {
		NVME_CTRLR_ERRLOG(ctrlr, "wait for spdk_nvme_ctrlr_cmd_security_receive failed: rc=%s\n",
				  spdk_strerror(abs(res)));
	}
	free(status);

	return 0;
	return res;
}

int
@@ -5546,17 +5573,18 @@ spdk_nvme_ctrlr_security_send(struct spdk_nvme_ctrlr *ctrlr, uint8_t secp,
		free(status);
		return res;
	}
	if (nvme_wait_for_adminq_completion(ctrlr, status)) {
		NVME_CTRLR_ERRLOG(ctrlr, "spdk_nvme_ctrlr_cmd_security_send failed!\n");

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

	free(status);
	if (res) {
		NVME_CTRLR_ERRLOG(ctrlr, "spdk_nvme_ctrlr_cmd_security_send failed: rc=%s\n",
				  spdk_strerror(abs(res)));
	}

	return 0;
	return res;
}

uint64_t
+36 −31
Original line number Diff line number Diff line
@@ -59,14 +59,16 @@ nvme_fabric_prop_set_cmd_sync(struct spdk_nvme_ctrlr *ctrlr,
		return rc;
	}

	if (nvme_wait_for_adminq_completion(ctrlr, status)) {
	rc = nvme_wait_for_adminq_completion(ctrlr, status);
	if (!status->timed_out) {
		free(status);
	}
		NVME_CTRLR_ERRLOG(ctrlr, "Property Set failed\n");

	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)));
		return -1;
	}
	free(status);

	return 0;
}
@@ -130,7 +132,7 @@ nvme_fabric_prop_get_cmd_sync(struct spdk_nvme_ctrlr *ctrlr,
			      uint32_t offset, uint8_t size, uint64_t *value)
{
	struct nvme_completion_poll_status *status;
	struct spdk_nvmf_fabric_prop_get_rsp *response;
	struct spdk_nvmf_fabric_prop_get_rsp response;
	int rc;

	status = calloc(1, sizeof(*status));
@@ -145,24 +147,24 @@ nvme_fabric_prop_get_cmd_sync(struct spdk_nvme_ctrlr *ctrlr,
		return rc;
	}

	if (nvme_wait_for_adminq_completion(ctrlr, status)) {
	rc = nvme_wait_for_adminq_completion(ctrlr, status);
	response = *(struct spdk_nvmf_fabric_prop_get_rsp *)&status->cpl;
	if (!status->timed_out) {
		free(status);
	}
		NVME_CTRLR_ERRLOG(ctrlr, "Property Get failed, offset %x, size %u\n", offset, size);

	if (rc) {
		NVME_CTRLR_ERRLOG(ctrlr, "wait for nvme_fabric_prop_get_cmd offset=%x, size=%u failed: rc=%s\n",
				  offset, size, spdk_strerror(abs(rc)));
		return -1;
	}

	response = (struct spdk_nvmf_fabric_prop_get_rsp *)&status->cpl;

	if (size == SPDK_NVMF_PROP_SIZE_4) {
		*value = response->value.u32.low;
		*value = response.value.u32.low;
	} else {
		*value = response->value.u64;
		*value = response.value.u64;
	}

	free(status);

	return 0;
}

@@ -364,13 +366,15 @@ nvme_fabric_get_discovery_log_page(struct spdk_nvme_ctrlr *ctrlr,
		return -1;
	}

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

	if (rc) {
		SPDK_ERRLOG("wait for spdk_nvme_ctrlr_cmd_get_log_page failed: rc=%s\n", spdk_strerror(abs(rc)));
		return -1;
	}
	free(status);

	return 0;
}
@@ -425,16 +429,17 @@ nvme_fabric_ctrlr_scan(struct spdk_nvme_probe_ctx *probe_ctx,
		return rc;
	}

	if (nvme_wait_for_adminq_completion(discovery_ctrlr, status)) {
		NVME_CTRLR_ERRLOG(discovery_ctrlr, "nvme_identify_controller failed!\n");
		nvme_ctrlr_destruct(discovery_ctrlr);
	rc = nvme_wait_for_adminq_completion(discovery_ctrlr, status);
	if (!status->timed_out) {
		free(status);
	}
		return -ENXIO;
	}

	free(status);
	if (rc) {
		NVME_CTRLR_ERRLOG(discovery_ctrlr, "wait for nvme_identify_controller failed: rc=%s\n",
				  spdk_strerror(abs(rc)));
		nvme_ctrlr_destruct(discovery_ctrlr);
		return rc;
	}

	/* Direct attach through spdk_nvme_connect() API */
	if (direct_connect == true) {
+1 −0
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@
#include "spdk/tree.h"
#include "spdk/uuid.h"
#include "spdk/fd_group.h"
#include "spdk/string.h"

#include "spdk_internal/assert.h"
#include "spdk/log.h"
+29 −26
Original line number Diff line number Diff line
@@ -122,19 +122,20 @@ nvme_ctrlr_identify_ns(struct spdk_nvme_ns *ns)
		return rc;
	}

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

	if (rc) {
		/* This can occur if the namespace is not active. Simply zero the
		 * namespace data and continue. */
		SPDK_ERRLOG("wait for nvme_ctrlr_cmd_identify failed: rc=%s\n", spdk_strerror(abs(rc)));
		nvme_ns_destruct(ns);
		return 0;
	}
	free(status);

	nvme_ns_set_identify_data(ns);

	return 0;
}

@@ -170,17 +171,18 @@ nvme_ctrlr_identify_ns_zns_specific(struct spdk_nvme_ns *ns)
		return rc;
	}

	if (nvme_wait_for_adminq_completion(ctrlr, status)) {
		NVME_CTRLR_ERRLOG(ctrlr, "Failed to retrieve Identify IOCS Specific Namespace Data Structure\n");
		spdk_free(nsdata_zns);
	rc = nvme_wait_for_adminq_completion(ctrlr, status);
	if (!status->timed_out) {
		free(status);
	}

	if (rc) {
		NVME_CTRLR_ERRLOG(ctrlr, "wait for nvme_ctrlr_cmd_identify failed: %s\n", spdk_strerror(abs(rc)));
		spdk_free(nsdata_zns);
		return -ENXIO;
	}
	free(status);
	ns->nsdata_zns = nsdata_zns;

	ns->nsdata_zns = nsdata_zns;
	return 0;
}

@@ -216,17 +218,19 @@ nvme_ctrlr_identify_ns_nvm_specific(struct spdk_nvme_ns *ns)
		return rc;
	}

	if (nvme_wait_for_adminq_completion(ctrlr, status)) {
		NVME_CTRLR_ERRLOG(ctrlr, "Failed to retrieve Identify IOCS Specific Namespace Data Structure\n");
		spdk_free(nsdata_nvm);
	rc = nvme_wait_for_adminq_completion(ctrlr, status);
	if (!status->timed_out) {
		free(status);
	}

	if (rc) {
		NVME_CTRLR_ERRLOG(ctrlr, "wait for nvme_ctrlr_cmd_identify failed: rc=%s\n",
				  spdk_strerror(abs(rc)));
		spdk_free(nsdata_nvm);
		return -ENXIO;
	}
	free(status);
	ns->nsdata_nvm = nsdata_nvm;

	ns->nsdata_nvm = nsdata_nvm;
	return 0;
}

@@ -284,17 +288,16 @@ nvme_ctrlr_identify_id_desc(struct spdk_nvme_ns *ns)
	}

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

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

	nvme_ns_set_id_desc_list_data(ns);
	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));
	}

	nvme_ns_set_id_desc_list_data(ns);
	return rc;
}

+15 −6
Original line number Diff line number Diff line
@@ -1150,10 +1150,15 @@ nvme_pcie_ctrlr_delete_io_qpair(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_
		free(status);
		goto free;
	}
	if (nvme_wait_for_adminq_completion(ctrlr, status)) {

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

		NVME_CTRLR_ERRLOG(ctrlr, "wait for nvme_pcie_ctrlr_cmd_delete_io_sq failed: rc=%s\n",
				  spdk_strerror(abs(rc)));
		goto free;
	}

@@ -1172,13 +1177,17 @@ nvme_pcie_ctrlr_delete_io_qpair(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_
		free(status);
		goto free;
	}
	if (nvme_wait_for_adminq_completion(ctrlr, status)) {

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

	if (rc) {
		NVME_CTRLR_ERRLOG(ctrlr, "wait for nvme_pcie_ctrlr_cmd_delete_io_cq failed: rc=%s\n",
				  spdk_strerror(abs(rc)));
		goto free;
	}
	free(status);

clear_shadow_doorbells:
	if (pqpair->flags.has_shadow_doorbell && ctrlr->shadow_doorbell) {
Loading