]> www.infradead.org Git - users/sagi/libnvme.git/commitdiff
examples: Add column disaply of topology
authorKeith Busch <kbusch@kernel.org>
Thu, 6 Feb 2020 23:12:55 +0000 (15:12 -0800)
committerKeith Busch <kbusch@kernel.org>
Thu, 6 Feb 2020 23:12:55 +0000 (15:12 -0800)
Pretty print nvme topology in detailed columns.

Signed-off-by: Keith Busch <kbusch@kernel.org>
.gitignore
examples/Makefile
examples/display-columnar.c [new file with mode: 0644]

index fa77022a8ed6a9129d5c7acd1bc5d554a55218ba..2cef1e0bc1af75c4138b995ffb9d2b476de616d5 100644 (file)
@@ -10,6 +10,7 @@ a.out
 test/test
 
 examples/display-tree
+examples/display-columnar
 examples/telemetry-listen
 
 config-host.h
index 877428a483e12296f1a09e8e937717159b05312a..5c4a082e80aeec32ec449d9a589d7425783f3b3b 100644 (file)
@@ -7,11 +7,11 @@ ifneq ($(MAKECMDGOALS),clean)
 include ../config-host.mak
 endif
 
-all_targets += telemetry-listen display-tree
+all_targets += telemetry-listen display-tree display-columnar
 
 all: $(all_targets)
 
-test_srcs := telemetry-listen.c display-tree.c
+test_srcs := telemetry-listen.c display-tree.c display-columnar.c
 
 test_objs := $(patsubst %.c,%.ol,$(test_srcs))
 
diff --git a/examples/display-columnar.c b/examples/display-columnar.c
new file mode 100644 (file)
index 0000000..b3dbc7e
--- /dev/null
@@ -0,0 +1,100 @@
+/**
+ * display-tree: Scans the nvme topology, prints as an ascii tree with some
+ * selected attributes for each component.
+ */
+#include <stdio.h>
+#include <libnvme.h>
+
+static const char dash[101] = {[0 ... 99] = '-'};
+int main()
+{
+       nvme_root_t r;
+       nvme_subsystem_t s;
+       nvme_ctrl_t c;
+       nvme_path_t p;
+       nvme_ns_t n;
+
+       r = nvme_scan();
+       if (!r)
+               return -1;
+
+
+       printf("%-16s %-96s %-.16s\n", "Subsystem", "Subsystem-NQN", "Controllers");
+       printf("%-.16s %-.96s %-.16s\n", dash, dash, dash);
+
+       nvme_for_each_subsystem(r, s) {
+               bool first = true;
+               printf("%-16s %-96s ", nvme_subsystem_get_name(s), nvme_subsystem_get_nqn(s));
+
+               nvme_subsystem_for_each_ctrl(s, c) {
+                       printf("%s%s", first ? "": ", ", nvme_ctrl_get_name(c));
+                       first = false;
+               }
+               printf("\n");
+       }
+       printf("\n");
+
+       printf("%-8s %-20s %-40s %-8s %-6s %-14s %-12s %-16s\n", "Device",
+               "SN", "MN", "FR", "TxPort", "Address", "Subsystem", "Namespaces");
+       printf("%-.8s %-.20s %-.40s %-.8s %-.6s %-.14s %-.12s %-.16s\n", dash, dash,
+               dash, dash, dash, dash, dash, dash);
+
+       nvme_for_each_subsystem(r, s) {
+               nvme_subsystem_for_each_ctrl(s, c) {
+                       bool first = true;
+
+                       printf("%-8s %-20s %-40s %-8s %-6s %-14s %-12s ",
+                               nvme_ctrl_get_name(c), nvme_ctrl_get_serial(c),
+                               nvme_ctrl_get_model(c), nvme_ctrl_get_firmware(c),
+                               nvme_ctrl_get_transport(c), nvme_ctrl_get_address(c),
+                               nvme_subsystem_get_name(s));
+
+                       nvme_ctrl_for_each_ns(c, n) {
+                               printf("%s%s", first ? "": ", ",
+                                       nvme_ns_get_name(n));
+                               first = false;
+                       }
+
+                       nvme_ctrl_for_each_path(c, p) {
+                               printf("%s%s", first ? "": ", ",
+                                       nvme_ns_get_name(nvme_path_get_ns(p)));
+                               first = false;
+                       }
+                       printf("\n");
+               }
+       }
+       printf("\n");
+
+       printf("%-12s %-8s %-16s %-8s %-16s\n", "Device", "NSID", "Sectors", "Format", "Controllers");
+       printf("%-.12s %-.8s %-.16s %-.8s %-.16s\n", dash, dash, dash, dash, dash);
+
+       nvme_for_each_subsystem(r, s) {
+               nvme_subsystem_for_each_ctrl(s, c)
+                       nvme_ctrl_for_each_ns(c, n)
+                               printf("%-12s %-8d %-16lu %-8d %s\n",
+                                       nvme_ns_get_name(n),
+                                       nvme_ns_get_nsid(n),
+                                       nvme_ns_get_lba_count(n),
+                                       nvme_ns_get_lba_size(n),
+                                       nvme_ctrl_get_name(c));
+
+               nvme_subsystem_for_each_ns(s, n) {
+                       bool first = true;
+
+                       printf("%-12s %-8d %-16lu %-8d ",
+                               nvme_ns_get_name(n),
+                               nvme_ns_get_nsid(n),
+                               nvme_ns_get_lba_count(n),
+                               nvme_ns_get_lba_size(n));
+
+                       nvme_subsystem_for_each_ctrl(s, c) {
+                               printf("%s%s", first ? "" : ", ",
+                                       nvme_ctrl_get_name(c));
+                               first = false;
+                       }
+                       printf("\n");
+               }
+       }
+       return 0;
+}
+