]> granicus.if.org Git - procps-ng/commitdiff
library: correct 'used' memory calculations, <meminfo>
authorJim Warner <james.warner@comcast.net>
Mon, 29 May 2017 06:11:11 +0000 (01:11 -0500)
committerCraig Small <csmall@enc.com.au>
Sun, 4 Jun 2017 11:36:23 +0000 (21:36 +1000)
The <meminfo> module attempted to duplicate the former
sysinfo memory calculations wherein 'SReclaimable' was
added to 'Cached' for the 'kb_main_cached' equivalent.

But, this original approach was wrong for two reasons.

1. The addition occurred too late to impact the 'USED'
calculation which could then cause an underflow in the
top memory display if 'SReclaimable' was heavily used.

2. In changing the actual /proc/meminfo 'Cached' value
it meant that users could not rely on that proc(5) man
page when interpreting the MEMINFO_MEM_CACHED results.

So this commit adds a new enumerator for the inclusive
cached amount plus repositions the calculation so that
a MEMINFO_MEM_USED result will exclude 'SReclaimable'.

Signed-off-by: Jim Warner <james.warner@comcast.net>
proc/meminfo.c
proc/meminfo.h

index 9d7363cecea0ae4d0b8051ba28428c9b9c1df873..a03afe66a19da3922719374d5efe305f4b20e194 100644 (file)
@@ -89,6 +89,7 @@ struct meminfo_data {
     unsigned long Writeback;
     unsigned long WritebackTmp;
 
+    unsigned long derived_mem_cached;
     unsigned long derived_mem_hi_used;
     unsigned long derived_mem_lo_used;
     unsigned long derived_mem_used;
@@ -141,6 +142,7 @@ MEM_set(MEM_AVAILABLE,          ul_int,  MemAvailable)
 MEM_set(MEM_BOUNCE,             ul_int,  Bounce)
 MEM_set(MEM_BUFFERS,            ul_int,  Buffers)
 MEM_set(MEM_CACHED,             ul_int,  Cached)
+MEM_set(MEM_CACHED_ALL,         ul_int,  derived_mem_cached)
 MEM_set(MEM_COMMIT_LIMIT,       ul_int,  CommitLimit)
 MEM_set(MEM_COMMITTED_AS,       ul_int,  Committed_AS)
 MEM_set(MEM_HARD_CORRUPTED,     ul_int,  HardwareCorrupted)
@@ -183,6 +185,7 @@ HST_set(DELTA_AVAILABLE,         s_int,  MemAvailable)
 HST_set(DELTA_BOUNCE,            s_int,  Bounce)
 HST_set(DELTA_BUFFERS,           s_int,  Buffers)
 HST_set(DELTA_CACHED,            s_int,  Cached)
+HST_set(DELTA_CACHED_ALL,        s_int,  derived_mem_cached)
 HST_set(DELTA_COMMIT_LIMIT,      s_int,  CommitLimit)
 HST_set(DELTA_COMMITTED_AS,      s_int,  Committed_AS)
 HST_set(DELTA_HARD_CORRUPTED,    s_int,  HardwareCorrupted)
@@ -264,6 +267,7 @@ static struct {
   { RS(MEM_BOUNCE),            TS(ul_int) },
   { RS(MEM_BUFFERS),           TS(ul_int) },
   { RS(MEM_CACHED),            TS(ul_int) },
+  { RS(MEM_CACHED_ALL),        TS(ul_int) },
   { RS(MEM_COMMIT_LIMIT),      TS(ul_int) },
   { RS(MEM_COMMITTED_AS),      TS(ul_int) },
   { RS(MEM_HARD_CORRUPTED),    TS(ul_int) },
@@ -306,6 +310,7 @@ static struct {
   { RS(DELTA_BOUNCE),          TS(s_int)  },
   { RS(DELTA_BUFFERS),         TS(s_int)  },
   { RS(DELTA_CACHED),          TS(s_int)  },
+  { RS(DELTA_CACHED_ALL),      TS(s_int)  },
   { RS(DELTA_COMMIT_LIMIT),    TS(s_int)  },
   { RS(DELTA_COMMITTED_AS),    TS(s_int)  },
   { RS(DELTA_HARD_CORRUPTED),  TS(s_int)  },
@@ -617,13 +622,14 @@ static int meminfo_read_failed (
 
     if (0 == mHr(MemAvailable))
         mHr(MemAvailable) = mHr(MemFree);
+    mHr(derived_mem_cached) = mHr(Cached) + mHr(SReclaimable);
+
     /* if 'available' is greater than 'total' or our calculation of mem_used
        overflows, that's symptomatic of running within a lxc container where
        such values will be dramatically distorted over those of the host. */
     if (mHr(MemAvailable) > mHr(MemTotal))
         mHr(MemAvailable) = mHr(MemFree);
-
-    mem_used = mHr(MemTotal) - mHr(MemFree) - mHr(Cached) - mHr(Buffers);
+    mem_used = mHr(MemTotal) - mHr(MemFree) - mHr(derived_mem_cached) - mHr(Buffers);
     if (mem_used < 0)
         mem_used = mHr(MemTotal) - mHr(MemFree);
     mHr(derived_mem_used) = (unsigned long)mem_used;
@@ -631,8 +637,6 @@ static int meminfo_read_failed (
     if (mHr(HighFree) < mHr(HighTotal))
          mHr(derived_mem_hi_used) = mHr(HighTotal) - mHr(HighFree);
 
-    mHr(Cached) += mHr(SReclaimable);
-
     if (0 == mHr(LowTotal)) {
         mHr(LowTotal) = mHr(MemTotal);
         mHr(LowFree)  = mHr(MemFree);
index f1cffd1fc1ea667b2315899b214b87a68e72e9f8..673d0414b3b1f8d37a8453202390112dbad2f4df 100644 (file)
@@ -37,6 +37,7 @@ enum meminfo_item {
     MEMINFO_MEM_BOUNCE,            //  ul_int
     MEMINFO_MEM_BUFFERS,           //  ul_int
     MEMINFO_MEM_CACHED,            //  ul_int
+    MEMINFO_MEM_CACHED_ALL,        //  ul_int
     MEMINFO_MEM_COMMIT_LIMIT,      //  ul_int
     MEMINFO_MEM_COMMITTED_AS,      //  ul_int
     MEMINFO_MEM_HARD_CORRUPTED,    //  ul_int
@@ -79,6 +80,7 @@ enum meminfo_item {
     MEMINFO_DELTA_BOUNCE,          //   s_int
     MEMINFO_DELTA_BUFFERS,         //   s_int
     MEMINFO_DELTA_CACHED,          //   s_int
+    MEMINFO_DELTA_CACHED_ALL,      //   s_int
     MEMINFO_DELTA_COMMIT_LIMIT,    //   s_int
     MEMINFO_DELTA_COMMITTED_AS,    //   s_int
     MEMINFO_DELTA_HARD_CORRUPTED,  //   s_int