From 8c6c009fcedb2efca65f16b1b13480aea57d9dc1 Mon Sep 17 00:00:00 2001 From: Niklas Cassel Date: Wed, 14 Oct 2020 20:51:23 +0000 Subject: [PATCH] examples/nvme/identify: print ZNS data structures if supported Print the Zoned Namespace Command Set Specific data structures, if the namespace/controller supports them. spdk_nvme_zns_ctrlr_get_data() returns NULL for a controller that does not support the ZNS specific controller data struct. Signed-off-by: Niklas Cassel Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/4839 (master) (cherry picked from commit 00d197dba226513db4e00f59b86980e0feca2084) Change-Id: I0acd2695976fc598b61591989f612db35ac821db Signed-off-by: Tomasz Zawadzki Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/4942 Reviewed-by: Jim Harris Reviewed-by: Shuhei Matsumoto Tested-by: SPDK CI Jenkins --- examples/nvme/identify/identify.c | 58 ++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/examples/nvme/identify/identify.c b/examples/nvme/identify/identify.c index d7d00f723..06268518a 100644 --- a/examples/nvme/identify/identify.c +++ b/examples/nvme/identify/identify.c @@ -775,11 +775,50 @@ print_zns_zone_report(void) g_zone_report = NULL; } +static void +print_zns_ns_data(const struct spdk_nvme_zns_ns_data *nsdata_zns) +{ + printf("ZNS Specific Namespace Data\n"); + printf("===========================\n"); + printf("Variable Zone Capacity: %s\n", + nsdata_zns->zoc.variable_zone_capacity ? "Yes" : "No"); + printf("Zone Active Excursions: %s\n", + nsdata_zns->zoc.zone_active_excursions ? "Yes" : "No"); + printf("Read Across Zone Boundaries: %s\n", + nsdata_zns->ozcs.read_across_zone_boundaries ? "Yes" : "No"); + if (nsdata_zns->mar == 0xffffffff) { + printf("Max Active Resources: No Limit\n"); + } else { + printf("Max Active Resources: %"PRIu32"\n", + nsdata_zns->mar + 1); + } + if (nsdata_zns->mor == 0xffffffff) { + printf("Max Open Resources: No Limit\n"); + } else { + printf("Max Open Resources: %"PRIu32"\n", + nsdata_zns->mor + 1); + } + if (nsdata_zns->rrl == 0) { + printf("Reset Recommended Limit: Not Reported\n"); + } else { + printf("Reset Recommended Limit: %"PRIu32"\n", + nsdata_zns->rrl); + } + if (nsdata_zns->frl == 0) { + printf("Finish Recommended Limit: Not Reported\n"); + } else { + printf("Finish Recommended Limit: %"PRIu32"\n", + nsdata_zns->frl); + } + printf("\n"); +} + static void print_namespace(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_ns *ns) { const struct spdk_nvme_ctrlr_data *cdata; const struct spdk_nvme_ns_data *nsdata; + const struct spdk_nvme_zns_ns_data *nsdata_zns; const struct spdk_uuid *uuid; uint32_t i; uint32_t flags; @@ -788,6 +827,7 @@ print_namespace(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_ns *ns) cdata = spdk_nvme_ctrlr_get_data(ctrlr); nsdata = spdk_nvme_ns_get_data(ns); + nsdata_zns = spdk_nvme_zns_ns_get_data(ns); flags = spdk_nvme_ns_get_flags(ns); printf("Namespace ID:%d\n", spdk_nvme_ns_get_id(ns)); @@ -888,9 +928,15 @@ print_namespace(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_ns *ns) printf("Number of LBA Formats: %d\n", nsdata->nlbaf + 1); printf("Current LBA Format: LBA Format #%02d\n", nsdata->flbas.format); - for (i = 0; i <= nsdata->nlbaf; i++) + for (i = 0; i <= nsdata->nlbaf; i++) { printf("LBA Format #%02d: Data Size: %5d Metadata Size: %5d\n", i, 1 << nsdata->lbaf[i].lbads, nsdata->lbaf[i].ms); + if (spdk_nvme_ns_get_csi(ns) == SPDK_NVME_CSI_ZNS) { + printf("LBA Format Extension #%02d: Zone Size (in LBAs): 0x%"PRIx64" Zone Descriptor Extension Size: %d bytes\n", + i, nsdata_zns->lbafe[i].zsze, nsdata_zns->lbafe[i].zdes << 6); + } + + } printf("\n"); if (spdk_nvme_ctrlr_is_ocssd_supported(ctrlr)) { @@ -904,6 +950,7 @@ print_namespace(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_ns *ns) printf("ERROR: spdk_nvme_ctrlr_alloc_io_qpair() failed\n"); exit(1); } + print_zns_ns_data(nsdata_zns); get_zns_zone_report(ns, qpair); print_zns_zone_report(); spdk_nvme_ctrlr_free_io_qpair(qpair); @@ -1754,6 +1801,15 @@ print_controller(struct spdk_nvme_ctrlr *ctrlr, const struct spdk_nvme_transport printf("\n"); } + if (spdk_nvme_zns_ctrlr_get_data(ctrlr)) { + printf("ZNS Specific Controller Data\n"); + printf("============================\n"); + printf("Zone Append Size Limit: %u\n", + spdk_nvme_zns_ctrlr_get_data(ctrlr)->zasl); + printf("\n"); + printf("\n"); + } + printf("Active Namespaces\n"); printf("=================\n"); for (nsid = spdk_nvme_ctrlr_get_first_active_ns(ctrlr);