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 <zachcook1...@gmail.com> --- system.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/system.c b/system.c index 751a016..e5a4f5f 100644 --- 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"); -- 2.23.0 _______________________________________________ openwrt-devel mailing list openwrt-devel@lists.openwrt.org https://lists.openwrt.org/mailman/listinfo/openwrt-devel