From 743271d92d658e681c2f75caf383585f3cbb9ec5 Mon Sep 17 00:00:00 2001 From: Niklas Cassel Date: Wed, 16 Sep 2020 09:48:05 +0000 Subject: [PATCH] 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 Change-Id: Ie06180a4b3750dfa1a42f47afe0f7f9e3ec04ba9 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/4266 Community-CI: Broadcom CI Reviewed-by: Jim Harris Reviewed-by: Changpeng Liu Tested-by: SPDK CI Jenkins --- lib/nvme/nvme_ctrlr.c | 2 ++ lib/nvme/nvme_internal.h | 4 ++++ lib/nvme/nvme_ns.c | 18 ++++++++++++++++-- .../unit/lib/nvme/nvme_ctrlr.c/nvme_ctrlr_ut.c | 1 + test/unit/lib/nvme/nvme_ns.c/nvme_ns_ut.c | 8 ++++---- 5 files changed, 27 insertions(+), 6 deletions(-) diff --git a/lib/nvme/nvme_ctrlr.c b/lib/nvme/nvme_ctrlr.c index 6a85745bf..8f6796b0c 100644 --- a/lib/nvme/nvme_ctrlr.c +++ b/lib/nvme/nvme_ctrlr.c @@ -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); diff --git a/lib/nvme/nvme_internal.h b/lib/nvme/nvme_internal.h index 71d5df69b..9f8aa4e1c 100644 --- a/lib/nvme/nvme_internal.h +++ b/lib/nvme/nvme_internal.h @@ -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); diff --git a/lib/nvme/nvme_ns.c b/lib/nvme/nvme_ns.c index 61f500fe2..0d2c3bacf 100644 --- a/lib/nvme/nvme_ns.c +++ b/lib/nvme/nvme_ns.c @@ -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) diff --git a/test/unit/lib/nvme/nvme_ctrlr.c/nvme_ctrlr_ut.c b/test/unit/lib/nvme/nvme_ctrlr.c/nvme_ctrlr_ut.c index 20bd5d440..6264f33dd 100644 --- a/test/unit/lib/nvme/nvme_ctrlr.c/nvme_ctrlr_ut.c +++ b/test/unit/lib/nvme/nvme_ctrlr.c/nvme_ctrlr_ut.c @@ -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); diff --git a/test/unit/lib/nvme/nvme_ns.c/nvme_ns_ut.c b/test/unit/lib/nvme/nvme_ns.c/nvme_ns_ut.c index 7a1b61668..954af366d 100644 --- a/test/unit/lib/nvme/nvme_ns.c/nvme_ns_ut.c +++ b/test/unit/lib/nvme/nvme_ns.c/nvme_ns_ut.c @@ -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); }