summaryrefslogtreecommitdiff
path: root/src/basic/procfs-util.c
diff options
context:
space:
mode:
authorAnita Zhang <the.anitazha@gmail.com>2021-06-24 02:37:57 -0700
committerAnita Zhang <the.anitazha@gmail.com>2021-06-30 03:47:26 -0700
commit47136b9d9a75fff5f9e2e777aaed736e6f66c7f7 (patch)
treecf93ebb50ced0d8abdb477a66b68191ffdef87e8 /src/basic/procfs-util.c
parent4dbad977ff153f1457fd3ec5bc06b5b7e6414cc0 (diff)
downloadsystemd-47136b9d9a75fff5f9e2e777aaed736e6f66c7f7.tar.gz
oomd: switch system context parsing to use /proc/meminfo
Makes it easier in the next commits to unify on one way to read swap and memory info.
Diffstat (limited to 'src/basic/procfs-util.c')
-rw-r--r--src/basic/procfs-util.c60
1 files changed, 39 insertions, 21 deletions
diff --git a/src/basic/procfs-util.c b/src/basic/procfs-util.c
index ccab71f7d2..db3e29d04a 100644
--- a/src/basic/procfs-util.c
+++ b/src/basic/procfs-util.c
@@ -201,6 +201,41 @@ int procfs_cpu_get_usage(nsec_t *ret) {
return 0;
}
+int convert_meminfo_value_to_uint64_bytes(char *word, uint64_t *ret) {
+ char *digits, *e;
+ uint64_t v;
+ size_t n;
+ int r;
+
+ assert(word);
+ assert(ret);
+
+ /* Determine length of numeric value */
+ n = strspn(word, WHITESPACE);
+ digits = word + n;
+ n = strspn(digits, DIGITS);
+ if (n == 0)
+ return -EINVAL;
+ e = digits + n;
+
+ /* Ensure the line ends in " kB" */
+ n = strspn(e, WHITESPACE);
+ if (n == 0)
+ return -EINVAL;
+ if (!streq(e + n, "kB"))
+ return -EINVAL;
+
+ *e = 0;
+ r = safe_atou64(digits, &v);
+ if (r < 0)
+ return r;
+ if (v == UINT64_MAX)
+ return -EINVAL;
+
+ *ret = v * 1024U;
+ return 0;
+}
+
int procfs_memory_get(uint64_t *ret_total, uint64_t *ret_used) {
uint64_t mem_total = UINT64_MAX, mem_free = UINT64_MAX;
_cleanup_fclose_ FILE *f = NULL;
@@ -213,8 +248,7 @@ int procfs_memory_get(uint64_t *ret_total, uint64_t *ret_used) {
for (;;) {
_cleanup_free_ char *line = NULL;
uint64_t *v;
- char *p, *e;
- size_t n;
+ char *p;
r = read_line(f, LONG_LINE_MAX, &line);
if (r < 0)
@@ -233,25 +267,9 @@ int procfs_memory_get(uint64_t *ret_total, uint64_t *ret_used) {
continue;
}
- /* Determine length of numeric value */
- n = strspn(p, DIGITS);
- if (n == 0)
- return -EINVAL;
- e = p + n;
-
- /* Ensure the line ends in " kB" */
- n = strspn(e, WHITESPACE);
- if (n == 0)
- return -EINVAL;
- if (!streq(e + n, "kB"))
- return -EINVAL;
-
- *e = 0;
- r = safe_atou64(p, v);
+ r = convert_meminfo_value_to_uint64_bytes(p, v);
if (r < 0)
return r;
- if (*v == UINT64_MAX)
- return -EINVAL;
if (mem_total != UINT64_MAX && mem_free != UINT64_MAX)
break;
@@ -261,8 +279,8 @@ int procfs_memory_get(uint64_t *ret_total, uint64_t *ret_used) {
return -EINVAL;
if (ret_total)
- *ret_total = mem_total * 1024U;
+ *ret_total = mem_total;
if (ret_used)
- *ret_used = (mem_total - mem_free) * 1024U;
+ *ret_used = mem_total - mem_free;
return 0;
}