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 <james.warner@comcast.net>
This commit is contained in:
Jim Warner 2014-07-19 04:44:44 -05:00 committed by Jaromir Capik
parent 7391699b07
commit c437faf8d3
3 changed files with 16 additions and 12 deletions

2
free.1
View File

@ -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

View File

@ -697,17 +697,21 @@ nextline:
kb_main_used = kb_main_total - kb_main_free;
/* zero? might need fallback for 2.6.27 <= kernel <? 3.14 */
if (!kb_main_available && linux_version_code >= 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);
}
}
}

View File

@ -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: