Code

memory: make linux slab reporting work with older kernels
authorMarc Fournier <marc.fournier@camptocamp.com>
Fri, 8 Aug 2014 09:34:20 +0000 (11:34 +0200)
committerMarc Fournier <marc.fournier@camptocamp.com>
Thu, 18 Sep 2014 07:31:57 +0000 (09:31 +0200)
src/memory.c

index 0e6d49b3cddd72846e801c67a2e1f9e610c836b2..0f5e1a00322da85bcb4666049f87e2eb11f4afd5 100644 (file)
@@ -278,11 +278,14 @@ static int memory_read_internal (value_list_t *vl)
        char *fields[8];
        int numfields;
 
+       _Bool detailed_slab_info = 0;
+
        gauge_t mem_total = 0;
        gauge_t mem_used = 0;
        gauge_t mem_buffered = 0;
        gauge_t mem_cached = 0;
        gauge_t mem_free = 0;
+       gauge_t mem_slab_total = 0;
        gauge_t mem_slab_reclaimable = 0;
        gauge_t mem_slab_unreclaimable = 0;
 
@@ -306,10 +309,16 @@ static int memory_read_internal (value_list_t *vl)
                        val = &mem_buffered;
                else if (strncasecmp (buffer, "Cached:", 7) == 0)
                        val = &mem_cached;
-               else if (strncasecmp (buffer, "SReclaimable:", 13) == 0)
+               else if (strncasecmp (buffer, "Slab:", 5) == 0)
+                       val = &mem_slab_total;
+               else if (strncasecmp (buffer, "SReclaimable:", 13) == 0) {
                        val = &mem_slab_reclaimable;
-               else if (strncasecmp (buffer, "SUnreclaim:", 11) == 0)
+                       detailed_slab_info = 1;
+               }
+               else if (strncasecmp (buffer, "SUnreclaim:", 11) == 0) {
                        val = &mem_slab_unreclaimable;
+                       detailed_slab_info = 1;
+               }
                else
                        continue;
 
@@ -327,16 +336,28 @@ static int memory_read_internal (value_list_t *vl)
                                sstrerror (errno, errbuf, sizeof (errbuf)));
        }
 
-       if (mem_total < (mem_free + mem_buffered + mem_cached + mem_slab_unreclaimable + mem_slab_reclaimable))
+       if (mem_total < (mem_free + mem_buffered + mem_cached + mem_slab_total))
                return (-1);
 
-       mem_used = mem_total - (mem_free + mem_buffered + mem_cached + mem_slab_unreclaimable + mem_slab_reclaimable);
-       MEMORY_SUBMIT ("used",        mem_used,
-                      "buffered",    mem_buffered,
-                      "cached",      mem_cached,
-                      "free",        mem_free,
-                      "slab_unrecl", mem_slab_unreclaimable,
-                      "slab_recl",   mem_slab_reclaimable);
+       mem_used = mem_total - (mem_free + mem_buffered + mem_cached + mem_slab_total);
+
+       /* SReclaimable and SUnreclaim were introduced in kernel 2.6.19
+        * They sum up to the value of Slab, which is available on older & newer
+        * kernels. So SReclaimable/SUnreclaim are submitted if available, and Slab
+        * if not. */
+       if (detailed_slab_info)
+               MEMORY_SUBMIT ("used",        mem_used,
+                              "buffered",    mem_buffered,
+                              "cached",      mem_cached,
+                              "free",        mem_free,
+                              "slab_unrecl", mem_slab_unreclaimable,
+                              "slab_recl",   mem_slab_reclaimable);
+       else
+               MEMORY_SUBMIT ("used",     mem_used,
+                              "buffered", mem_buffered,
+                              "cached",   mem_cached,
+                              "free",     mem_free,
+                              "slab",     mem_slab_total);
 /* #endif KERNEL_LINUX */
 
 #elif HAVE_LIBKSTAT