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;
}
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);

View File

@ -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);

View File

@ -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)

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,
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);

View File

@ -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);
}