]> www.infradead.org Git - users/sagi/nvme-cli.git/commitdiff
nvme: Support show-regs for nvmeof
authorMinsik Jeon <hmi.jeon@samsung.com>
Wed, 2 Oct 2024 08:18:59 +0000 (17:18 +0900)
committerDaniel Wagner <wagi@monom.org>
Wed, 2 Oct 2024 09:36:13 +0000 (11:36 +0200)
Get properties only at offsets that support nvme fabric registers.
Since crto was not found in the nvmeof spec, it is removed.
Also, NSSR is only optional register. If the device is not supported by
the optional register, the error is ignored.

Reviewed-by: Steven Seungcheol <sc108.lee@samsung.com>
Signed-off-by: Minsik Jeon <hmi.jeon@samsung.com>
nvme-print.c
nvme-print.h
nvme.c

index ae21c91f0746c10f437bd761f8ae51962e271824..7b8cbf8acb35b9bd3954ee7ef5db4983e8c9e21b 100644 (file)
@@ -406,7 +406,18 @@ bool nvme_is_fabrics_reg(int offset)
        case NVME_REG_CC:
        case NVME_REG_CSTS:
        case NVME_REG_NSSR:
-       case NVME_REG_CRTO:
+               return true;
+       default:
+               break;
+       }
+
+       return false;
+}
+
+bool nvme_is_fabrics_optional_reg(int offset)
+{
+       switch (offset) {
+       case NVME_REG_NSSR:
                return true;
        default:
                break;
index 7ebf64556e81f19a0e9232ca4e287c956687f1bf..6107df926bdae3d1bdea53309fa5e76e92aad970 100644 (file)
@@ -323,6 +323,7 @@ void nvme_show_error_status(int status, const char *msg, ...);
 void nvme_show_init(void);
 void nvme_show_finish(void);
 bool nvme_is_fabrics_reg(int offset);
+bool nvme_is_fabrics_optional_reg(int offset);
 bool nvme_registers_cmbloc_support(__u32 cmbsz);
 bool nvme_registers_pmrctl_ready(__u32 pmrctl);
 const char *nvme_degrees_string(long t);
diff --git a/nvme.c b/nvme.c
index a1e65fb34045c92b4b263440be1d2a1a0fef3730..5d4b52c8cae484308720cb54399cfcc640aa10b6 100644 (file)
--- a/nvme.c
+++ b/nvme.c
@@ -5285,6 +5285,11 @@ static int nvme_get_single_property(int fd, struct get_reg_config *cfg, __u64 *v
        if (!err)
                return 0;
 
+       if (cfg->fabrics && nvme_is_fabrics_optional_reg(cfg->offset)) {
+               *value = -1;
+               return 0;
+       }
+
        if (!cfg->fabrics &&
            nvme_status_equals(err, NVME_STATUS_TYPE_NVME, NVME_SC_INVALID_FIELD)) {
                *value = -1;
@@ -5316,6 +5321,9 @@ static int nvme_get_properties(int fd, void **pbar, struct get_reg_config *cfg)
        memset(bar, 0xff, size);
        for (offset = NVME_REG_CAP; offset <= NVME_REG_CMBSZ;
             offset += is_64bit ? sizeof(uint64_t) : sizeof(uint32_t)) {
+               if (!nvme_is_fabrics_reg(offset))
+                       continue;
+
                cfg->offset = offset;
                err = nvme_get_single_property(fd, cfg, &value);
                if (err)
@@ -5380,12 +5388,12 @@ static int show_registers(int argc, char **argv, struct command *cmd, struct plu
 
        _cleanup_nvme_dev_ struct nvme_dev *dev = NULL;
        nvme_print_flags_t flags;
-       bool fabrics = false;
        void *bar;
        int err;
 
        struct get_reg_config cfg = {
                .human_readable = false,
+               .fabrics = false,
        };
 
        NVME_ARGS(opts,
@@ -5406,14 +5414,14 @@ static int show_registers(int argc, char **argv, struct command *cmd, struct plu
 
        bar = mmap_registers(dev, false);
        if (!bar) {
+               cfg.fabrics = true;
                err = nvme_get_properties(dev_fd(dev), &bar, &cfg);
                if (err)
                        return err;
-               fabrics = true;
        }
 
-       nvme_show_ctrl_registers(bar, fabrics, flags);
-       if (fabrics)
+       nvme_show_ctrl_registers(bar, cfg.fabrics, flags);
+       if (cfg.fabrics)
                free(bar);
        else
                munmap(bar, getpagesize());