Browse Source

procd: Add cached and available to memory table

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>
Zachary Cook 4 years ago
parent
commit
258aa04328
1 changed files with 29 additions and 0 deletions
  1. 29 0
      system.c

+ 29 - 0
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");