From c437faf8d32c7cf5d2b0eefb7dc935a9778e5413 Mon Sep 17 00:00:00 2001 From: Jim Warner Date: Sat, 19 Jul 2014 04:44:44 -0500 Subject: [PATCH] library: evolve MenAvailable algorithm on older kernel Let's not report zero for kb_main_available when older kernels don't have MemAvailable. Instead, if we simply duplicate the 'free' amount we can avoid all ancillary problems, such as those involving top's graphing mode. Reference(s): http://www.freelists.org/post/procps/kb-main-available-etc,3 Signed-off-by: Jim Warner --- free.1 | 2 +- proc/sysinfo.c | 22 +++++++++++++--------- top/top.1 | 4 ++-- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/free.1 b/free.1 index 1b40f8d0..a2bac261 100644 --- a/free.1 +++ b/free.1 @@ -41,7 +41,7 @@ provided by the \fBcached\fR or \fBfree\fR fields, this field takes into account page cache and also that not all reclaimable memory slabs will be reclaimed due to items being in use (MemAvailable in /proc/meminfo, available on -kernels 3.14, emulated on kernels 2.6.27+, displayed as zero if not available) +kernels 3.14, emulated on kernels 2.6.27+, otherwise the same as \fBfree\fR) .SH OPTIONS .TP \fB\-b\fR, \fB\-\-bytes\fR diff --git a/proc/sysinfo.c b/proc/sysinfo.c index e493e794..c9b3241b 100644 --- a/proc/sysinfo.c +++ b/proc/sysinfo.c @@ -697,17 +697,21 @@ nextline: kb_main_used = kb_main_total - kb_main_free; /* zero? might need fallback for 2.6.27 <= kernel = 20627) { - vminfo(); - watermark_low = vm_min_free * 5 / 4; /* should be equal to sum of all 'low' fields in /proc/zoneinfo */ + if (!kb_main_available) { + if (linux_version_code < 20627) + kb_main_available = kb_main_free; + else { + vminfo(); + watermark_low = vm_min_free * 5 / 4; /* should be equal to sum of all 'low' fields in /proc/zoneinfo */ - mem_available = (signed long)vm_nr_free_pages + vm_nr_inactive_file + vm_nr_active_file - - MIN((vm_nr_inactive_file + vm_nr_active_file) / 2, watermark_low) - + vm_nr_slab_reclaimable - MIN(vm_nr_slab_reclaimable / 2, watermark_low) - - watermark_low; + mem_available = (signed long)vm_nr_free_pages + vm_nr_inactive_file + vm_nr_active_file + - MIN((vm_nr_inactive_file + vm_nr_active_file) / 2, watermark_low) + + vm_nr_slab_reclaimable - MIN(vm_nr_slab_reclaimable / 2, watermark_low) + - watermark_low; - if (mem_available < 0) mem_available = 0; - kb_main_available = (unsigned long)((unsigned long long)mem_available * page_bytes / 1024ull); + if (mem_available < 0) mem_available = 0; + kb_main_available = (unsigned long)((unsigned long long)mem_available * page_bytes / 1024ull); + } } } diff --git a/top/top.1 b/top/top.1 index 08096654..75f6ab51 100644 --- a/top/top.1 +++ b/top/top.1 @@ -482,8 +482,8 @@ The \fBavail\fR number on line 2 is an estimation of \*(MP available for starting new applications, without swapping. Unlike the \fBfree\fR field, it attempts to account for readily reclaimable page cache and memory slabs. -It is available on kernels 3.14, emulated on kernels 2.6.27+ and displayed -as zero otherwise. +It is available on kernels 3.14, emulated on kernels 2.6.27+, otherwise +the same as \fBfree\fR. In the alternate memory display modes, two abbreviated summary lines are shown consisting of these elements: