36e8a3
From 60b831ef50e435b66ddd99e635a5112e121c7cb3 Mon Sep 17 00:00:00 2001
36e8a3
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
36e8a3
Date: Tue, 22 Jan 2019 15:43:07 +0100
36e8a3
Subject: [PATCH] procfs-util: expose functionality to query total memory
36e8a3
36e8a3
procfs_memory_get_current is renamed to procfs_memory_get_used, because
36e8a3
"current" can mean anything, including total memory, used memory, and free
36e8a3
memory, as long as the value is up to date.
36e8a3
36e8a3
No functional change.
36e8a3
36e8a3
(cherry-picked from commit c482724aa5c5d0b1391fcf958a9a3ea6ce73a085)
36e8a3
36e8a3
Related: #1664976
36e8a3
---
36e8a3
 src/basic/procfs-util.c     | 9 +++++----
36e8a3
 src/basic/procfs-util.h     | 5 ++++-
36e8a3
 src/cgtop/cgtop.c           | 2 +-
36e8a3
 src/core/cgroup.c           | 2 +-
36e8a3
 src/test/test-procfs-util.c | 2 +-
36e8a3
 5 files changed, 12 insertions(+), 8 deletions(-)
36e8a3
36e8a3
diff --git a/src/basic/procfs-util.c b/src/basic/procfs-util.c
4bff0a
index a159e344b3..7aaf95bfce 100644
36e8a3
--- a/src/basic/procfs-util.c
36e8a3
+++ b/src/basic/procfs-util.c
36e8a3
@@ -201,13 +201,11 @@ int procfs_cpu_get_usage(nsec_t *ret) {
36e8a3
         return 0;
36e8a3
 }
36e8a3
 
36e8a3
-int procfs_memory_get_current(uint64_t *ret) {
36e8a3
+int procfs_memory_get(uint64_t *ret_total, uint64_t *ret_used) {
36e8a3
         uint64_t mem_total = UINT64_MAX, mem_free = UINT64_MAX;
36e8a3
         _cleanup_fclose_ FILE *f = NULL;
36e8a3
         int r;
36e8a3
 
36e8a3
-        assert(ret);
36e8a3
-
36e8a3
         f = fopen("/proc/meminfo", "re");
36e8a3
         if (!f)
36e8a3
                 return -errno;
36e8a3
@@ -262,6 +260,9 @@ int procfs_memory_get_current(uint64_t *ret) {
36e8a3
         if (mem_free > mem_total)
36e8a3
                 return -EINVAL;
36e8a3
 
36e8a3
-        *ret = (mem_total - mem_free) * 1024U;
36e8a3
+        if (ret_total)
36e8a3
+                *ret_total = mem_total * 1024U;
36e8a3
+        if (ret_used)
36e8a3
+                *ret_used = (mem_total - mem_free) * 1024U;
36e8a3
         return 0;
36e8a3
 }
36e8a3
diff --git a/src/basic/procfs-util.h b/src/basic/procfs-util.h
4bff0a
index f697ed92bc..5a44e9eff7 100644
36e8a3
--- a/src/basic/procfs-util.h
36e8a3
+++ b/src/basic/procfs-util.h
36e8a3
@@ -11,4 +11,7 @@ int procfs_tasks_get_current(uint64_t *ret);
36e8a3
 
36e8a3
 int procfs_cpu_get_usage(nsec_t *ret);
36e8a3
 
36e8a3
-int procfs_memory_get_current(uint64_t *ret);
36e8a3
+int procfs_memory_get(uint64_t *ret_total, uint64_t *ret_used);
36e8a3
+static inline int procfs_memory_get_used(uint64_t *ret) {
36e8a3
+        return procfs_memory_get(NULL, ret);
36e8a3
+}
36e8a3
diff --git a/src/cgtop/cgtop.c b/src/cgtop/cgtop.c
4bff0a
index 8dda08ab4c..792b13a43d 100644
36e8a3
--- a/src/cgtop/cgtop.c
36e8a3
+++ b/src/cgtop/cgtop.c
36e8a3
@@ -297,7 +297,7 @@ static int process(
36e8a3
         } else if (streq(controller, "memory")) {
36e8a3
 
36e8a3
                 if (is_root_cgroup(path)) {
36e8a3
-                        r = procfs_memory_get_current(&g->memory);
36e8a3
+                        r = procfs_memory_get_used(&g->memory);
36e8a3
                         if (r < 0)
36e8a3
                                 return r;
36e8a3
                 } else {
36e8a3
diff --git a/src/core/cgroup.c b/src/core/cgroup.c
4bff0a
index bb02436203..62ab41a288 100644
36e8a3
--- a/src/core/cgroup.c
36e8a3
+++ b/src/core/cgroup.c
36e8a3
@@ -2402,7 +2402,7 @@ int unit_get_memory_current(Unit *u, uint64_t *ret) {
36e8a3
 
36e8a3
         /* The root cgroup doesn't expose this information, let's get it from /proc instead */
36e8a3
         if (unit_has_root_cgroup(u))
36e8a3
-                return procfs_memory_get_current(ret);
36e8a3
+                return procfs_memory_get_used(ret);
36e8a3
 
36e8a3
         if ((u->cgroup_realized_mask & CGROUP_MASK_MEMORY) == 0)
36e8a3
                 return -ENODATA;
36e8a3
diff --git a/src/test/test-procfs-util.c b/src/test/test-procfs-util.c
4bff0a
index 08af380cc7..1d0612985b 100644
36e8a3
--- a/src/test/test-procfs-util.c
36e8a3
+++ b/src/test/test-procfs-util.c
36e8a3
@@ -18,7 +18,7 @@ int main(int argc, char *argv[]) {
36e8a3
         assert_se(procfs_cpu_get_usage(&nsec) >= 0);
36e8a3
         log_info("Current system CPU time: %s", format_timespan(buf, sizeof(buf), nsec/NSEC_PER_USEC, 1));
36e8a3
 
36e8a3
-        assert_se(procfs_memory_get_current(&v) >= 0);
36e8a3
+        assert_se(procfs_memory_get_used(&v) >= 0);
36e8a3
         log_info("Current memory usage: %s", format_bytes(buf, sizeof(buf), v));
36e8a3
 
36e8a3
         assert_se(procfs_tasks_get_current(&v) >= 0);