Commit 743271d9 authored by Niklas Cassel's avatar Niklas Cassel Committed by Tomasz Zawadzki
Browse files

nvme: cache the command set identifier



Since the command set identifier might be accessed at several
different states in the nvme state machine, cache it so that
we don't need to loop through the ns id desc list every time.

This is similar to how other identify fields are cached using
nvme_ns_set_identify_data().

None of the identifiers in the desc list (including the new CSI)
can change over the life time of a namespace, so caching them
should be safe.

Signed-off-by: default avatarNiklas Cassel <niklas.cassel@wdc.com>
Change-Id: Ie06180a4b3750dfa1a42f47afe0f7f9e3ec04ba9
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/4266


Community-CI: Broadcom CI
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarChangpeng Liu <changpeng.liu@intel.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
parent a7de7dee
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -1694,6 +1694,8 @@ nvme_ctrlr_identify_id_desc_async_done(void *arg, const struct spdk_nvme_cpl *cp
		return;
	}

	nvme_ns_set_id_desc_list_data(ns);

	/* move on to the next active NS */
	nsid = spdk_nvme_ctrlr_get_next_active_ns(ctrlr, ns->id);
	ns = spdk_nvme_ctrlr_get_ns(ctrlr, nsid);
+4 −0
Original line number Diff line number Diff line
@@ -476,6 +476,9 @@ struct spdk_nvme_ns {
	uint32_t			id;
	uint16_t			flags;

	/* Command Set Identifier */
	enum spdk_nvme_csi		csi;

	/* Namespace Identification Descriptor List (CNS = 03h) */
	uint8_t				id_desc_list[4096];
};
@@ -947,6 +950,7 @@ void nvme_qpair_resubmit_requests(struct spdk_nvme_qpair *qpair, uint32_t num_re

int	nvme_ctrlr_identify_active_ns(struct spdk_nvme_ctrlr *ctrlr);
void	nvme_ns_set_identify_data(struct spdk_nvme_ns *ns);
void	nvme_ns_set_id_desc_list_data(struct spdk_nvme_ns *ns);
int	nvme_ns_construct(struct spdk_nvme_ns *ns, uint32_t id,
			  struct spdk_nvme_ctrlr *ctrlr);
void	nvme_ns_destruct(struct spdk_nvme_ns *ns);
+16 −2
Original line number Diff line number Diff line
@@ -189,6 +189,8 @@ nvme_ctrlr_identify_id_desc(struct spdk_nvme_ns *ns)
		free(status);
	}

	nvme_ns_set_id_desc_list_data(ns);

	return rc;
}

@@ -361,8 +363,8 @@ spdk_nvme_ns_get_uuid(const struct spdk_nvme_ns *ns)
	return uuid;
}

enum spdk_nvme_csi
spdk_nvme_ns_get_csi(const struct spdk_nvme_ns *ns) {
static enum spdk_nvme_csi
nvme_ns_get_csi(const struct spdk_nvme_ns *ns) {
	const uint8_t *csi;
	size_t csi_size;

@@ -384,6 +386,17 @@ spdk_nvme_ns_get_csi(const struct spdk_nvme_ns *ns) {
	return *csi;
}

void
nvme_ns_set_id_desc_list_data(struct spdk_nvme_ns *ns)
{
	ns->csi = nvme_ns_get_csi(ns);
}

enum spdk_nvme_csi
spdk_nvme_ns_get_csi(const struct spdk_nvme_ns *ns) {
	return ns->csi;
}

int nvme_ns_construct(struct spdk_nvme_ns *ns, uint32_t id,
		      struct spdk_nvme_ctrlr *ctrlr)
{
@@ -425,6 +438,7 @@ void nvme_ns_destruct(struct spdk_nvme_ns *ns)
	ns->sectors_per_max_io = 0;
	ns->sectors_per_stripe = 0;
	ns->flags = 0;
	ns->csi = SPDK_NVME_CSI_NVM;
}

int nvme_ns_update(struct spdk_nvme_ns *ns)
+1 −0
Original line number Diff line number Diff line
@@ -67,6 +67,7 @@ DEFINE_STUB(nvme_ctrlr_cmd_set_host_id, int,
	    (struct spdk_nvme_ctrlr *ctrlr, void *host_id, uint32_t host_id_size,
	     spdk_nvme_cmd_cb cb_fn, void *cb_arg), 0);
DEFINE_STUB_V(nvme_ns_set_identify_data, (struct spdk_nvme_ns *ns));
DEFINE_STUB_V(nvme_ns_set_id_desc_list_data, (struct spdk_nvme_ns *ns));
DEFINE_STUB_V(nvme_qpair_abort_reqs, (struct spdk_nvme_qpair *qpair, uint32_t dnr));
DEFINE_STUB(spdk_nvme_poll_group_remove, int, (struct spdk_nvme_poll_group *group,
		struct spdk_nvme_qpair *qpair), 0);
+4 −4
Original line number Diff line number Diff line
@@ -154,7 +154,7 @@ test_nvme_ns_csi(void)

	/* Empty list - SPDK_NVME_CSI_NVM should be returned */
	nvme_ns_construct(&ns, id, &ctrlr);
	csi = spdk_nvme_ns_get_csi(&ns);
	csi = nvme_ns_get_csi(&ns);
	CU_ASSERT(csi == SPDK_NVME_CSI_NVM);
	nvme_ns_destruct(&ns);

@@ -163,7 +163,7 @@ test_nvme_ns_csi(void)
	ns.id_desc_list[0] = 0x4; /* NIDT == CSI */
	ns.id_desc_list[1] = 0x1; /* NIDL */
	ns.id_desc_list[4] = 0x0; /* SPDK_NVME_CSI_NVM */
	csi = spdk_nvme_ns_get_csi(&ns);
	csi = nvme_ns_get_csi(&ns);
	CU_ASSERT(csi == SPDK_NVME_CSI_NVM);
	nvme_ns_destruct(&ns);

@@ -175,7 +175,7 @@ test_nvme_ns_csi(void)
	ns.id_desc_list[20] = 0x4; /* NIDT == CSI */
	ns.id_desc_list[21] = 0x1; /* NIDL */
	ns.id_desc_list[24] = 0x2; /* SPDK_NVME_CSI_ZNS */
	csi = spdk_nvme_ns_get_csi(&ns);
	csi = nvme_ns_get_csi(&ns);
	CU_ASSERT(csi == SPDK_NVME_CSI_ZNS);
	nvme_ns_destruct(&ns);

@@ -187,7 +187,7 @@ test_nvme_ns_csi(void)
	ns.id_desc_list[5] = 0x02; /* NIDT == NGUID */
	ns.id_desc_list[6] = 0x10; /* NIDL */
	memset(&ns.id_desc_list[9], 0xCC, 0x10);
	csi = spdk_nvme_ns_get_csi(&ns);
	csi = nvme_ns_get_csi(&ns);
	CU_ASSERT(csi == SPDK_NVME_CSI_KV);
	nvme_ns_destruct(&ns);
}