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:
parent
a7de7dee23
commit
743271d92d
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user