]> www.infradead.org Git - users/sagi/nvme-cli.git/commitdiff
nvme: add pull-model-ddc-req-log command
authorTokunori Ikegami <ikegami.t@gmail.com>
Fri, 28 Feb 2025 14:36:51 +0000 (23:36 +0900)
committerDaniel Wagner <wagi@monom.org>
Wed, 5 Mar 2025 14:58:50 +0000 (15:58 +0100)
Since added the NVMe 2.1 log page.

Signed-off-by: Tokunori Ikegami <ikegami.t@gmail.com>
nvme-builtin.h
nvme-print-binary.c
nvme-print-json.c
nvme-print-stdout.c
nvme-print.c
nvme-print.h
nvme-wrap.c
nvme-wrap.h
nvme.c

index beec920019baded18ffdb33c8fa03d86262f1e44..684f3fdfcb31dab29837e61c65b0db2ad7719e66 100644 (file)
@@ -66,6 +66,7 @@ COMMAND_LIST(
        ENTRY("reachability-associations-log", "Retrieve Reachability Associations Log, show it", get_reachability_associations_log)
        ENTRY("host-discovery-log", "Retrieve Host Discovery Log, show it", get_host_discovery_log)
        ENTRY("ave-discovery-log", "Retrieve AVE Discovery Log, show it", get_ave_discovery_log)
+       ENTRY("pull-model-ddc-req-log", "Retrieve Pull Model DDC Request Log, show it", get_pull_model_ddc_req_log)
        ENTRY("set-feature", "Set a feature and show the resulting value", set_feature)
        ENTRY("set-property", "Set a property and show the resulting value", set_property)
        ENTRY("get-property", "Get a property and show the resulting value", get_property)
index bd425f31b06c6434ed392ce850c5ad09f06742c0..17dfb8511d7f723f02722615f4fbfe354afb57d3 100644 (file)
@@ -342,6 +342,11 @@ static void binary_ave_discovery_log(struct nvme_ave_discover_log *log)
        d_raw((unsigned char *)log, le32_to_cpu(log->tadlpl));
 }
 
+static void binary_pull_model_ddc_req_log(struct nvme_pull_model_ddc_req_log *log)
+{
+       d_raw((unsigned char *)log, le32_to_cpu(log->tpdrpl));
+}
+
 static struct print_ops binary_print_ops = {
        /* libnvme types.h print functions */
        .ana_log                        = binary_ana_log,
@@ -415,6 +420,7 @@ static struct print_ops binary_print_ops = {
        .reachability_associations_log  = binary_reachability_associations_log,
        .host_discovery_log             = binary_host_discovery_log,
        .ave_discovery_log              = binary_ave_discovery_log,
+       .pull_model_ddc_req_log         = binary_pull_model_ddc_req_log,
 
        /* libnvme tree print functions */
        .list_item                      = NULL,
index 13b3c6cf0ed2f2b33d90c51f0aa4970571a884fa..ff34304f6b5fdc6a8848cdd1935137d7dd4ea947 100644 (file)
@@ -4904,6 +4904,17 @@ static void json_ave_discovery_log(struct nvme_ave_discover_log *log)
        }
 }
 
+static void json_pull_model_ddc_req_log(struct nvme_pull_model_ddc_req_log *log)
+{
+       struct json_object *r = json_create_object();
+       __u32 tpdrpl = le32_to_cpu(log->tpdrpl);
+       __u32 osp_len = tpdrpl - offsetof(struct nvme_pull_model_ddc_req_log, osp);
+
+       obj_add_uint(r, "ori", log->ori);
+       printf("tpdrpl: %u\n", tpdrpl);
+       obj_d(r, "osp", (unsigned char *)log->osp, osp_len, 16, 1);
+}
+
 static struct print_ops json_print_ops = {
        /* libnvme types.h print functions */
        .ana_log                        = json_ana_log,
@@ -4978,6 +4989,7 @@ static struct print_ops json_print_ops = {
        .reachability_associations_log  = json_reachability_associations_log,
        .host_discovery_log             = json_host_discovery_log,
        .ave_discovery_log              = json_ave_discovery_log,
+       .pull_model_ddc_req_log         = json_pull_model_ddc_req_log,
 
        /* libnvme tree print functions */
        .list_item                      = json_list_item,
index e10bd11fbc2c1864a131566104c6d92274d07145..f341093dc51eb905a33a5d35057f1ef9a7093b70 100644 (file)
@@ -5836,6 +5836,17 @@ static void stdout_ave_discovery_log(struct nvme_ave_discover_log *log)
        }
 }
 
