From f4a2e0b5776f18ed1251688a785adc7f802a01d6 Mon Sep 17 00:00:00 2001 From: Marc Fournier Date: Fri, 8 Aug 2014 11:34:20 +0200 Subject: [PATCH] memory: make linux slab reporting work with older kernels --- src/memory.c | 41 +++++++++++++++++++++++++++++++---------- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/src/memory.c b/src/memory.c index 0e6d49b3..0f5e1a00 100644 --- a/src/memory.c +++ b/src/memory.c @@ -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 -- 2.30.2