From: da Cunha, Leonardo Date: Tue, 28 Jun 2022 19:40:28 +0000 (-0400) Subject: solidigm: Add average latency field X-Git-Tag: v2.1-rc0~18^2 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=9855881130d78a466536e4a1d99b267b3e7b64ee;p=users%2Fsagi%2Fnvme-cli.git solidigm: Add average latency field 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". --- diff --git a/plugins/solidigm/solidigm-garbage-collection.c b/plugins/solidigm/solidigm-garbage-collection.c index 8ef79e14..c7f12860 100644 --- a/plugins/solidigm/solidigm-garbage-collection.c +++ b/plugins/solidigm/solidigm-garbage-collection.c @@ -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; diff --git a/plugins/solidigm/solidigm-latency-tracking.c b/plugins/solidigm/solidigm-latency-tracking.c index eaa3e1af..0bfd6119 100644 --- a/plugins/solidigm/solidigm-latency-tracking.c +++ b/plugins/solidigm/solidigm-latency-tracking.c @@ -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) = { diff --git a/plugins/solidigm/solidigm-nvme.h b/plugins/solidigm/solidigm-nvme.h index 1308831e..9fc8b451 100644 --- a/plugins/solidigm/solidigm-nvme.h +++ b/plugins/solidigm/solidigm-nvme.h @@ -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( diff --git a/plugins/solidigm/solidigm-smart.c b/plugins/solidigm/solidigm-smart.c index 748904a5..4b30cab8 100644 --- a/plugins/solidigm/solidigm-smart.c +++ b/plugins/solidigm/solidigm-smart.c @@ -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) {