X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fmemory.c;h=0f5e1a00322da85bcb4666049f87e2eb11f4afd5;hb=2a8ee0dbb694eac183fff0306ea9c41c46facad7;hp=0e6d49b3cddd72846e801c67a2e1f9e610c836b2;hpb=121339cfc548d2d5bb0e65a2a83a6fd6bb803686;p=collectd.git 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