Commit 5a226eb0 authored by Changpeng Liu's avatar Changpeng Liu Committed by Tomasz Zawadzki
Browse files

examples/identify: don't read PMPCAP and CMBSZ if not support in CAP



I got error logs when running `identify` utility with NVMe-oF for above
2 registers access, so add a check before reading them in `identify`.

Change-Id: Ifb31c3d2ab2b0426c6af7b69f189ea2f1cdde846
Signed-off-by: default avatarChangpeng Liu <changpeng.liu@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/20471


Community-CI: Mellanox Build Bot
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarJim Harris <jim.harris@samsung.com>
Reviewed-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
parent c3d90406
Loading
Loading
Loading
Loading
+12 −8
Original line number Diff line number Diff line
@@ -1594,8 +1594,6 @@ print_controller(struct spdk_nvme_ctrlr *ctrlr, const struct spdk_nvme_transport
	const struct spdk_nvme_ctrlr_data	*cdata;
	union spdk_nvme_cap_register		cap;
	union spdk_nvme_vs_register		vs;
	union spdk_nvme_cmbsz_register		cmbsz;
	union spdk_nvme_pmrcap_register		pmrcap;
	uint8_t					str[512];
	uint32_t				i, j;
	struct spdk_nvme_error_information_entry *error_entry;
@@ -1603,7 +1601,6 @@ print_controller(struct spdk_nvme_ctrlr *ctrlr, const struct spdk_nvme_transport
	struct spdk_pci_device			*pci_dev;
	struct spdk_pci_id			pci_id;
	uint32_t				nsid;
	uint64_t				pmrsz;
	uint8_t					*orig_desc;
	struct spdk_nvme_ana_group_descriptor	*copied_desc;
	uint32_t				desc_size, copy_len;
@@ -1611,9 +1608,6 @@ print_controller(struct spdk_nvme_ctrlr *ctrlr, const struct spdk_nvme_transport

	cap = spdk_nvme_ctrlr_get_regs_cap(ctrlr);
	vs = spdk_nvme_ctrlr_get_regs_vs(ctrlr);
	cmbsz = spdk_nvme_ctrlr_get_regs_cmbsz(ctrlr);
	pmrcap = spdk_nvme_ctrlr_get_regs_pmrcap(ctrlr);
	pmrsz = spdk_nvme_ctrlr_get_pmrsz(ctrlr);

	if (!spdk_nvme_ctrlr_is_discovery(ctrlr)) {
		/*
@@ -1780,8 +1774,12 @@ print_controller(struct spdk_nvme_ctrlr *ctrlr, const struct spdk_nvme_transport

	printf("Controller Memory Buffer Support\n");
	printf("================================\n");
	if (cmbsz.raw != 0) {
		uint64_t size = cmbsz.bits.sz;
	if (cap.bits.cmbs != 0) {
		union spdk_nvme_cmbsz_register		cmbsz;
		uint64_t size;

		cmbsz = spdk_nvme_ctrlr_get_regs_cmbsz(ctrlr);
		size = cmbsz.bits.sz;

		/* Convert the size to bytes by multiplying by the granularity.
		   By spec, szu is at most 6 and sz is 20 bits, so size requires
@@ -1806,6 +1804,12 @@ print_controller(struct spdk_nvme_ctrlr *ctrlr, const struct spdk_nvme_transport
	printf("Persistent Memory Region Support\n");
	printf("================================\n");
	if (cap.bits.pmrs != 0) {
		union spdk_nvme_pmrcap_register		pmrcap;
		uint64_t				pmrsz;

		pmrcap = spdk_nvme_ctrlr_get_regs_pmrcap(ctrlr);
		pmrsz = spdk_nvme_ctrlr_get_pmrsz(ctrlr);

		printf("Supported:                             Yes\n");
		printf("Total Size:                            %" PRIu64 " bytes\n", pmrsz);
		printf("Read data and metadata in PMR          %s\n",
+4 −1
Original line number Diff line number Diff line
@@ -98,7 +98,10 @@ union spdk_nvme_cap_register {
		/** persistent memory region supported */
		uint32_t pmrs		: 1;

		uint32_t reserved3	: 7;
		/** controller memory buffer supported */
		uint32_t cmbs		: 1;

		uint32_t reserved3	: 6;
	} bits;
};
SPDK_STATIC_ASSERT(sizeof(union spdk_nvme_cap_register) == 8, "Incorrect size");
+1 −1
Original line number Diff line number Diff line
@@ -149,7 +149,7 @@ nvme_fabric_prop_get_cmd_sync(struct spdk_nvme_ctrlr *ctrlr,
		if (!status->timed_out) {
			free(status);
		}
		SPDK_ERRLOG("Property Get failed\n");
		SPDK_ERRLOG("Property Get failed, offset %x, size %u\n", offset, size);
		return -1;
	}

+2 −0
Original line number Diff line number Diff line
@@ -127,6 +127,8 @@ function confirm_abi_deps() {
	name = spdk_nvme_cdata_nvmf_specific
[suppress_type]
	name = spdk_nvme_cmd
[suppress_type]
	name = spdk_nvme_cap_register
[suppress_type]
	name = spdk_bs_opts
[suppress_type]