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: Niklas 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: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Changpeng Liu <changpeng.liu@intel.com>
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
This commit is contained in:
Niklas Cassel 2020-09-16 09:48:05 +00:00 committed by Tomasz Zawadzki
parent a7de7dee23
commit 743271d92d
5 changed files with 27 additions and 6 deletions

View File

@ -1694,6 +1694,8 @@ nvme_ctrlr_identify_id_desc_async_done(void *arg, const struct spdk_nvme_cpl *cp
return; return;
} }
nvme_ns_set_id_desc_list_data(ns);
/* move on to the next active NS */ /* move on to the next active NS */
nsid = spdk_nvme_ctrlr_get_next_active_ns(ctrlr, ns->id); nsid = spdk_nvme_ctrlr_get_next_active_ns(ctrlr, ns->id);
ns = spdk_nvme_ctrlr_get_ns(ctrlr, nsid); ns = spdk_nvme_ctrlr_get_ns(ctrlr, nsid);

View File

@ -476,6 +476,9 @@ struct spdk_nvme_ns {
uint32_t id; uint32_t id;
uint16_t flags; uint16_t flags;
/* Command Set Identifier */
enum spdk_nvme_csi csi;
/* Namespace Identification Descriptor List (CNS = 03h) */ /* Namespace Identification Descriptor List (CNS = 03h) */
uint8_t id_desc_list[4096]; 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); 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_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, int nvme_ns_construct(struct spdk_nvme_ns *ns, uint32_t id,
struct spdk_nvme_ctrlr *ctrlr); struct spdk_nvme_ctrlr *ctrlr);
void nvme_ns_destruct(struct spdk_nvme_ns *ns); void nvme_ns_destruct(struct spdk_nvme_ns *ns);

View File

@ -189,6 +189,8 @@ nvme_ctrlr_identify_id_desc(struct spdk_nvme_ns *ns)
free(status); free(status);
} }
nvme_ns_set_id_desc_list_data(ns);
return rc; return rc;
} }
@ -361,8 +363,8 @@ spdk_nvme_ns_get_uuid(const struct spdk_nvme_ns *ns)
return uuid; return uuid;
} }
enum spdk_nvme_csi static enum spdk_nvme_csi
spdk_nvme_ns_get_csi(const struct spdk_nvme_ns *ns) { nvme_ns_get_csi(const struct spdk_nvme_ns *ns) {
const uint8_t *csi; const uint8_t *csi;
size_t csi_size; size_t csi_size;
@ -384,6 +386,17 @@ spdk_nvme_ns_get_csi(const struct spdk_nvme_ns *ns) {
return *csi; 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, int nvme_ns_construct(struct spdk_nvme_ns *ns, uint32_t id,
struct spdk_nvme_ctrlr *ctrlr) 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_max_io = 0;
ns->sectors_per_stripe = 0; ns->sectors_per_stripe = 0;
ns->flags = 0; ns->flags = 0;
ns->csi = SPDK_NVME_CSI_NVM;
} }
int nvme_ns_update(struct spdk_nvme_ns *ns) int nvme_ns_update(struct spdk_nvme_ns *ns)

View File

@ -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, (struct spdk_nvme_ctrlr *ctrlr, void *host_id, uint32_t host_id_size,
spdk_nvme_cmd_cb cb_fn, void *cb_arg), 0); 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_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_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, DEFINE_STUB(spdk_nvme_poll_group_remove, int, (struct spdk_nvme_poll_group *group,
struct spdk_nvme_qpair *qpair), 0); struct spdk_nvme_qpair *qpair), 0);

View File

@ -154,7 +154,7 @@ test_nvme_ns_csi(void)
/* Empty list - SPDK_NVME_CSI_NVM should be returned */ /* Empty list - SPDK_NVME_CSI_NVM should be returned */
nvme_ns_construct(&ns, id, &ctrlr); 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); CU_ASSERT(csi == SPDK_NVME_CSI_NVM);
nvme_ns_destruct(&ns); 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[0] = 0x4; /* NIDT == CSI */
ns.id_desc_list[1] = 0x1; /* NIDL */ ns.id_desc_list[1] = 0x1; /* NIDL */
ns.id_desc_list[4] = 0x0; /* SPDK_NVME_CSI_NVM */ 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); CU_ASSERT(csi == SPDK_NVME_CSI_NVM);
nvme_ns_destruct(&ns); 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[20] = 0x4; /* NIDT == CSI */
ns.id_desc_list[21] = 0x1; /* NIDL */ ns.id_desc_list[21] = 0x1; /* NIDL */
ns.id_desc_list[24] = 0x2; /* SPDK_NVME_CSI_ZNS */ 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); CU_ASSERT(csi == SPDK_NVME_CSI_ZNS);
nvme_ns_destruct(&ns); 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[5] = 0x02; /* NIDT == NGUID */
ns.id_desc_list[6] = 0x10; /* NIDL */ ns.id_desc_list[6] = 0x10; /* NIDL */
memset(&ns.id_desc_list[9], 0xCC, 0x10); 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); CU_ASSERT(csi == SPDK_NVME_CSI_KV);
nvme_ns_destruct(&ns); nvme_ns_destruct(&ns);
} }