]> www.infradead.org Git - users/sagi/nvme-cli.git/commitdiff
sfx: get_lat_stats_log support for csd3000
authorWei Hou <wei.hou@scaleflux.com>
Tue, 14 Jun 2022 06:09:00 +0000 (14:09 +0800)
committerDaniel Wagner <dwagner@suse.de>
Tue, 14 Jun 2022 09:56:44 +0000 (11:56 +0200)
Signed-off-by: Wei Hou <wei.hou@scaleflux.com>
plugins/scaleflux/sfx-nvme.c

index f3945cf49bb1ebf5d250a568176c35889bfa0337..af3699233f7fda0a8d750859707c0f1626839461 100644 (file)
 #define IDEMA_CAP(exp_GB)                      (((__u64)exp_GB - 50ULL) * 1953504ULL + 97696368ULL)
 #define IDEMA_CAP2GB(exp_sector)               (((__u64)exp_sector - 97696368ULL) / 1953504ULL + 50ULL)
 
+#define VANDA_MAJOR_IDX                0
+#define VANDA_MINOR_IDX                0
+
+#define MYRTLE_MAJOR_IDX        4
+#define MYRTLE_MINOR_IDX        1
+
 enum {
        SFX_LOG_LATENCY_READ_STATS      = 0xc1,
        SFX_LOG_SMART                   = 0xc2,
@@ -437,9 +443,9 @@ static int get_additional_smart_log(int argc, char **argv, struct command *cmd,
        return err;
 }
 
-struct sfx_lat_stats {
-       __u16    maj;
-       __u16    min;
+struct __attribute__((__packed__)) sfx_lat_stats_vanda {
+       __u16    maj;
+       __u16    min;
        __u32    bucket_1[32];  /* 0~1ms, step 32us */
        __u32    bucket_2[31];  /* 1~32ms, step 1ms */
        __u32    bucket_3[31];  /* 32ms~1s, step 32ms */
@@ -448,11 +454,50 @@ struct sfx_lat_stats {
        __u32    bucket_6[1];   /* 4s+, specifically 4096ms+ */
 };
 
-static void show_lat_stats(struct sfx_lat_stats *stats, int write)
+struct __attribute__((__packed__)) sfx_lat_stats_myrtle {
+       __u16    maj;
+       __u16    min;
+       __u32    bucket_1[64];  /* 0us~63us, step 1us */
+       __u32    bucket_2[64];  /* 63us~127us, step 1us */
+       __u32    bucket_3[64];  /* 127us~255us, step 2us */
+       __u32    bucket_4[64];  /* 255us~510us, step 4us */
+       __u32    bucket_5[64];  /* 510us~1.02ms step 8us */
+       __u32    bucket_6[64];  /* 1.02ms~2.04ms step 16us */
+       __u32    bucket_7[64];  /* 2.04ms~4.08ms step 32us */
+       __u32    bucket_8[64];  /* 4.08ms~8.16ms step 64us */
+       __u32    bucket_9[64];  /* 8.16ms~16.32ms step 128us */
+       __u32    bucket_10[64]; /* 16.32ms~32.64ms step 256us */
+       __u32    bucket_11[64]; /* 32.64ms~65.28ms step 512us */
+       __u32    bucket_12[64]; /* 65.28ms~130.56ms step 1.024ms */
+       __u32    bucket_13[64]; /* 130.56ms~261.12ms step 2.048ms */
+       __u32    bucket_14[64]; /* 261.12ms~522.24ms step 4.096ms */
+       __u32    bucket_15[64]; /* 522.24ms~1.04s step 8.192ms */
+       __u32    bucket_16[64]; /* 1.04s~2.09s step 16.384ms */
+       __u32    bucket_17[64]; /* 2.09s~4.18s step 32.768ms */
+       __u32    bucket_18[64]; /* 4.18s~8.36s step 65.536ms */
+       __u32    bucket_19[64]; /* 8.36s~ step 131.072ms */
+       __u64    average; /* average latency statistics */
+};
+
+
+struct __attribute__((__packed__)) sfx_lat_status_ver {
+       __u16 maj;
+       __u16 min;
+};
+
+struct sfx_lat_stats {
+       union {
+               struct sfx_lat_status_ver   ver;
+               struct sfx_lat_stats_vanda  vanda;
+               struct sfx_lat_stats_myrtle myrtle;
+       };
+};
+
+static void show_lat_stats_vanda(struct sfx_lat_stats_vanda *stats, int write)
 {
        int i;
 
-       printf(" ScaleFlux IO %s Command Latency Statistics\n", write ? "Write" : "Read");
+       printf("ScaleFlux IO %s Command Latency Statistics\n", write ? "Write" : "Read");
        printf("-------------------------------------\n");
        printf("Major Revision : %u\n", stats->maj);
        printf("Minor Revision : %u\n", stats->min);
@@ -479,6 +524,95 @@ static void show_lat_stats(struct sfx_lat_stats *stats, int write)
        printf("Bucket %2d: %u\n", 0, stats->bucket_6[0]);
 }
 
+static void show_lat_stats_myrtle(struct sfx_lat_stats_myrtle *stats, int write)
+{
+       int i;
+
+       printf("ScaleFlux IO %s Command Latency Statistics\n", write ? "Write" : "Read");
+       printf("-------------------------------------\n");
+       printf("Major Revision : %u\n", stats->maj);
+       printf("Minor Revision : %u\n", stats->min);
+
+       printf("\nGroup 1: Range is 0us~63us, step 1us\n");
+       for (i = 0; i < 64; i++)
+               printf("Bucket %2d: %u\n", i, stats->bucket_1[i]);
+
+       printf("\nGroup 2: Range is 63us~127us, step 1us\n");
+       for (i = 0; i < 64; i++)
+               printf("Bucket %2d: %u\n", i, stats->bucket_2[i]);
+
+       printf("\nGroup 3: Range is 127us~255us, step 2us\n");
+       for (i = 0; i < 64; i++)
+               printf("Bucket %2d: %u\n", i, stats->bucket_3[i]);
+
+       printf("\nGroup 4: Range is 255us~510us, step 4us\n");
+       for (i = 0; i < 64; i++)
+               printf("Bucket %2d: %u\n", i, stats->bucket_4[i]);
+
+       printf("\nGroup 5: Range is 510us~1.02ms step\n");
+       for (i = 0; i < 64; i++)
+               printf("Bucket %2d: %u\n", i, stats->bucket_5[i]);
+
+       printf("\nGroup 6: Range is 1.02ms~2.04ms step 16us\n");
+       for (i = 0; i < 64; i++)
+               printf("Bucket %2d: %u\n", i, stats->bucket_6[i]);
+
+       printf("\nGroup 7: Range is 2.04ms~4.08ms step 32us\n");
+       for (i = 0; i < 64; i++)
+               printf("Bucket %2d: %u\n", i, stats->bucket_7[i]);
+
+       printf("\nGroup 8: Range is 4.08ms~8.16ms step 64us\n");
+       for (i = 0; i < 64; i++)
+               printf("Bucket %2d: %u\n", i, stats->bucket_8[i]);
+
+       printf("\nGroup 9: Range is 8.16ms~16.32ms step 128us\n");
+       for (i = 0; i < 64; i++)
+               printf("Bucket %2d: %u\n", i, stats->bucket_9[i]);
+
+       printf("\nGroup 10: Range is 16.32ms~32.64ms step 256us\n");
+       for (i = 0; i < 64; i++)
+               printf("Bucket %2d: %u\n", i, stats->bucket_10[i]);
+
+       printf("\nGroup 11: Range is 32.64ms~65.28ms step 512us\n");
+       for (i = 0; i < 64; i++)
+               printf("Bucket %2d: %u\n", i, stats->bucket_11[i]);
+
+       printf("\nGroup 12: Range is 65.28ms~130.56ms step 1.024ms\n");
+       for (i = 0; i < 64; i++)
+               printf("Bucket %2d: %u\n", i, stats->bucket_12[i]);
+
+       printf("\nGroup 13: Range is 130.56ms~261.12ms step 2.048ms\n");
+       for (i = 0; i < 64; i++)
+               printf("Bucket %2d: %u\n", i, stats->bucket_13[i]);
+
+       printf("\nGroup 14: Range is 261.12ms~522.24ms step 4.096ms\n");
+       for (i = 0; i < 64; i++)
+               printf("Bucket %2d: %u\n", i, stats->bucket_14[i]);
+
+       printf("\nGroup 15: Range is 522.24ms~1.04s step 8.192ms\n");
+       for (i = 0; i < 64; i++)
+               printf("Bucket %2d: %u\n", i, stats->bucket_15[i]);
+
+       printf("\nGroup 16: Range is 1.04s~2.09s step 16.384ms\n");
+       for (i = 0; i < 64; i++)
+               printf("Bucket %2d: %u\n", i, stats->bucket_16[i]);
+
+       printf("\nGroup 17: Range is 2.09s~4.18s step 32.768ms\n");
+       for (i = 0; i < 64; i++)
+               printf("Bucket %2d: %u\n", i, stats->bucket_17[i]);
+
+       printf("\nGroup 18: Range is 4.18s~8.36s step 65.536ms\n");
+       for (i = 0; i < 64; i++)
+               printf("Bucket %2d: %u\n", i, stats->bucket_18[i]);
+
+       printf("\nGroup 19: Range is 8.36s~ step 131.072ms\n");
+       for (i = 0; i < 64; i++)
+               printf("Bucket %2d: %u\n", i, stats->bucket_19[i]);
+
+       printf("\nAverage latency statistics %lld\n", stats->average);
+}
+
+
 static int get_lat_stats_log(int argc, char **argv, struct command *cmd, struct plugin *plugin)
 {
        struct sfx_lat_stats stats;
@@ -508,10 +642,22 @@ static int get_lat_stats_log(int argc, char **argv, struct command *cmd, struct
 
        err = nvme_get_log_simple(fd, cfg.write ? 0xc3 : 0xc1, sizeof(stats), (void *)&stats);
        if (!err) {
-               if (!cfg.raw_binary)
-                       show_lat_stats(&stats, cfg.write);
-               else
-                       d_raw((unsigned char *)&stats, sizeof(stats));
+               if ((stats.ver.maj == VANDA_MAJOR_IDX) && (stats.ver.min == VANDA_MINOR_IDX)) {
+                       if (!cfg.raw_binary) {
+                               show_lat_stats_vanda(&stats.vanda, cfg.write);
+                       } else {
+                               d_raw((unsigned char *)&stats.vanda, sizeof(struct sfx_lat_stats_vanda));
+                       }
+               } else if ((stats.ver.maj == MYRTLE_MAJOR_IDX) && (stats.ver.min == MYRTLE_MINOR_IDX)) {
+                       if (!cfg.raw_binary) {
+                               show_lat_stats_myrtle(&stats.myrtle, cfg.write);
+                       } else {
+                               d_raw((unsigned char *)&stats.myrtle, sizeof(struct sfx_lat_stats_myrtle));
+                       }
+               } else {
+                       printf("ScaleFlux IO %s Command Latency Statistics Invalid Version Maj %d Min %d\n",
+                                   write ? "Write" : "Read", stats.ver.maj, stats.ver.min);
+               }
        } else if (err > 0)
                nvme_show_status(err);
        close(fd);