]> www.infradead.org Git - users/sagi/nvme-cli.git/commitdiff
solidigm: Add average latency field
authorda Cunha, Leonardo <leonardo.da.cunha@solidigmtechnology.com>
Tue, 28 Jun 2022 19:40:28 +0000 (15:40 -0400)
committerDaniel Wagner <dwagner@suse.de>
Thu, 30 Jun 2022 06:10:49 +0000 (08:10 +0200)
Add average latency field to solidigm latency-tracking-log.

While at it also remove the -b flag option from solidigm plug-in, in
favor of "-o binary".

plugins/solidigm/solidigm-garbage-collection.c
plugins/solidigm/solidigm-latency-tracking.c
plugins/solidigm/solidigm-nvme.h
plugins/solidigm/solidigm-smart.c

index 8ef79e14f4236c7aaa12acb41359fd3333135172..c7f12860e674991d5672e1cc86d5fd51ae424c49 100644 (file)
@@ -66,17 +66,14 @@ int solidigm_get_garbage_collection_log(int argc, char **argv, struct command *c
 
        struct config {
                char    *output_format;
-               int     raw_binary;
        };
 
        struct config cfg = {
                .output_format  = "normal",
-               .raw_binary     = 0
        };
 
        OPT_ARGS(opts) = {
                OPT_FMT("output-format",   'o', &cfg.output_format,  output_format),
-               OPT_FLAG("raw-binary",     'b', &cfg.raw_binary,     "Dump output in binary format"),
                OPT_END()
        };
 
@@ -91,10 +88,6 @@ int solidigm_get_garbage_collection_log(int argc, char **argv, struct command *c
                close(fd);
                return fd;
        }
-       
-       if (cfg.raw_binary)     {
-               flags = BINARY;
-       }
 
        garbage_control_collection_log_t gc_log;
        const int solidigm_vu_gc_log_id = 0xfd;
index eaa3e1af768452b4208854c9f8ff34ce1cafc006..0bfd6119c7438d17986378f548d63ece25157fe4 100644 (file)
@@ -28,6 +28,7 @@ struct latency_statistics {
        __u16 version_major;
        __u16 version_minor;
        __u32 data[BUCKET_LIST_SIZE_4_1];
+       __u64 average_latency;
 };
 
 struct config {
@@ -47,6 +48,7 @@ struct latency_tracker {
        struct json_object *bucket_list;
        __u32 bucket_list_size;
        __u8 base_range_bits;
+       bool has_average_latency_field;
 };
 
 /* COL_WIDTH controls width of columns in NORMAL output. */
@@ -87,6 +89,7 @@ static void latency_tracker_bucket_parse(const struct latency_tracker *lt, int i
                                         __u32 lower_us, __u32 upper_us, bool upper_bounded)
 {
        char buffer[BUCKET_LABEL_MAX_SIZE] = "";
+       __u32 bucket_data = le32_to_cpu(lt->stats.data[id]);
 
        if (lt->print_flags == NORMAL) {
 
@@ -98,7 +101,7 @@ static void latency_tracker_bucket_parse(const struct latency_tracker *lt, int i
                get_time_unit_label(buffer, upper_us, upper_bounded);
                printf("%-*s", COL_WIDTH, buffer);
 
-               printf("%-*d\n", COL_WIDTH, lt->stats.data[id]);
+               printf("%-*d\n", COL_WIDTH, bucket_data);
        }
 
        if (lt->print_flags == JSON) {
@@ -123,7 +126,7 @@ static void latency_tracker_bucket_parse(const struct latency_tracker *lt, int i
                get_time_unit_label(buffer, upper_us, upper_bounded);
                json_object_add_value_string(bucket, "end", buffer);
 
-               json_object_add_value_int(bucket, "value", lt->stats.data[id]);
+               json_object_add_value_int(bucket, "value", bucket_data);
        }
 }
 
@@ -165,15 +168,17 @@ static int latency_tracker_bucket_pos2us(const struct latency_tracker *lt, int i
  *     "type" : "write" or "read",
  *     "values" : {
  */
-static void lat_stats_make_json_root(struct json_object *root,
-                                    struct json_object *bucket_list,
-                                    int write)
+static void latency_tracker_populate_json_root(const struct latency_tracker *lt,
+                                               struct json_object *root)
 {
        struct json_object *subroot = json_create_object();
 
        json_object_add_value_object(root, "latstats", subroot);
-       json_object_add_value_string(subroot, "type", write ? "write" : "read");
-       json_object_add_value_object(subroot, "values", bucket_list);
+       json_object_add_value_string(subroot, "type", lt->cfg.write ? "write" : "read");
+       if (lt->has_average_latency_field) {
+               json_object_add_value_uint64(subroot, "average_latency", le64_to_cpu(lt->stats.average_latency));
+       }
+       json_object_add_value_object(subroot, "values", lt->bucket_list);
 }
 
 static void latency_tracker_parse_3_0(const struct latency_tracker *lt)
@@ -208,8 +213,11 @@ static void latency_tracker_pre_parse(struct latency_tracker *lt)
        if (lt->print_flags == NORMAL) {
                printf("Solidigm IO %s Command Latency Tracking Statistics type %d\n",
                        lt->cfg.write ? "Write" : "Read", lt->cfg.type);
-               printf("Major Revision : %u\nMinor Revision : %u\n",
-                       lt->stats.version_major, lt->stats.version_minor);
+               printf("Major Revision: %u\nMinor Revision: %u\n",
+                       le16_to_cpu(lt->stats.version_major), le16_to_cpu(lt->stats.version_minor));
+               if (lt->has_average_latency_field) {
+                       printf("Average Latency: %lu\n", le64_to_cpu(lt->stats.average_latency));
+               }
                print_dash_separator();
                printf("%-12s%-12s%-12s%-20s\n", "Bucket", "Start", "End", "Value");
                print_dash_separator();
@@ -224,7 +232,7 @@ static void latency_tracker_post_parse(struct latency_tracker *lt)
        if (lt->print_flags == JSON) {
                struct json_object *root = json_create_object();
 
-               lat_stats_make_json_root(root, lt->bucket_list, lt->cfg.write);
+               latency_tracker_populate_json_root(lt, root);
                json_print_object(root, NULL);
                json_free_object(root);
                printf("\n");
@@ -233,14 +241,20 @@ static void latency_tracker_post_parse(struct latency_tracker *lt)
 
 static void latency_tracker_parse(struct latency_tracker *lt)
 {
-       latency_tracker_pre_parse(lt);
+       __u16 version_major = le16_to_cpu(lt->stats.version_major);
+       __u16 version_minor = le16_to_cpu(lt->stats.version_minor);
 
-       switch (lt->stats.version_major) {
+       switch (version_major) {
        case 3:
+               latency_tracker_pre_parse(lt);
                latency_tracker_parse_3_0(lt);
                break;
        case 4:
-               if (lt->stats.version_minor == 0){
+               if (version_minor >= 8){
+                       lt->has_average_latency_field = true;
+               }
+               latency_tracker_pre_parse(lt);
+               if (version_minor == 0){
                        lt->base_range_bits = BASE_RANGE_BITS_4_0;
                        lt->bucket_list_size = BUCKET_LIST_SIZE_4_0;
                }
@@ -248,7 +262,7 @@ static void latency_tracker_parse(struct latency_tracker *lt)
                break;
        default:
                printf("Unsupported revision (%u.%u)\n",
-                      lt->stats.version_major, lt->stats.version_minor);
+                      version_major, version_minor);
                break;
        }
 
@@ -380,6 +394,7 @@ int solidigm_get_latency_tracking_log(int argc, char **argv, struct command *cmd
                },
                .base_range_bits = BASE_RANGE_BITS_4_1,
                .bucket_list_size = BUCKET_LIST_SIZE_4_1,
+               .has_average_latency_field = false,
        };
 
        OPT_ARGS(opts) = {
index 1308831e2eb229d5684e1f3d120593cc0f984a96..9fc8b4518e510bc7b7713998d1bb98596ff08147 100644 (file)
@@ -13,7 +13,7 @@
 
 #include "cmd.h"
 
-#define SOLIDIGM_PLUGIN_VERSION "0.3"
+#define SOLIDIGM_PLUGIN_VERSION "0.4"
 
 PLUGIN(NAME("solidigm", "Solidigm vendor specific extensions", SOLIDIGM_PLUGIN_VERSION),
        COMMAND_LIST(
index 748904a5bef782498c03dd5d6ab2aca91616782a..4b30cab80c7180f2e4582112bdd2e36b966bdb50 100644 (file)
@@ -206,19 +206,16 @@ int solidigm_get_additional_smart_log(int argc, char **argv, struct command *cmd
        struct config {
                __u32   namespace_id;
                char    *output_format;
-               int     raw_binary;
        };
 
        struct config cfg = {
                .namespace_id   = NVME_NSID_ALL,
                .output_format  = "normal",
-               .raw_binary     = 0
        };
 
        OPT_ARGS(opts) = {
                OPT_UINT("namespace-id",   'n', &cfg.namespace_id,   "(optional) desired namespace"),
                OPT_FMT("output-format",   'o', &cfg.output_format,  output_format),
-               OPT_FLAG("raw-binary",     'b', &cfg.raw_binary,     "Dump output in binary format"),
                OPT_END()
        };
 
@@ -233,9 +230,6 @@ int solidigm_get_additional_smart_log(int argc, char **argv, struct command *cmd
                close(fd);
                return fd;
        }
-       if (cfg.raw_binary)     {
-               flags = BINARY;
-       }
 
        err = nvme_get_log_simple(fd, solidigm_vu_smart_log_id, sizeof(smart_log_payload), &smart_log_payload);
        if (!err) {