From 3f3b1a59ada85d21f34530cfb1dc1c0afd70e6dc Mon Sep 17 00:00:00 2001 From: Jaromir Capik Date: Tue, 29 Jul 2014 20:56:20 +0200 Subject: [PATCH] library: MemAvailable fallback now uses /proc/meminfo Taking the values from /proc/vmstat was unnecessary and prone to race conditions. --- proc/libprocps.sym | 2 -- proc/sysinfo.c | 32 +++++++++++++++++++------------- proc/sysinfo.h | 4 ---- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/proc/libprocps.sym b/proc/libprocps.sym index 8b2bab52..77a658ba 100644 --- a/proc/libprocps.sym +++ b/proc/libprocps.sym @@ -33,8 +33,6 @@ global: kb_main_shared; kb_main_total; kb_main_used; - kb_slab_reclaimable; - kb_slab_unreclaimable; kb_swap_free; kb_swap_total; kb_swap_used; diff --git a/proc/sysinfo.c b/proc/sysinfo.c index 7ffcb870..f1cc52cc 100644 --- a/proc/sysinfo.c +++ b/proc/sysinfo.c @@ -610,8 +610,15 @@ static unsigned long kb_anon_pages; static unsigned long kb_bounce; static unsigned long kb_commit_limit; static unsigned long kb_nfs_unstable; -unsigned long kb_slab_reclaimable; -unsigned long kb_slab_unreclaimable; +// seen on 2.6.18 +static unsigned long kb_min_free; +// 2.6.19+ +static unsigned long kb_slab_reclaimable; +static unsigned long kb_slab_unreclaimable; +// 2.6.27+ +static unsigned long kb_active_file; +static unsigned long kb_inactive_file; + void meminfo(void){ char namebuf[16]; /* big enough to hold any row name */ @@ -621,6 +628,7 @@ void meminfo(void){ char *tail; static const mem_table_struct mem_table[] = { {"Active", &kb_active}, // important + {"Active(file)", &kb_active_file}, {"AnonPages", &kb_anon_pages}, {"Bounce", &kb_bounce}, {"Buffers", &kb_main_buffers}, // important @@ -635,6 +643,7 @@ void meminfo(void){ {"Inact_laundry",&kb_inact_laundry}, {"Inact_target", &kb_inact_target}, {"Inactive", &kb_inactive}, // important + {"Inactive(file)",&kb_inactive_file}, {"LowFree", &kb_low_free}, {"LowTotal", &kb_low_total}, {"Mapped", &kb_mapped}, // kB version of vmstat nr_mapped @@ -701,16 +710,17 @@ nextline: if (linux_version_code < LINUX_VERSION(2, 6, 27)) 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 */ + FILE_TO_BUF(VM_MIN_FREE_FILE, vm_min_free_fd); + kb_min_free = (unsigned long) strtoull(buf,&tail,10); - 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; + watermark_low = kb_min_free * 5 / 4; /* should be equal to sum of all 'low' fields in /proc/zoneinfo */ + + mem_available = (signed long)kb_main_free - watermark_low + + kb_inactive_file + kb_active_file - MIN((kb_inactive_file + kb_active_file) / 2, watermark_low) + + kb_slab_reclaimable - MIN(kb_slab_reclaimable / 2, watermark_low); if (mem_available < 0) mem_available = 0; - kb_main_available = (unsigned long)((unsigned long long)mem_available * page_bytes / 1024ull); + kb_main_available = (unsigned long)mem_available; } } } @@ -741,7 +751,6 @@ unsigned long vm_nr_slab_unreclaimable;// 2.6.19+ kernels unsigned long vm_nr_active_file; // 2.6.27+ kernels unsigned long vm_nr_inactive_file; // 2.6.27+ kernels unsigned long vm_nr_free_pages; // 2.6.21+ kernels -unsigned long vm_min_free; // calculated from /proc/sys/vm/min_free_kbytes unsigned long vm_pgpgin; // kB disk reads (same as 1st num on /proc/stat page line) unsigned long vm_pgpgout; // kB disk writes (same as 2nd num on /proc/stat page line) unsigned long vm_pswpin; // swap reads (same as 1st num on /proc/stat swap line) @@ -893,9 +902,6 @@ nextline: + vm_pgscan_kswapd_dma + vm_pgscan_kswapd_high + vm_pgscan_kswapd_normal; if(!vm_pgsteal) vm_pgsteal = vm_pgsteal_dma + vm_pgsteal_high + vm_pgsteal_normal; - - FILE_TO_BUF(VM_MIN_FREE_FILE, vm_min_free_fd); - vm_min_free = (unsigned long) (strtoull(buf,&tail,10) * 1024ull / page_bytes); } /////////////////////////////////////////////////////////////////////// diff --git a/proc/sysinfo.h b/proc/sysinfo.h index 69518d84..adb05191 100644 --- a/proc/sysinfo.h +++ b/proc/sysinfo.h @@ -55,9 +55,6 @@ extern unsigned long kb_dirty; extern unsigned long kb_inactive; extern unsigned long kb_mapped; extern unsigned long kb_pagetables; -// seen on 2.6.24-rc6-git12 -extern unsigned long kb_slab_reclaimable; -extern unsigned long kb_slab_unreclaimable; #define BUFFSIZE (64*1024) typedef unsigned long long jiff; @@ -82,7 +79,6 @@ extern unsigned long vm_nr_slab_unreclaimable; extern unsigned long vm_nr_active_file; extern unsigned long vm_nr_inactive_file; extern unsigned long vm_nr_free_pages; -extern unsigned long vm_min_free; extern unsigned long vm_pgpgin; extern unsigned long vm_pgpgout; extern unsigned long vm_pswpin;