From cc2b6962f985d8762847066fdfd70ff5a17b2c06 Mon Sep 17 00:00:00 2001 From: Shuhei Matsumoto Date: Wed, 23 Sep 2020 02:55:57 +0900 Subject: [PATCH] lib/nvme: Keep ANA state per namespace up-to-date Add ana_state and ana_group_id to struct spdk_nvme_ns and keep them up-to-date by updating when spdk_nvme_ctrlr is created or ANA change notice is received asynchronously. For both cases, struct spdk_nvme_ctrlr holds the latest ANA state. Signed-off-by: Shuhei Matsumoto Change-Id: I311fe1c8015c8b8ac9659c38661244706c04b3e3 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/4287 Tested-by: SPDK CI Jenkins Reviewed-by: Ben Walker Reviewed-by: Aleksey Marchuk --- lib/nvme/nvme_ctrlr.c | 28 ++++++++++++++++++++++++++++ lib/nvme/nvme_internal.h | 3 +++ 2 files changed, 31 insertions(+) diff --git a/lib/nvme/nvme_ctrlr.c b/lib/nvme/nvme_ctrlr.c index ce33f9290..075bdf177 100644 --- a/lib/nvme/nvme_ctrlr.c +++ b/lib/nvme/nvme_ctrlr.c @@ -725,6 +725,29 @@ nvme_ctrlr_init_ana_log_page(struct spdk_nvme_ctrlr *ctrlr) return nvme_ctrlr_update_ana_log_page(ctrlr); } +static int +nvme_ctrlr_update_ns_ana_states(const struct spdk_nvme_ana_group_descriptor *desc, + void *cb_arg) +{ + struct spdk_nvme_ctrlr *ctrlr = cb_arg; + struct spdk_nvme_ns *ns; + uint32_t i, nsid; + + for (i = 0; i < desc->num_of_nsid; i++) { + nsid = desc->nsid[i]; + if (nsid == 0 || nsid > ctrlr->cdata.nn) { + continue; + } + + ns = &ctrlr->ns[nsid - 1]; + + ns->ana_group_id = desc->ana_group_id; + ns->ana_state = desc->ana_state; + } + + return 0; +} + int nvme_ctrlr_parse_ana_log_page(struct spdk_nvme_ctrlr *ctrlr, spdk_nvme_parse_ana_log_page_cb cb_fn, void *cb_arg) @@ -772,6 +795,10 @@ nvme_ctrlr_set_supported_log_pages(struct spdk_nvme_ctrlr *ctrlr) } if (ctrlr->cdata.cmic.ana_reporting) { rc = nvme_ctrlr_init_ana_log_page(ctrlr); + if (rc == 0) { + nvme_ctrlr_parse_ana_log_page(ctrlr, nvme_ctrlr_update_ns_ana_states, + ctrlr); + } } out: @@ -2226,6 +2253,7 @@ nvme_ctrlr_async_event_cb(void *arg, const struct spdk_nvme_cpl *cpl) if (rc) { return; } + nvme_ctrlr_parse_ana_log_page(ctrlr, nvme_ctrlr_update_ns_ana_states, ctrlr); } active_proc = nvme_ctrlr_get_current_process(ctrlr); diff --git a/lib/nvme/nvme_internal.h b/lib/nvme/nvme_internal.h index ba54da1a4..39febb2f4 100644 --- a/lib/nvme/nvme_internal.h +++ b/lib/nvme/nvme_internal.h @@ -481,6 +481,9 @@ struct spdk_nvme_ns { /* Namespace Identification Descriptor List (CNS = 03h) */ uint8_t id_desc_list[4096]; + + uint32_t ana_group_id; + enum spdk_nvme_ana_state ana_state; }; /**