Beginning with Linux kernel version 3.14, a new MemAvailable line appears
in /proc/meminfo[1]. This caused wmmemload to look for Cached and Buffers one
line off of their correct location.  The problem was reported in [2].

[1] 
https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=34e431b0ae398fc54ea69ff85ec700722c9da773
[2] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=749216
---
 wmmemload/src/mem_linux.c | 36 ++++++++++++++++++++++++++++++------
 1 file changed, 30 insertions(+), 6 deletions(-)

diff --git a/wmmemload/src/mem_linux.c b/wmmemload/src/mem_linux.c
index bc6be6d..ab6e01b 100644
--- a/wmmemload/src/mem_linux.c
+++ b/wmmemload/src/mem_linux.c
@@ -28,7 +28,11 @@
 #include <sys/utsname.h>
 #include "mem.h"
 
-static int isnewformat; /* for kernel 2.5.1 or later */
+static enum {
+       BEFORE_2_5_1,
+       BETWEEN_2_5_1_AND_3_14,
+       AFTER_3_14
+} format;
 
 #ifdef DEBUG
 #  define INLINE_STATIC static
@@ -47,12 +51,17 @@ void mem_init(void)
                perror("uname()");
        sscanf(un.release, "%d.%d.%d", &version, &patchlevel, &sublevel);
 
-       /* new format ? (kernel >= 2.5.1pre?) */
+       /* new format ? (kernel >= 3.14 or 2.5.1pre?) */
        /* see linux/fs/proc/proc_misc.c */
-       if ((version == 2 && patchlevel >= 5 && sublevel >= 1) ||
+       /* or linux/fs/proc/meminfo.c */
+       if ((version == 3 && patchlevel >= 14) || version > 3)
+               format = AFTER_3_14;
+       else if ((version == 2 && patchlevel >= 5 && sublevel >= 1) ||
            (version == 2 && patchlevel >= 6 && sublevel >= 0) ||
            version > 2)
-               isnewformat = 1;
+               format = BETWEEN_2_5_1_AND_3_14;
+       else
+               format = BEFORE_2_5_1;
 }
 
 
@@ -104,7 +113,8 @@ void mem_getusage(int *per_mem, int *per_swap, const struct 
mem_options *opts)
        buffer[len] = '\0';
        p = buffer;
 
-       if (!isnewformat) {
+       switch (format) {
+       case (BEFORE_2_5_1):
                /* skip 3 lines */
                for (i = 0; i < 3; i++)
                        p = skip_line(p);
@@ -115,7 +125,9 @@ void mem_getusage(int *per_mem, int *per_swap, const struct 
mem_options *opts)
                mbuffer = strtoul(p, &p, 0); p = skip_multiple_token(p, 2);
                mcached = strtoul(p, &p, 0); p = skip_multiple_token(p, 2);
                scached = strtoul(p, &p, 0);
-       } else {
+               break;
+
+       case (BETWEEN_2_5_1_AND_3_14):
                p = skip_token(p);
                /* examine each line of file */
                mtotal  = strtoul(p, &p, 0); p = skip_multiple_token(p, 2);
@@ -123,6 +135,18 @@ void mem_getusage(int *per_mem, int *per_swap, const 
struct mem_options *opts)
                mbuffer = strtoul(p, &p, 0); p = skip_multiple_token(p, 2);
                mcached = strtoul(p, &p, 0); p = skip_multiple_token(p, 2);
                scached = strtoul(p, &p, 0);
+               break;
+
+       case (AFTER_3_14):
+               p = skip_token(p);
+               /* examine each line of file */
+               mtotal  = strtoul(p, &p, 0); p = skip_multiple_token(p, 2);
+               mfree   = strtoul(p, &p, 0);
+               p = skip_multiple_token(p, 5); /* skip MemAvailable line */
+               mbuffer = strtoul(p, &p, 0); p = skip_multiple_token(p, 2);
+               mcached = strtoul(p, &p, 0); p = skip_multiple_token(p, 2);
+               scached = strtoul(p, &p, 0);
+               break;
        }
 
 
-- 
1.9.1


-- 
To unsubscribe, send mail to wmaker-dev-unsubscr...@lists.windowmaker.org.

Reply via email to