Allow a region to collect a latency histogram that only accounts
reads.
It can be combined with the existing "histogram:" argument within
one region.

https://virtuozzo.atlassian.net/browse/VSTOR-103846
Signed-off-by: Andrey Zhadchenko <[email protected]>
---
 .../admin-guide/device-mapper/statistics.rst  | 10 +++++++--
 drivers/md/dm-stats.c                         | 21 +++++++++++++++++--
 2 files changed, 27 insertions(+), 4 deletions(-)

diff --git a/Documentation/admin-guide/device-mapper/statistics.rst 
b/Documentation/admin-guide/device-mapper/statistics.rst
index d5b1b1013c087..28e2f9c49ddcb 100644
--- a/Documentation/admin-guide/device-mapper/statistics.rst
+++ b/Documentation/admin-guide/device-mapper/statistics.rst
@@ -95,6 +95,12 @@ Messages
                that took 10-20 ms to complete, c is the number of requests
                that took 20-30 ms to complete and d is the number of
                requests that took more than 30 ms to complete.
+         rd_histogram:n1,n2,n3,n4,...
+               collect a latency histogram like "histogram", but only
+               account read requests.
+         Multiple histogram arguments may be specified for one region;
+         each histogram is reported as an additional counter set in the
+         @stats_print output, in the order the histograms were specified.
 
        <program_id>
          An optional parameter.  A name that uniquely identifies
@@ -139,8 +145,8 @@ Messages
                precise_timestamps hist_total_latency histogram:n1,n2,n3,...
 
        The strings "precise_timestamps", "hist_total_latency" and
-       "histogram" are printed only if they were specified when creating
-       the region.
+       "histogram" (also "rd_histogram") are printed only if they were
+       specified when creating the region.
 
     @stats_print <region_id> [<starting_line> <number_of_lines>]
        Print counters for each step-sized area of a region.
diff --git a/drivers/md/dm-stats.c b/drivers/md/dm-stats.c
index 51b3c736b64c5..51827e34d2a8b 100644
--- a/drivers/md/dm-stats.c
+++ b/drivers/md/dm-stats.c
@@ -52,7 +52,7 @@ enum {
 #define DM_STAT_CLASSES_DATA   ((1 << DM_STAT_CLASS_READ) | \
                                 (1 << DM_STAT_CLASS_WRITE))
 
-#define DM_STAT_MAX_HISTOGRAMS         1
+#define DM_STAT_MAX_HISTOGRAMS         2
 
 struct dm_stat_histogram {
        unsigned int class_mask;        /* classes this histogram accounts */
@@ -540,6 +540,16 @@ static int dm_stats_delete(struct dm_stats *stats, int id)
        return 0;
 }
 
+static const char *dm_stat_histogram_name(unsigned int class_mask)
+{
+       switch (class_mask) {
+       case 1 << DM_STAT_CLASS_READ:
+               return "rd_histogram";
+       default:
+               return "histogram";
+       }
+}
+
 static int dm_stats_list(struct dm_stats *stats, const char *program,
                         char *result, unsigned int maxlen)
 {
@@ -571,7 +581,8 @@ static int dm_stats_list(struct dm_stats *stats, const char 
*program,
                                struct dm_stat_histogram *h = 
&s->histograms[hn];
                                unsigned int i;
 
-                               DMEMIT(" histogram:");
+                               DMEMIT(" %s:",
+                                      dm_stat_histogram_name(h->class_mask));
                                for (i = 0; i < h->n_entries; i++) {
                                        if (i)
                                                DMEMIT(",");
@@ -1189,6 +1200,12 @@ static int message_stats_create(struct mapped_device *md,
                                                  DM_STAT_CLASSES_DATA, a + 10);
                                if (r)
                                        goto ret;
+                       } else if (!strncasecmp(a, "rd_histogram:", 13)) {
+                               r = add_histogram(histograms, &n_histograms,
+                                                 1 << DM_STAT_CLASS_READ,
+                                                 a + 13);
+                               if (r)
+                                       goto ret;
                        } else
                                goto ret_einval;
                }
-- 
2.43.5

_______________________________________________
Devel mailing list
[email protected]
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to