The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxcfs/pull/415
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: #412. Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
From c3708fa6db4fc91b487a899a84023fecec751787 Mon Sep 17 00:00:00 2001 From: Christian Brauner <christian.brau...@ubuntu.com> Date: Tue, 9 Jun 2020 11:29:25 +0200 Subject: [PATCH] proc_fuse: cap swap to global values Closes: #412. Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com> --- src/proc_fuse.c | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/src/proc_fuse.c b/src/proc_fuse.c index 62f9665..6a3ed66 100644 --- a/src/proc_fuse.c +++ b/src/proc_fuse.c @@ -1020,7 +1020,7 @@ static int proc_meminfo_read(char *buf, size_t size, off_t offset, bool wants_swap = opts && !opts->swap_off; struct file_info *d = INTTYPE_TO_PTR(fi->fh); uint64_t memlimit = 0, memusage = 0, memswlimit = 0, memswusage = 0, - hosttotal = 0, swtotal = 0; + hosttotal = 0, swfree = 0, swtotal = 0; struct memory_stat mstat = {}; size_t linelen = 0, total_len = 0; char *cache = d->buf; @@ -1071,11 +1071,21 @@ static int proc_meminfo_read(char *buf, size_t size, off_t offset, if (ret >= 0) ret = cgroup_ops->get_memory_swap_current(cgroup_ops, cgroup, &memswusage_str); if (ret >= 0) { + struct sysinfo info; + memswlimit = get_min_memlimit(cgroup, true); memswlimit = memswlimit / 1024; if (safe_uint64(memswusage_str, &memswusage, 10) < 0) lxcfs_error("Failed to convert memswusage %s", memswusage_str); + + ret = sysinfo(&info); + if (!ret) { + if (info.totalswap < memswlimit) + memswlimit = info.totalswap; + swfree = info.freeswap; + } + memswusage = memswusage / 1024; swtotal = memswlimit; } @@ -1112,14 +1122,10 @@ static int proc_meminfo_read(char *buf, size_t size, off_t offset, printme = lbuf; } else if (startswith(line, "SwapTotal:")) { if (memswlimit > 0 && wants_swap) { - uint64_t hostswtotal = 0; - - sscanf(line + STRLITERALLEN("SwapTotal:"), "%" PRIu64, &hostswtotal); - - /* Don't advertise more SWAP than the total memory allowed. */ - if (hostswtotal < swtotal) - swtotal = hostswtotal; - + /* + * Swap total has already been calculated or + * capped to the system limit above. + */ snprintf(lbuf, 100, "SwapTotal: %8" PRIu64 " kB\n", swtotal); } else { snprintf(lbuf, 100, "SwapTotal: %8" PRIu64 " kB\n", (uint64_t)0); @@ -1127,11 +1133,15 @@ static int proc_meminfo_read(char *buf, size_t size, off_t offset, printme = lbuf; } else if (startswith(line, "SwapFree:")) { if (memswlimit > 0 && wants_swap) { - uint64_t swfree = 0; uint64_t swusage = 0; swusage = memswusage - memusage; - swfree = swtotal - swusage; + /* + * Free swap has already been capped to the + * system limit above. + */ + if (swusage <= swtotal) + swfree = swtotal - swusage; snprintf(lbuf, 100, "SwapFree: %8" PRIu64 " kB\n", swfree); } else {
_______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel