The following pull request was submitted through Github.
It can be accessed and reviewed at: https://github.com/lxc/lxcfs/pull/431

This e-mail was sent by the LXC bot, direct replies will not reach the author
unless they happen to be subscribed to this list.

=== Description (from pull-request) ===
Closes: #427.
Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
From 998cdfc94eeddb91c814410f653a0b5741fd88f2 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brau...@ubuntu.com>
Date: Tue, 8 Sep 2020 13:17:20 +0200
Subject: [PATCH] diskstats: support new fields in 4.18+ kernels

Closes: #427.
Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
---
 src/proc_fuse.c | 119 +++++++++++++++++++++++++++++++++---------------
 1 file changed, 83 insertions(+), 36 deletions(-)

diff --git a/src/proc_fuse.c b/src/proc_fuse.c
index 778bb9c..907f5c7 100644
--- a/src/proc_fuse.c
+++ b/src/proc_fuse.c
@@ -448,6 +448,27 @@ static void get_blkio_io_value(char *str, unsigned major, 
unsigned minor,
        }
 }
 
+struct lxcfs_diskstats {
+       unsigned int major;             /*  1 - major number */
+       unsigned int minor;             /*  2 - minor mumber */
+       char dev_name[72];              /*  3 - device name */
+       uint64_t read;                  /*  4 - reads completed successfully */
+       uint64_t read_merged;           /*  5 - reads merged */
+       uint64_t read_sectors;          /*  6 - sectors read */
+       uint64_t read_ticks;            /*  7 - time spent reading (ms) */
+       uint64_t write;                 /*  8 - writes completed */
+       uint64_t write_merged;          /*  9 - writes merged */
+       uint64_t write_sectors;         /* 10 - sectors written */
+       uint64_t write_ticks;           /* 11 - time spent writing (ms) */
+       uint64_t ios_pgr;               /* 12 - I/Os currently in progress */
+       uint64_t total_ticks;           /* 13 - time spent doing I/Os (ms) */
+       uint64_t rq_ticks;              /* 14 - weighted time spent doing I/Os 
(ms) */
+       uint64_t discard;               /* 15 - discards completed successfully 
(4.18+) */
+       uint64_t discard_merged;        /* 16 - discards merged                 
(4.18+) */
+       uint64_t discard_sectors;       /* 17 - sectors discarded               
(4.18+) */
+       uint64_t discard_ticks;         /* 18 - time spent discarding           
(4.18+) */
+};
+
 static int proc_diskstats_read(char *buf, size_t size, off_t offset,
                               struct fuse_file_info *fi)
 {
@@ -459,19 +480,15 @@ static int proc_diskstats_read(char *buf, size_t size, 
off_t offset,
        __do_fclose FILE *f = NULL;
        struct fuse_context *fc = fuse_get_context();
        struct file_info *d = INTTYPE_TO_PTR(fi->fh);
-       uint64_t read = 0, write = 0;
-       uint64_t read_merged = 0, write_merged = 0;
-       uint64_t read_sectors = 0, write_sectors = 0;
-       uint64_t read_ticks = 0, write_ticks = 0;
-       uint64_t ios_pgr = 0, tot_ticks = 0, rq_ticks = 0;
-       uint64_t rd_svctm = 0, wr_svctm = 0, rd_wait = 0, wr_wait = 0;
+       struct lxcfs_diskstats stats = {};
+       /* helper fields */
+       uint64_t read_service_time, write_service_time, discard_service_time, 
read_wait_time,
+           write_wait_time, discard_wait_time;
        char *cache = d->buf;
        size_t cache_size = d->buflen;
        size_t linelen = 0, total_len = 0;
-       unsigned int major = 0, minor = 0;
        int i = 0;
        int ret;
-       char dev_name[72];
 
        if (offset) {
                int left;
@@ -536,39 +553,69 @@ static int proc_diskstats_read(char *buf, size_t size, 
off_t offset,
                ssize_t l;
                char lbuf[256];
 
-               i = sscanf(line, "%u %u %71s", &major, &minor, dev_name);
+               i = sscanf(line, "%u %u %71s", &stats.major, &stats.minor, 
stats.dev_name);
                if (i != 3)
                        continue;
 
-               get_blkio_io_value(io_serviced_str, major, minor, "Read", 
&read);
-               get_blkio_io_value(io_serviced_str, major, minor, "Write", 
&write);
-               get_blkio_io_value(io_merged_str, major, minor, "Read", 
&read_merged);
-               get_blkio_io_value(io_merged_str, major, minor, "Write", 
&write_merged);
-               get_blkio_io_value(io_service_bytes_str, major, minor, "Read", 
&read_sectors);
-               read_sectors = read_sectors/512;
-               get_blkio_io_value(io_service_bytes_str, major, minor, "Write", 
&write_sectors);
-               write_sectors = write_sectors/512;
-
-               get_blkio_io_value(io_service_time_str, major, minor, "Read", 
&rd_svctm);
-               rd_svctm = rd_svctm/1000000;
-               get_blkio_io_value(io_wait_time_str, major, minor, "Read", 
&rd_wait);
-               rd_wait = rd_wait/1000000;
-               read_ticks = rd_svctm + rd_wait;
-
-               get_blkio_io_value(io_service_time_str, major, minor, "Write", 
&wr_svctm);
-               wr_svctm =  wr_svctm/1000000;
-               get_blkio_io_value(io_wait_time_str, major, minor, "Write", 
&wr_wait);
-               wr_wait =  wr_wait/1000000;
-               write_ticks = wr_svctm + wr_wait;
-
-               get_blkio_io_value(io_service_time_str, major, minor, "Total", 
&tot_ticks);
-               tot_ticks =  tot_ticks/1000000;
+               get_blkio_io_value(io_serviced_str, stats.major, stats.minor, 
"Read", &stats.read);
+               get_blkio_io_value(io_serviced_str, stats.major, stats.minor, 
"Write", &stats.write);
+               get_blkio_io_value(io_serviced_str, stats.major, stats.minor, 
"Discard", &stats.discard);
+
+               get_blkio_io_value(io_merged_str, stats.major, stats.minor, 
"Read", &stats.read_merged);
+               get_blkio_io_value(io_merged_str, stats.major, stats.minor, 
"Write", &stats.write_merged);
+               get_blkio_io_value(io_merged_str, stats.major, stats.minor, 
"Discard", &stats.discard_merged);
+
+               get_blkio_io_value(io_service_bytes_str, stats.major, 
stats.minor, "Read", &stats.read_sectors);
+               stats.read_sectors = stats.read_sectors / 512;
+               get_blkio_io_value(io_service_bytes_str, stats.major, 
stats.minor, "Write", &stats.write_sectors);
+               stats.write_sectors = stats.write_sectors / 512;
+               get_blkio_io_value(io_service_bytes_str, stats.major, 
stats.minor, "Discard", &stats.discard_sectors);
+               stats.discard_sectors = stats.discard_sectors / 512;
+
+               get_blkio_io_value(io_service_time_str, stats.major, 
stats.minor, "Read", &read_service_time);
+               read_service_time = read_service_time / 1000000;
+               get_blkio_io_value(io_wait_time_str, stats.major, stats.minor, 
"Read", &read_wait_time);
+               read_wait_time = read_wait_time / 1000000;
+               stats.read_ticks = read_service_time + read_wait_time;
+
+               get_blkio_io_value(io_service_time_str, stats.major, 
stats.minor, "Write", &write_service_time);
+               write_service_time = write_service_time / 1000000;
+               get_blkio_io_value(io_wait_time_str, stats.major, stats.minor, 
"Write", &write_wait_time);
+               write_wait_time = write_wait_time / 1000000;
+               stats.write_ticks = write_service_time + write_wait_time;
+
+               get_blkio_io_value(io_service_time_str, stats.major, 
stats.minor, "Discard", &discard_service_time);
+               discard_service_time = discard_service_time / 1000000;
+               get_blkio_io_value(io_wait_time_str, stats.major, stats.minor, 
"Discard", &discard_wait_time);
+               discard_wait_time = discard_wait_time / 1000000;
+               stats.discard_ticks = discard_service_time + discard_wait_time;
+
+               get_blkio_io_value(io_service_time_str, stats.major, 
stats.minor, "Total", &stats.total_ticks);
+               stats.total_ticks = stats.total_ticks / 1000000;
 
                memset(lbuf, 0, 256);
-               if (read || write || read_merged || write_merged || 
read_sectors || write_sectors || read_ticks || write_ticks)
-                       snprintf(lbuf, 256, "%u       %u %s %lu %lu %lu %lu %lu 
%lu %lu %lu %lu %lu %lu\n",
-                               major, minor, dev_name, read, read_merged, 
read_sectors, read_ticks,
-                               write, write_merged, write_sectors, 
write_ticks, ios_pgr, tot_ticks, rq_ticks);
+               if (stats.read || stats.write || stats.read_merged || 
stats.write_merged ||
+                   stats.read_sectors || stats.write_sectors || 
stats.read_ticks ||
+                   stats.write_ticks || stats.ios_pgr || stats.total_ticks || 
stats.rq_ticks ||
+                   stats.discard_merged || stats.discard_sectors || 
stats.discard_ticks)
+                       snprintf(lbuf, 256, "%u       %u %s %lu %lu %lu %lu %lu 
%lu %lu %lu %lu %lu %lu %lu %lu %lu\n",
+                               stats.major,
+                               stats.minor,
+                               stats.dev_name,
+                               stats.read,
+                               stats.read_merged,
+                               stats.read_sectors,
+                               stats.read_ticks,
+                               stats.write,
+                               stats.write_merged,
+                               stats.write_sectors,
+                               stats.write_ticks,
+                               stats.ios_pgr,
+                               stats.total_ticks,
+                               stats.rq_ticks,
+                               stats.discard_merged,
+                               stats.discard_sectors,
+                               stats.discard_ticks);
                else
                        continue;
 
_______________________________________________
lxc-devel mailing list
lxc-devel@lists.linuxcontainers.org
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to