The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxcfs/pull/438
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) === This lines up LXCFS with what's described in the README. Also fixes a few bugs in how `/proc/swaps` was handled.
From 4032b735ba06488dd8703acd505cac07cf807b2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com> Date: Thu, 5 Nov 2020 15:17:02 -0500 Subject: [PATCH 1/6] cgroups: Add get_memory_swappiness MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stéphane Graber <stgra...@ubuntu.com> --- src/cgroups/cgfsng.c | 7 +++++++ src/cgroups/cgroup.h | 2 ++ 2 files changed, 9 insertions(+) diff --git a/src/cgroups/cgfsng.c b/src/cgroups/cgfsng.c index 824b0e7..d772f25 100644 --- a/src/cgroups/cgfsng.c +++ b/src/cgroups/cgfsng.c @@ -620,6 +620,12 @@ static int cgfsng_get_memory_max(struct cgroup_ops *ops, const char *cgroup, return cgfsng_get_memory(ops, cgroup, "memory.max", value); } +static int cgfsng_get_memory_swappiness(struct cgroup_ops *ops, const char *cgroup, + char **value) +{ + return cgfsng_get_memory(ops, cgroup, "memory.swappiness", value); +} + static int cgfsng_get_memory_swap_max(struct cgroup_ops *ops, const char *cgroup, char **value) { @@ -1011,6 +1017,7 @@ struct cgroup_ops *cgfsng_ops_init(void) cgfsng_ops->get_memory_stats_fd = cgfsng_get_memory_stats_fd; cgfsng_ops->get_memory_stats = cgfsng_get_memory_stats; cgfsng_ops->get_memory_max = cgfsng_get_memory_max; + cgfsng_ops->get_memory_swappiness = cgfsng_get_memory_swappiness; cgfsng_ops->get_memory_swap_max = cgfsng_get_memory_swap_max; cgfsng_ops->get_memory_current = cgfsng_get_memory_current; cgfsng_ops->get_memory_swap_current = cgfsng_get_memory_swap_current; diff --git a/src/cgroups/cgroup.h b/src/cgroups/cgroup.h index ad4a3ae..f4b5d19 100644 --- a/src/cgroups/cgroup.h +++ b/src/cgroups/cgroup.h @@ -151,6 +151,8 @@ struct cgroup_ops { const char *cgroup, char **value); int (*get_memory_max)(struct cgroup_ops *ops, const char *cgroup, char **value); + int (*get_memory_swappiness)(struct cgroup_ops *ops, const char *cgroup, + char **value); int (*get_memory_swap_max)(struct cgroup_ops *ops, const char *cgroup, char **value); bool (*can_use_swap)(struct cgroup_ops *ops); From 7cbfbc7406ae97b5ac5908cf550ddc7c81f27023 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com> Date: Thu, 5 Nov 2020 15:17:40 -0500 Subject: [PATCH 2/6] swap: Fix usage reporting MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stéphane Graber <stgra...@ubuntu.com> --- src/proc_fuse.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/proc_fuse.c b/src/proc_fuse.c index 7bc1eb0..0ad21b9 100644 --- a/src/proc_fuse.c +++ b/src/proc_fuse.c @@ -407,7 +407,7 @@ static int proc_swaps_read(char *buf, size_t size, off_t offset, if (swtotal > 0) { l = snprintf(d->buf + total_len, d->size - total_len, "none%*svirtual\t\t%" PRIu64 "\t%" PRIu64 "\t0\n", - 36, " ", swtotal, swfree); + 36, " ", swtotal, swusage); total_len += l; } From 362d1193f6cb8038b2c8a89c69d0a3ef465caa9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com> Date: Thu, 5 Nov 2020 15:20:26 -0500 Subject: [PATCH 3/6] swap: Only report usage when swappiness is 0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stéphane Graber <stgra...@ubuntu.com> --- src/proc_fuse.c | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/src/proc_fuse.c b/src/proc_fuse.c index 0ad21b9..002aac9 100644 --- a/src/proc_fuse.c +++ b/src/proc_fuse.c @@ -318,13 +318,14 @@ static inline bool startswith(const char *line, const char *pref) static int proc_swaps_read(char *buf, size_t size, off_t offset, struct fuse_file_info *fi) { - __do_free char *cgroup = NULL, *memusage_str = NULL, *memswusage_str = NULL; + __do_free char *cgroup = NULL, *memusage_str = NULL, + *memswusage_str = NULL, *memswpriority_str = NULL; struct fuse_context *fc = fuse_get_context(); struct lxcfs_opts *opts = (struct lxcfs_opts *)fuse_get_context()->private_data; bool wants_swap = opts && !opts->swap_off && liblxcfs_can_use_swap(); struct file_info *d = INTTYPE_TO_PTR(fi->fh); uint64_t memswlimit = 0, memlimit = 0, memusage = 0, memswusage = 0, - swtotal = 0, swfree = 0, swusage = 0; + swtotal = 0, swfree = 0, swusage = 0, memswpriority = 1; ssize_t total_len = 0; ssize_t l = 0; char *cache = d->buf; @@ -380,6 +381,10 @@ static int proc_swaps_read(char *buf, size_t size, off_t offset, if (swtotal >= swusage) swfree = swtotal - swusage; } + + ret = cgroup_ops->get_memory_swappiness(cgroup_ops, cgroup, &memswpriority_str); + if (ret >= 0) + safe_uint64(memswpriority_str, &memswpriority, 10); } } @@ -404,6 +409,11 @@ static int proc_swaps_read(char *buf, size_t size, off_t offset, } } + // When swappiness is 0, pretend we can't swap. + if (memswpriority == 0) { + swtotal = swusage; + } + if (swtotal > 0) { l = snprintf(d->buf + total_len, d->size - total_len, "none%*svirtual\t\t%" PRIu64 "\t%" PRIu64 "\t0\n", @@ -1136,7 +1146,7 @@ static int proc_meminfo_read(char *buf, size_t size, off_t offset, struct fuse_file_info *fi) { __do_free char *cgroup = NULL, *line = NULL, *memusage_str = NULL, - *memswusage_str = NULL; + *memswusage_str = NULL, *memswpriority_str = NULL; __do_free void *fopen_cache = NULL; __do_fclose FILE *f = NULL; struct fuse_context *fc = fuse_get_context(); @@ -1144,7 +1154,8 @@ static int proc_meminfo_read(char *buf, size_t size, off_t offset, bool wants_swap = opts && !opts->swap_off && liblxcfs_can_use_swap(), host_swap = false; struct file_info *d = INTTYPE_TO_PTR(fi->fh); uint64_t memlimit = 0, memusage = 0, memswlimit = 0, memswusage = 0, - hosttotal = 0, swfree = 0, swusage = 0, swtotal = 0; + hosttotal = 0, swfree = 0, swusage = 0, swtotal = 0, + memswpriority = 1; struct memory_stat mstat = {}; size_t linelen = 0, total_len = 0; char *cache = d->buf; @@ -1209,6 +1220,10 @@ static int proc_meminfo_read(char *buf, size_t size, off_t offset, swusage = (memswusage - memusage) / 1024; } } + + ret = cgroup_ops->get_memory_swappiness(cgroup_ops, cgroup, &memswpriority_str); + if (ret >= 0) + safe_uint64(memswpriority_str, &memswpriority, 10); } f = fopen_cached("/proc/meminfo", "re", &fopen_cache); @@ -1257,6 +1272,11 @@ static int proc_meminfo_read(char *buf, size_t size, off_t offset, swtotal = hostswtotal; host_swap = true; } + + /* When swappiness is 0, pretend we can't swap. */ + if (memswpriority == 0) { + swtotal = swusage; + } } snprintf(lbuf, 100, "SwapTotal: %8" PRIu64 " kB\n", swtotal); From 33aa929ea96a9a4d6229e486a948999f55894d24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com> Date: Thu, 5 Nov 2020 15:30:27 -0500 Subject: [PATCH 4/6] swap: Tweak meminfo logic MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stéphane Graber <stgra...@ubuntu.com> --- src/proc_fuse.c | 30 +++++++++--------------------- 1 file changed, 9 insertions(+), 21 deletions(-) diff --git a/src/proc_fuse.c b/src/proc_fuse.c index 002aac9..4c555ec 100644 --- a/src/proc_fuse.c +++ b/src/proc_fuse.c @@ -1151,7 +1151,7 @@ static int proc_meminfo_read(char *buf, size_t size, off_t offset, __do_fclose FILE *f = NULL; struct fuse_context *fc = fuse_get_context(); struct lxcfs_opts *opts = (struct lxcfs_opts *)fuse_get_context()->private_data; - bool wants_swap = opts && !opts->swap_off && liblxcfs_can_use_swap(), host_swap = false; + bool wants_swap = opts && !opts->swap_off && liblxcfs_can_use_swap(); struct file_info *d = INTTYPE_TO_PTR(fi->fh); uint64_t memlimit = 0, memusage = 0, memswlimit = 0, memswusage = 0, hosttotal = 0, swfree = 0, swusage = 0, swtotal = 0, @@ -1258,19 +1258,14 @@ static int proc_meminfo_read(char *buf, size_t size, off_t offset, sscanf(line + STRLITERALLEN("SwapTotal:"), "%" PRIu64, &hostswtotal); - /* - * If swtotal is 0 it should mean that - * memory.memsw.limit_in_bytes and - * memory.limit_in_bytes are both unlimited or - * both set to the same value. In both cases we - * have no idea what the technical swap limit - * is supposed to be (It's a shared limit - * anyway.) so fallback to the host's values in - * that case too. - */ - if ((hostswtotal < swtotal) || swtotal == 0) { + /* The total amount of swap is always reported to be the + lesser of the RAM+SWAP limit or the SWAP device size. + This is because the kernel can swap as much as it + wants and not only up to swtotal. */ + + swtotal = memlimit + swtotal; + if (hostswtotal < swtotal) { swtotal = hostswtotal; - host_swap = true; } /* When swappiness is 0, pretend we can't swap. */ @@ -1283,14 +1278,7 @@ static int proc_meminfo_read(char *buf, size_t size, off_t offset, printme = lbuf; } else if (startswith(line, "SwapFree:")) { if (wants_swap) { - uint64_t hostswfree = 0; - - if (host_swap) { - sscanf(line + STRLITERALLEN("SwapFree:"), "%" PRIu64, &hostswfree); - swfree = hostswfree; - } else if (swtotal >= swusage) { - swfree = swtotal - swusage; - } + swfree = swtotal - swusage; } snprintf(lbuf, 100, "SwapFree: %8" PRIu64 " kB\n", swfree); From 3ce66074ff2fe79993d779df3bb7533dae017ef5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com> Date: Thu, 5 Nov 2020 15:43:01 -0500 Subject: [PATCH 5/6] swap: Make /proc/swaps match /proc/meminfo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stéphane Graber <stgra...@ubuntu.com> --- src/proc_fuse.c | 47 ++++++++++++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/src/proc_fuse.c b/src/proc_fuse.c index 4c555ec..fc69789 100644 --- a/src/proc_fuse.c +++ b/src/proc_fuse.c @@ -325,11 +325,16 @@ static int proc_swaps_read(char *buf, size_t size, off_t offset, bool wants_swap = opts && !opts->swap_off && liblxcfs_can_use_swap(); struct file_info *d = INTTYPE_TO_PTR(fi->fh); uint64_t memswlimit = 0, memlimit = 0, memusage = 0, memswusage = 0, - swtotal = 0, swfree = 0, swusage = 0, memswpriority = 1; + swtotal = 0, swfree = 0, swusage = 0, memswpriority = 1 + hostswtotal = 0, hostswfree = 0; ssize_t total_len = 0; ssize_t l = 0; char *cache = d->buf; int ret; + __do_free char *line = NULL; + __do_free void *fopen_cache = NULL; + __do_fclose FILE *f = NULL; + size_t linelen = 0; if (offset) { int left; @@ -390,28 +395,32 @@ static int proc_swaps_read(char *buf, size_t size, off_t offset, total_len = snprintf(d->buf, d->size, "Filename\t\t\t\tType\t\tSize\tUsed\tPriority\n"); - /* When no mem + swap limit is specified or swapaccount=0*/ - if (!memswlimit) { - __do_free char *line = NULL; - __do_free void *fopen_cache = NULL; - __do_fclose FILE *f = NULL; - size_t linelen = 0; + /* Read host total and free values */ + f = fopen_cached("/proc/meminfo", "re", &fopen_cache); + if (!f) + return 0; - f = fopen_cached("/proc/meminfo", "re", &fopen_cache); - if (!f) - return 0; + while (getline(&line, &linelen, f) != -1) { + if (startswith(line, "SwapTotal:")) + sscanf(line, "SwapTotal: %8" PRIu64 " kB", &hostswtotal); + else if (startswith(line, "SwapFree:")) + sscanf(line, "SwapFree: %8" PRIu64 " kB", &hostswfree); + } - while (getline(&line, &linelen, f) != -1) { - if (startswith(line, "SwapTotal:")) - sscanf(line, "SwapTotal: %8" PRIu64 " kB", &swtotal); - else if (startswith(line, "SwapFree:")) - sscanf(line, "SwapFree: %8" PRIu64 " kB", &swfree); + if (wants_swap) { + /* The total amount of swap is always reported to be the + lesser of the RAM+SWAP limit or the SWAP device size. + This is because the kernel can swap as much as it + wants and not only up to swtotal. */ + swtotal = memlimit / 1024 + swtotal; + if (hostswtotal < swtotal) { + swtotal = hostswtotal; } - } - // When swappiness is 0, pretend we can't swap. - if (memswpriority == 0) { - swtotal = swusage; + /* When swappiness is 0, pretend we can't swap. */ + if (memswpriority == 0) { + swtotal = swusage; + } } if (swtotal > 0) { From 79af0cd194210970a086d543d86deab71f996c15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com> Date: Thu, 5 Nov 2020 15:46:07 -0500 Subject: [PATCH 6/6] swap: Remove now unused variable MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stéphane Graber <stgra...@ubuntu.com> --- src/proc_fuse.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/proc_fuse.c b/src/proc_fuse.c index fc69789..9bf963b 100644 --- a/src/proc_fuse.c +++ b/src/proc_fuse.c @@ -325,7 +325,7 @@ static int proc_swaps_read(char *buf, size_t size, off_t offset, bool wants_swap = opts && !opts->swap_off && liblxcfs_can_use_swap(); struct file_info *d = INTTYPE_TO_PTR(fi->fh); uint64_t memswlimit = 0, memlimit = 0, memusage = 0, memswusage = 0, - swtotal = 0, swfree = 0, swusage = 0, memswpriority = 1 + swtotal = 0, swusage = 0, memswpriority = 1, hostswtotal = 0, hostswfree = 0; ssize_t total_len = 0; ssize_t l = 0; @@ -383,8 +383,6 @@ static int proc_swaps_read(char *buf, size_t size, off_t offset, swusage = 0; else swusage = (memswusage - memusage) / 1024; - if (swtotal >= swusage) - swfree = swtotal - swusage; } ret = cgroup_ops->get_memory_swappiness(cgroup_ops, cgroup, &memswpriority_str);
_______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel