From b4628c341e3083a291bebec2ca07ea886e661822 Mon Sep 17 00:00:00 2001 From: Minsik Jeon Date: Wed, 2 Oct 2024 17:18:59 +0900 Subject: [PATCH] nvme: Support show-regs for nvmeof 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 Signed-off-by: Minsik Jeon --- nvme-print.c | 13 ++++++++++++- nvme-print.h | 1 + nvme.c | 16 ++++++++++++---- 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/nvme-print.c b/nvme-print.c index ae21c91f..7b8cbf8a 100644 --- a/nvme-print.c +++ b/nvme-print.c @@ -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; diff --git a/nvme-print.h b/nvme-print.h index 7ebf6455..6107df92 100644 --- a/nvme-print.h +++ b/nvme-print.h @@ -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 a1e65fb3..5d4b52c8 100644 --- 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()); -- 2.50.1