From 60eefa396251acebd02f06538ccee1081dcdcd0d Mon Sep 17 00:00:00 2001 From: vegbir Date: Thu, 27 Jul 2023 09:10:52 +0000 Subject: [PATCH 12/15] lxcfs adapt 4.18 kernel Signed-off-by: vegbir --- src/proc_fuse.c | 69 +++++++++++++++++++++---------------------------- 1 file changed, 30 insertions(+), 39 deletions(-) diff --git a/src/proc_fuse.c b/src/proc_fuse.c index 0dbbefe..392115c 100644 --- a/src/proc_fuse.c +++ b/src/proc_fuse.c @@ -686,8 +686,8 @@ static int proc_diskstats_read(char *buf, size_t size, off_t offset, struct devinfo *container_devinfo = NULL, *ptr = NULL; 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; + uint64_t read_service_time = 0, write_service_time = 0, discard_service_time = 0, read_wait_time = 0, + write_wait_time = 0, discard_wait_time = 0, total_ticks = 0; char *cache = d->buf; size_t cache_size = d->buflen; size_t linelen = 0, total_len = 0; @@ -726,29 +726,15 @@ static int proc_diskstats_read(char *buf, size_t size, off_t offset, return read_file_fuse("/proc/diskstats", buf, size, d); } - ret = cgroup_ops->get_io_merged(cgroup_ops, cg, &io_merged_str); - if (ret < 0) { - if (ret == -EOPNOTSUPP) - return read_file_fuse("/proc/diskstats", buf, size, d); - } - ret = cgroup_ops->get_io_service_bytes(cgroup_ops, cg, &io_service_bytes_str); if (ret < 0) { if (ret == -EOPNOTSUPP) return read_file_fuse("/proc/diskstats", buf, size, d); } - ret = cgroup_ops->get_io_wait_time(cgroup_ops, cg, &io_wait_time_str); - if (ret < 0) { - if (ret == -EOPNOTSUPP) - return read_file_fuse("/proc/diskstats", buf, size, d); - } - - ret = cgroup_ops->get_io_service_time(cgroup_ops, cg, &io_service_time_str); - if (ret < 0) { - if (ret == -EOPNOTSUPP) - return read_file_fuse("/proc/diskstats", buf, size, d); - } + cgroup_ops->get_io_merged(cgroup_ops, cg, &io_merged_str); + cgroup_ops->get_io_wait_time(cgroup_ops, cg, &io_wait_time_str); + cgroup_ops->get_io_service_time(cgroup_ops, cg, &io_service_time_str); f = fopen_cached("/proc/diskstats", "re", &fopen_cache); if (!f) @@ -784,9 +770,11 @@ static int proc_diskstats_read(char *buf, size_t size, off_t offset, 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); + if (io_merged_str != NULL) { + 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; @@ -795,26 +783,29 @@ static int proc_diskstats_read(char *buf, size_t size, off_t offset, 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; + if (io_service_time_str != NULL) { + 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_service_time_str, stats.major, stats.minor, "Write", &write_service_time); + write_service_time = write_service_time / 1000000; + 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_service_time_str, stats.major, stats.minor, "Total", &total_ticks); + } - 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; + if (io_wait_time_str != NULL) { + get_blkio_io_value(io_wait_time_str, stats.major, stats.minor, "Read", &read_wait_time); + read_wait_time = read_wait_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; + get_blkio_io_value(io_wait_time_str, stats.major, stats.minor, "Discard", &discard_wait_time); + discard_wait_time = discard_wait_time / 1000000; + } - 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.read_ticks = read_service_time + read_wait_time; + stats.write_ticks = write_service_time + write_wait_time; 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; + stats.total_ticks = total_ticks / 1000000; memset(lbuf, 0, sizeof(lbuf)); if (stats.read || stats.write || stats.read_merged || stats.write_merged || -- 2.41.0