procd: Add cached and available to memory table
authorZachary Cook <zachcook1991@gmail.com>
Tue, 8 Oct 2019 05:02:50 +0000 (01:02 -0400)
committerHans Dedecker <dedeckeh@gmail.com>
Thu, 17 Oct 2019 19:36:48 +0000 (21:36 +0200)
Provides a better measure of actual system memory usage for Luci/users.
"cached" will be used to add a new progress bar, "available" is the
kernel's estimate of memory that is actually useable, and is more
accurate than (memory.free + memory.buffered) that Luci currently uses
to calculate available memory.

Signed-off-by: Zachary Cook <zachcook1991@gmail.com>
system.c

index 751a0169e079a6186b75cd053a4b0cefc0cff29c..9879bca76a2750fb821b336cad40ace449a03860 100644 (file)
--- a/system.c
+++ b/system.c
@@ -230,9 +230,36 @@ static int system_info(struct ubus_context *ctx, struct ubus_object *obj,
 #ifdef linux
        struct sysinfo info;
        void *c;
+       char line[256];
+       char *key, *val;
+       unsigned long long available, cached;
+       FILE *f;
 
        if (sysinfo(&info))
                return UBUS_STATUS_UNKNOWN_ERROR;
+
+       if ((f = fopen("/proc/meminfo", "r")) == NULL)
+               return UBUS_STATUS_UNKNOWN_ERROR;
+
+       /* if linux < 3.14 MemAvailable is not in meminfo */
+       available = 0;
+       cached = 0;
+
+       while (fgets(line, sizeof(line), f))
+       {
+               key = strtok(line, " :");
+               val = strtok(NULL, " ");
+
+               if (!key || !val)
+                       continue;
+
+               if (!strcasecmp(key, "MemAvailable"))
+                       available = 1024 * atoll(val);
+               else if (!strcasecmp(key, "Cached"))
+                       cached = 1024 * atoll(val);
+       }
+
+       fclose(f);
 #endif
 
        now = time(NULL);
@@ -262,6 +289,8 @@ static int system_info(struct ubus_context *ctx, struct ubus_object *obj,
                        (uint64_t)info.mem_unit * (uint64_t)info.sharedram);
        blobmsg_add_u64(&b, "buffered",
                        (uint64_t)info.mem_unit * (uint64_t)info.bufferram);
+       blobmsg_add_u64(&b, "available", available);
+       blobmsg_add_u64(&b, "cached", cached);
        blobmsg_close_table(&b, c);
 
        c = blobmsg_open_table(&b, "swap");