+static void stdout_pull_model_ddc_req_log(struct nvme_pull_model_ddc_req_log *log)
+{
+       __u32 tpdrpl = le32_to_cpu(log->tpdrpl);
+       __u32 osp_len = tpdrpl - offsetof(struct nvme_pull_model_ddc_req_log, osp);
+
+       printf("ori: %u\n", log->ori);
+       printf("tpdrpl: %u\n", tpdrpl);
+       printf("osp:\n");
+       d((unsigned char *)log->osp, osp_len, 16, 1);
+}
+
 static struct print_ops stdout_print_ops = {
        /* libnvme types.h print functions */
        .ana_log                        = stdout_ana_log,
@@ -5910,6 +5921,7 @@ static struct print_ops stdout_print_ops = {
        .reachability_associations_log  = stdout_reachability_associations_log,
        .host_discovery_log             = stdout_host_discovery_log,
        .ave_discovery_log              = stdout_ave_discovery_log,
+       .pull_model_ddc_req_log         = stdout_pull_model_ddc_req_log,
 
        /* libnvme tree print functions */
        .list_item                      = stdout_list_item,
index a025fa2216ea3b8bfa964ba41ff7a423b7f57c0a..8492225e7fd6e65cafd85c6069438da744364b1e 100644 (file)
@@ -1530,3 +1530,9 @@ void nvme_show_ave_discovery_log(struct nvme_ave_discover_log *log, nvme_print_f
 {
        nvme_print(ave_discovery_log, flags, log);
 }
+
+void nvme_show_pull_model_ddc_req_log(struct nvme_pull_model_ddc_req_log *log,
+                                     nvme_print_flags_t flags)
+{
+       nvme_print(pull_model_ddc_req_log, flags, log);
+}
index 93c6fc8e2d5a14f9a90d1ab73b9caf58509d8820..ad5d4c829b3c27e424e72892f4d9679d341858cc 100644 (file)
@@ -96,6 +96,7 @@ struct print_ops {
                                              __u64 len);
        void (*host_discovery_log)(struct nvme_host_discover_log *log);
        void (*ave_discovery_log)(struct nvme_ave_discover_log *log);
+       void (*pull_model_ddc_req_log)(struct nvme_pull_model_ddc_req_log *log);
 
        /* libnvme tree print functions */
        void (*list_item)(nvme_ns_t n);
@@ -349,4 +350,6 @@ void nvme_show_reachability_associations_log(struct nvme_reachability_associatio
                                             __u64 len, nvme_print_flags_t flags);
 void nvme_show_host_discovery_log(struct nvme_host_discover_log *log, nvme_print_flags_t flags);
 void nvme_show_ave_discovery_log(struct nvme_ave_discover_log *log, nvme_print_flags_t flags);
+void nvme_show_pull_model_ddc_req_log(struct nvme_pull_model_ddc_req_log *log,
+                                     nvme_print_flags_t flags);
 #endif /* NVME_PRINT_H */
index 64b71eaa6d4964ece8b5aa9ee7005712c3343361..ca240280dfaa968a0a224a7437f9501ea97d5249 100644 (file)
@@ -481,3 +481,9 @@ int nvme_cli_get_log_ave_discovery(struct nvme_dev *dev, bool rae, __u32 len,
 {
        return do_admin_op(get_log_ave_discover, dev, rae, len, log);
 }
+
+int nvme_cli_get_log_pull_model_ddc_req(struct nvme_dev *dev, bool rae, __u32 len,
+                                       struct nvme_pull_model_ddc_req_log *log)
+{
+       return do_admin_op(get_log_pull_model_ddc_req, dev, rae, len, log);
+}
index d82bbd919a6db3d276aef52e6fc3da32745d1026..43f4f8082c1dca3780cfef3dc048737f04015578 100644 (file)
@@ -168,4 +168,7 @@ int nvme_cli_get_log_host_discovery(struct nvme_dev *dev, bool allhoste, bool ra
 
 int nvme_cli_get_log_ave_discovery(struct nvme_dev *dev, bool rae, __u32 len,
                                   struct nvme_ave_discover_log *log);
+
+int nvme_cli_get_log_pull_model_ddc_req(struct nvme_dev *dev, bool rae, __u32 len,
+                                       struct nvme_pull_model_ddc_req_log *log);
 #endif /* _NVME_WRAP_H */
diff --git a/nvme.c b/nvme.c
index 84d2c69ab047edefcad4281dae90b182ab431ebe..7c3070a0a46f4da360a015caad2c35be4516b4cd 100644 (file)
--- a/nvme.c
+++ b/nvme.c
@@ -10790,6 +10790,85 @@ static int get_ave_discovery_log(int argc, char **argv, struct command *cmd, str
        return err;
 }
 
+static int get_pull_model_ddc_req(struct nvme_dev *dev,
+                                 bool rae, struct nvme_pull_model_ddc_req_log **logp)
+{
+       int err;
+       struct nvme_pull_model_ddc_req_log *log;
+       __u64 log_len = sizeof(*log);
+       struct nvme_get_log_args args = {
+               .args_size = sizeof(args),
+               .fd = dev_fd(dev),
+               .timeout = NVME_DEFAULT_IOCTL_TIMEOUT,
+               .lid = NVME_LOG_LID_PULL_MODEL_DDC_REQ,
+               .nsid = NVME_NSID_ALL,
+               .rae = rae,
+       };
+
+       log = nvme_alloc(log_len);
+       if (!log)
+               return -ENOMEM;
+
+       err = nvme_cli_get_log_pull_model_ddc_req(dev, rae, log_len, log);
+       if (err)
+               goto err_free;
+
+       log_len = le32_to_cpu(log->tpdrpl);
+       err = get_log_offset(dev, &args, &log_len, le32_to_cpu(log->tpdrpl) - log_len,
+                            (void **)&log);
+       if (err)
+               goto err_free;
+
+       *logp = log;
+       return 0;
+
+err_free:
+       free(log);
+       return err;
+}
+
+static int get_pull_model_ddc_req_log(int argc, char **argv, struct command *cmd,
+                                     struct plugin *plugin)
+{
+       const char *desc = "Retrieve Pull Model DDC Request Log, show it";
+       nvme_print_flags_t flags;
+       int err;
+
+       _cleanup_free_ struct nvme_pull_model_ddc_req_log *log = NULL;
+
+       _cleanup_nvme_dev_ struct nvme_dev *dev = NULL;
+
+       struct config {
+               bool rae;
+       };
+
+       struct config cfg = {
+               .rae = false,
+       };
+
+       NVME_ARGS(opts, OPT_FLAG("rae", 'r', &cfg.rae, rae));
+
+       err = parse_and_open(&dev, argc, argv, desc, opts);
+       if (err)
+               return err;
+
+       err = validate_output_format(nvme_cfg.output_format, &flags);
+       if (err < 0) {
+               nvme_show_error("Invalid output format");
+               return err;
+       }
+
+       err = get_pull_model_ddc_req(dev, cfg.rae, &log);
+       if (!err)
+               nvme_show_pull_model_ddc_req_log(log, flags);
+       else if (err > 0)
+               nvme_show_status(err);
+       else
+               nvme_show_perror("pull model ddc req log");
+
+       return err;
+}
+
 void register_extension(struct plugin *plugin)
 {
        plugin->parent = &nvme;