In the kernel, cgroup statistics and event counters in multi-key control
files (such as memory.stat, cpu.stat, and memory.events) are internally
stored and exported as 64-bit values.

On 32-bit platforms, cg_read_key_long() relies on atol(), which returns a
32-bit signed long. When values in memory.stat or event counters exceed
2.14GB (such as on 32-bit systems with large memory), the parsed value
overflows and wraps into negative numbers, leading to subtle bugs and
false test failures.

Standardize on explicitly-sized 64-bit helpers and types across the
cgroup selftests:

- Define s64 in cgroup_util.h as signed long long.
- Convert cg_read_key_long() to cg_read_key_s64() using atoll().
- Convert cg_read_key_long_poll() to cg_read_key_s64_poll(), updating
  both the return type and the expected argument to s64.
- Update values_close() and values_close_report() to operate on s64 and
  use llabs() to prevent downcasting/truncation of 64-bit differences.
- Migrate helper functions (get_cg_wb_count(), get_zswpout(),
  get_zswap_incomp(), wait_for_writeback(), and cg_check_freezetime())
  and their callers to s64.
- Migrate all callers across test_cpu, test_kmem, test_memcontrol,
  test_pids, test_freezer, and test_zswap to cg_read_key_s64().
- Update corresponding printf formats to %lld and difference checks to
  llabs() for s64.

Suggested-by: Michal Koutný <[email protected]>
Signed-off-by: Wilson Felipe Pereira <[email protected]>
---
 .../selftests/cgroup/lib/cgroup_util.c        | 14 ++--
 .../cgroup/lib/include/cgroup_util.h          | 22 +++---
 tools/testing/selftests/cgroup/test_cpu.c     | 47 ++++++-------
 tools/testing/selftests/cgroup/test_freezer.c | 16 ++---
 tools/testing/selftests/cgroup/test_kmem.c    | 56 ++++++++-------
 .../selftests/cgroup/test_memcontrol.c        | 69 ++++++++++---------
 tools/testing/selftests/cgroup/test_pids.c    |  5 +-
 tools/testing/selftests/cgroup/test_zswap.c   | 54 ++++++++-------
 8 files changed, 148 insertions(+), 135 deletions(-)

diff --git a/tools/testing/selftests/cgroup/lib/cgroup_util.c 
b/tools/testing/selftests/cgroup/lib/cgroup_util.c
index 2596c12cd864..ed3c4893833a 100644
--- a/tools/testing/selftests/cgroup/lib/cgroup_util.c
+++ b/tools/testing/selftests/cgroup/lib/cgroup_util.c
@@ -172,7 +172,7 @@ long cg_read_long_fd(int fd)
        return atol(buf);
 }
 
-long cg_read_key_long(const char *cgroup, const char *control, const char *key)
+s64 cg_read_key_s64(const char *cgroup, const char *control, const char *key)
 {
        char buf[BUF_SIZE];
        char *ptr;
@@ -184,18 +184,18 @@ long cg_read_key_long(const char *cgroup, const char 
*control, const char *key)
        if (!ptr)
                return -1;
 
-       return atol(ptr + strlen(key));
+       return atoll(ptr + strlen(key));
 }
 
-long cg_read_key_long_poll(const char *cgroup, const char *control,
-                          const char *key, long expected, int retries,
-                          useconds_t wait_interval_us)
+s64 cg_read_key_s64_poll(const char *cgroup, const char *control,
+                        const char *key, s64 expected, int retries,
+                        useconds_t wait_interval_us)
 {
-       long val = -1;
+       s64 val = -1;
        int i;
 
        for (i = 0; i < retries; i++) {
-               val = cg_read_key_long(cgroup, control, key);
+               val = cg_read_key_s64(cgroup, control, key);
                if (val < 0)
                        return val;
 
diff --git a/tools/testing/selftests/cgroup/lib/include/cgroup_util.h 
b/tools/testing/selftests/cgroup/lib/include/cgroup_util.h
index 5d39c709ac7a..ddb05932d9c7 100644
--- a/tools/testing/selftests/cgroup/lib/include/cgroup_util.h
+++ b/tools/testing/selftests/cgroup/lib/include/cgroup_util.h
@@ -2,6 +2,8 @@
 #include <stdbool.h>
 #include <stdlib.h>
 
+typedef signed long long s64;
+
 #ifndef BUF_SIZE
 #define BUF_SIZE 4096
 #endif
@@ -24,25 +26,25 @@
 /*
  * Checks if two given values differ by less than err% of their sum.
  */
-static inline int values_close(long a, long b, int err)
+static inline int values_close(s64 a, s64 b, int err)
 {
-       return labs(a - b) <= (a + b) / 100 * err;
+       return llabs(a - b) <= (a + b) / 100 * err;
 }
 
 /*
  * Checks if two given values differ by less than err% of their sum and assert
  * with detailed debug info if not.
  */
-static inline int values_close_report(long a, long b, int err)
+static inline int values_close_report(s64 a, s64 b, int err)
 {
-       long diff  = labs(a - b);
-       long limit = (a + b) / 100 * err;
+       s64 diff  = llabs(a - b);
+       s64 limit = (a + b) / 100 * err;
        double actual_err = (a + b) ? (100.0 * diff / (a + b)) : 0.0;
        int close = diff <= limit;
 
        if (!close)
                fprintf(stderr,
-                       "[FAIL] actual=%ld expected=%ld | diff=%ld | limit=%ld 
| "
+                       "[FAIL] actual=%lld expected=%lld | diff=%lld | 
limit=%lld | "
                        "tolerance=%d%% | actual_error=%.2f%%\n",
                        a, b, diff, limit, err, actual_err);
 
@@ -69,10 +71,10 @@ extern int cg_read_strstr(const char *cgroup, const char 
*control,
                          const char *needle);
 extern long cg_read_long(const char *cgroup, const char *control);
 extern long cg_read_long_fd(int fd);
-long cg_read_key_long(const char *cgroup, const char *control, const char 
*key);
-long cg_read_key_long_poll(const char *cgroup, const char *control,
-                          const char *key, long expected, int retries,
-                          useconds_t wait_interval_us);
+s64 cg_read_key_s64(const char *cgroup, const char *control, const char *key);
+s64 cg_read_key_s64_poll(const char *cgroup, const char *control,
+                        const char *key, s64 expected, int retries,
+                        useconds_t wait_interval_us);
 extern long cg_read_lc(const char *cgroup, const char *control);
 extern int cg_write(const char *cgroup, const char *control, char *buf);
 extern int cg_open(const char *cgroup, const char *control, int flags);
diff --git a/tools/testing/selftests/cgroup/test_cpu.c 
b/tools/testing/selftests/cgroup/test_cpu.c
index 735a53bb222b..11da1de9cdeb 100644
--- a/tools/testing/selftests/cgroup/test_cpu.c
+++ b/tools/testing/selftests/cgroup/test_cpu.c
@@ -24,7 +24,7 @@ enum hog_clock_type {
 struct cpu_hogger {
        char *cgroup;
        pid_t pid;
-       long usage;
+       s64 usage;
 };
 
 struct cpu_hog_func_param {
@@ -185,7 +185,7 @@ static int hog_cpus_timed(const char *cgroup, void *arg)
 static int test_cpucg_stats(const char *root)
 {
        int ret = KSFT_FAIL;
-       long usage_usec, user_usec, system_usec;
+       s64 usage_usec, user_usec, system_usec;
        long usage_seconds = 2;
        long expected_usage_usec = usage_seconds * USEC_PER_SEC;
        char *cpucg;
@@ -197,9 +197,9 @@ static int test_cpucg_stats(const char *root)
        if (cg_create(cpucg))
                goto cleanup;
 
-       usage_usec = cg_read_key_long(cpucg, "cpu.stat", "usage_usec");
-       user_usec = cg_read_key_long(cpucg, "cpu.stat", "user_usec");
-       system_usec = cg_read_key_long(cpucg, "cpu.stat", "system_usec");
+       usage_usec = cg_read_key_s64(cpucg, "cpu.stat", "usage_usec");
+       user_usec = cg_read_key_s64(cpucg, "cpu.stat", "user_usec");
+       system_usec = cg_read_key_s64(cpucg, "cpu.stat", "system_usec");
        if (usage_usec != 0 || user_usec != 0 || system_usec != 0)
                goto cleanup;
 
@@ -214,8 +214,8 @@ static int test_cpucg_stats(const char *root)
        if (cg_run(cpucg, hog_cpus_timed, (void *)&param))
                goto cleanup;
 
-       usage_usec = cg_read_key_long(cpucg, "cpu.stat", "usage_usec");
-       user_usec = cg_read_key_long(cpucg, "cpu.stat", "user_usec");
+       usage_usec = cg_read_key_s64(cpucg, "cpu.stat", "usage_usec");
+       user_usec = cg_read_key_s64(cpucg, "cpu.stat", "user_usec");
        if (user_usec <= 0)
                goto cleanup;
 
@@ -239,7 +239,7 @@ static int test_cpucg_nice(const char *root)
 {
        int ret = KSFT_FAIL;
        int status;
-       long user_usec, nice_usec;
+       s64 user_usec, nice_usec;
        long usage_seconds = 2;
        long expected_nice_usec = usage_seconds * USEC_PER_SEC;
        char *cpucg;
@@ -252,8 +252,8 @@ static int test_cpucg_nice(const char *root)
        if (cg_create(cpucg))
                goto cleanup;
 
-       user_usec = cg_read_key_long(cpucg, "cpu.stat", "user_usec");
-       nice_usec = cg_read_key_long(cpucg, "cpu.stat", "nice_usec");
+       user_usec = cg_read_key_s64(cpucg, "cpu.stat", "user_usec");
+       nice_usec = cg_read_key_s64(cpucg, "cpu.stat", "nice_usec");
        if (nice_usec == -1)
                ret = KSFT_SKIP;
        if (user_usec != 0 || nice_usec != 0)
@@ -289,8 +289,8 @@ static int test_cpucg_nice(const char *root)
                if (!WIFEXITED(status))
                        goto cleanup;
 
-               user_usec = cg_read_key_long(cpucg, "cpu.stat", "user_usec");
-               nice_usec = cg_read_key_long(cpucg, "cpu.stat", "nice_usec");
+               user_usec = cg_read_key_s64(cpucg, "cpu.stat", "user_usec");
+               nice_usec = cg_read_key_s64(cpucg, "cpu.stat", "nice_usec");
                if (user_usec <= 0)
                        goto cleanup;
                if (!values_close_report(nice_usec, expected_nice_usec, 1))
@@ -357,8 +357,8 @@ run_cpucg_weight_test(
        }
 
        for (i = 0; i < ARRAY_SIZE(children); i++)
-               children[i].usage = cg_read_key_long(children[i].cgroup,
-                               "cpu.stat", "usage_usec");
+               children[i].usage = cg_read_key_s64(children[i].cgroup,
+                                                   "cpu.stat", "usage_usec");
 
        if (validate(children, ARRAY_SIZE(children)))
                goto cleanup;
@@ -486,7 +486,7 @@ run_cpucg_nested_weight_test(const char *root, bool 
overprovisioned)
        int ret = KSFT_FAIL, i;
        char *parent = NULL, *child = NULL;
        struct cpu_hogger leaf[3] = {};
-       long nested_leaf_usage, child_usage;
+       s64 nested_leaf_usage, child_usage;
        int nprocs = get_nprocs();
 
        if (!overprovisioned) {
@@ -567,8 +567,8 @@ run_cpucg_nested_weight_test(const char *root, bool 
overprovisioned)
        }
 
        for (i = 0; i < ARRAY_SIZE(leaf); i++) {
-               leaf[i].usage = cg_read_key_long(leaf[i].cgroup,
-                               "cpu.stat", "usage_usec");
+               leaf[i].usage = cg_read_key_s64(leaf[i].cgroup, "cpu.stat",
+                                               "usage_usec");
                if (leaf[i].usage <= 0)
                        goto cleanup;
        }
@@ -580,8 +580,7 @@ run_cpucg_nested_weight_test(const char *root, bool 
overprovisioned)
        } else if (!values_close_report(leaf[0].usage * 2, nested_leaf_usage, 
15))
                goto cleanup;
 
-
-       child_usage = cg_read_key_long(child, "cpu.stat", "usage_usec");
+       child_usage = cg_read_key_s64(child, "cpu.stat", "usage_usec");
        if (child_usage <= 0)
                goto cleanup;
        if (!values_close_report(child_usage, nested_leaf_usage, 1))
@@ -679,7 +678,8 @@ static int test_cpucg_max(const char *root)
        long duration_seconds = 1;
 
        long duration_usec;
-       long usage_usec, n_periods, remainder_usec, expected_usage_usec;
+       long n_periods, remainder_usec, expected_usage_usec;
+       s64 usage_usec;
        char *cpucg;
        char quota_buf[32];
 
@@ -708,7 +708,7 @@ static int test_cpucg_max(const char *root)
        if (cg_run(cpucg, hog_cpus_timed, (void *)&param))
                goto cleanup;
 
-       usage_usec = cg_read_key_long(cpucg, "cpu.stat", "usage_usec");
+       usage_usec = cg_read_key_s64(cpucg, "cpu.stat", "usage_usec");
        if (usage_usec <= 0)
                goto cleanup;
 
@@ -746,7 +746,8 @@ static int test_cpucg_max_nested(const char *root)
        long duration_seconds = 1;
 
        long duration_usec;
-       long usage_usec, n_periods, remainder_usec, expected_usage_usec;
+       long n_periods, remainder_usec, expected_usage_usec;
+       s64 usage_usec;
        char *parent, *child;
        char quota_buf[32];
 
@@ -782,7 +783,7 @@ static int test_cpucg_max_nested(const char *root)
        if (cg_run(child, hog_cpus_timed, (void *)&param))
                goto cleanup;
 
-       usage_usec = cg_read_key_long(child, "cpu.stat", "usage_usec");
+       usage_usec = cg_read_key_s64(child, "cpu.stat", "usage_usec");
        if (usage_usec <= 0)
                goto cleanup;
 
diff --git a/tools/testing/selftests/cgroup/test_freezer.c 
b/tools/testing/selftests/cgroup/test_freezer.c
index f28bb02e9783..f4f082c13d4b 100644
--- a/tools/testing/selftests/cgroup/test_freezer.c
+++ b/tools/testing/selftests/cgroup/test_freezer.c
@@ -807,10 +807,9 @@ static int test_cgfreezer_vfork(const char *root)
 /*
  * Get the current frozen_usec for the cgroup.
  */
-static long cg_check_freezetime(const char *cgroup)
+static s64 cg_check_freezetime(const char *cgroup)
 {
-       return cg_read_key_long(cgroup, "cgroup.stat.local",
-                               "frozen_usec ");
+       return cg_read_key_s64(cgroup, "cgroup.stat.local", "frozen_usec ");
 }
 
 /*
@@ -820,7 +819,7 @@ static int test_cgfreezer_time_empty(const char *root)
 {
        int ret = KSFT_FAIL;
        char *cgroup = NULL;
-       long prev, curr;
+       s64 prev, curr;
 
        cgroup = cg_name(root, "cg_time_test_empty");
        if (!cgroup)
@@ -839,7 +838,7 @@ static int test_cgfreezer_time_empty(const char *root)
                goto cleanup;
        }
        if (curr > 0) {
-               debug("Expect time (%ld) to be 0\n", curr);
+               debug("Expect time (%lld) to be 0\n", curr);
                goto cleanup;
        }
 
@@ -853,8 +852,7 @@ static int test_cgfreezer_time_empty(const char *root)
        usleep(1000);
        curr = cg_check_freezetime(cgroup);
        if (curr < 1000) {
-               debug("Expect time (%ld) to be at least 1000 us\n",
-                     curr);
+               debug("Expect time (%lld) to be at least 1000 us\n", curr);
                goto cleanup;
        }
 
@@ -867,7 +865,7 @@ static int test_cgfreezer_time_empty(const char *root)
        prev = curr;
        curr = cg_check_freezetime(cgroup);
        if (curr <= prev) {
-               debug("Expect time (%ld) to be more than previous check 
(%ld)\n",
+               debug("Expect time (%lld) to be more than previous check 
(%lld)\n",
                      curr, prev);
                goto cleanup;
        }
@@ -879,7 +877,7 @@ static int test_cgfreezer_time_empty(const char *root)
        prev = curr;
        curr = cg_check_freezetime(cgroup);
        if (curr != prev) {
-               debug("Expect time (%ld) to be unchanged from previous check 
(%ld)\n",
+               debug("Expect time (%lld) to be unchanged from previous check 
(%lld)\n",
                      curr, prev);
                goto cleanup;
        }
diff --git a/tools/testing/selftests/cgroup/test_kmem.c 
b/tools/testing/selftests/cgroup/test_kmem.c
index 437f2d35f205..249898f3b81e 100644
--- a/tools/testing/selftests/cgroup/test_kmem.c
+++ b/tools/testing/selftests/cgroup/test_kmem.c
@@ -54,7 +54,8 @@ static int test_kmem_basic(const char *root)
 {
        int ret = KSFT_FAIL;
        char *cg = NULL;
-       long slab0, slab1, current;
+       s64 slab0, slab1;
+       long current;
 
        cg = cg_name(root, "kmem_basic_test");
        if (!cg)
@@ -66,7 +67,7 @@ static int test_kmem_basic(const char *root)
        if (cg_run(cg, alloc_dcache, (void *)100000))
                goto cleanup;
 
-       slab0 = cg_read_key_long(cg, "memory.stat", "slab ");
+       slab0 = cg_read_key_s64(cg, "memory.stat", "slab ");
        if (slab0 < (1 << 20))
                goto cleanup;
 
@@ -75,7 +76,7 @@ static int test_kmem_basic(const char *root)
        /* wait for RCU freeing */
        sleep(1);
 
-       slab1 = cg_read_key_long(cg, "memory.stat", "slab ");
+       slab1 = cg_read_key_s64(cg, "memory.stat", "slab ");
        if (slab1 < 0)
                goto cleanup;
 
@@ -167,7 +168,8 @@ static int cg_run_in_subcgroups(const char *parent,
  */
 static int test_kmem_memcg_deletion(const char *root)
 {
-       long current, anon, file, kernel, sock, sum;
+       long current;
+       s64 anon, file, kernel, sock, sum;
        int ret = KSFT_FAIL;
        char *parent;
 
@@ -185,23 +187,23 @@ static int test_kmem_memcg_deletion(const char *root)
                goto cleanup;
 
        current = cg_read_long(parent, "memory.current");
-       anon = cg_read_key_long(parent, "memory.stat", "anon ");
-       file = cg_read_key_long(parent, "memory.stat", "file ");
-       kernel = cg_read_key_long(parent, "memory.stat", "kernel ");
-       sock = cg_read_key_long(parent, "memory.stat", "sock ");
+       anon = cg_read_key_s64(parent, "memory.stat", "anon ");
+       file = cg_read_key_s64(parent, "memory.stat", "file ");
+       kernel = cg_read_key_s64(parent, "memory.stat", "kernel ");
+       sock = cg_read_key_s64(parent, "memory.stat", "sock ");
        if (current < 0 || anon < 0 || file < 0 || kernel < 0 || sock < 0)
                goto cleanup;
 
        sum = anon + file + kernel + sock;
-       if (labs(sum - current) < MAX_VMSTAT_ERROR) {
+       if (llabs(sum - current) < MAX_VMSTAT_ERROR) {
                ret = KSFT_PASS;
        } else {
                printf("memory.current = %ld\n", current);
-               printf("anon + file + kernel + sock = %ld\n", sum);
-               printf("anon = %ld\n", anon);
-               printf("file = %ld\n", file);
-               printf("kernel = %ld\n", kernel);
-               printf("sock = %ld\n", sock);
+               printf("anon + file + kernel + sock = %lld\n", sum);
+               printf("anon = %lld\n", anon);
+               printf("file = %lld\n", file);
+               printf("kernel = %lld\n", kernel);
+               printf("sock = %lld\n", sock);
        }
 
 cleanup:
@@ -248,7 +250,7 @@ static int spawn_1000_threads(const char *cgroup, void *arg)
        int nr_threads = 1000;
        pthread_t *tinfo;
        unsigned long i;
-       long stack;
+       s64 stack;
        int ret = -1;
 
        tinfo = calloc(nr_threads, sizeof(pthread_t));
@@ -263,7 +265,7 @@ static int spawn_1000_threads(const char *cgroup, void *arg)
                }
        }
 
-       stack = cg_read_key_long(cgroup, "memory.stat", "kernel_stack ");
+       stack = cg_read_key_s64(cgroup, "memory.stat", "kernel_stack ");
        if (stack >= 4096 * 1000)
                ret = 0;
 
@@ -307,7 +309,7 @@ static int test_kmem_dead_cgroups(const char *root)
 {
        int ret = KSFT_FAIL;
        char *parent;
-       long dead = -1;
+       s64 dead = -1;
 
        parent = cg_name(root, "kmem_dead_cgroups_test");
        if (!parent)
@@ -328,9 +330,10 @@ static int test_kmem_dead_cgroups(const char *root)
         * from a specific kernel constant, and can be adjusted if reclaim
         * behavior changes in the future.
         */
-       dead = cg_read_key_long_poll(parent, "cgroup.stat",
-                                       "nr_dying_descendants ", 0, 
KMEM_DEAD_WAIT_RETRIES,
-                                       DEFAULT_WAIT_INTERVAL_US);
+       dead = cg_read_key_s64_poll(parent, "cgroup.stat",
+                                   "nr_dying_descendants ", 0,
+                                   KMEM_DEAD_WAIT_RETRIES,
+                                   DEFAULT_WAIT_INTERVAL_US);
        if (dead)
                goto cleanup;
 
@@ -353,7 +356,8 @@ static int test_percpu_basic(const char *root)
 {
        int ret = KSFT_FAIL;
        char *parent, *child;
-       long current, percpu, slab;
+       long current;
+       s64 percpu, slab;
        int i;
 
        parent = cg_name(root, "percpu_basic_test");
@@ -382,15 +386,15 @@ static int test_percpu_basic(const char *root)
        }
 
        current = cg_read_long(parent, "memory.current");
-       percpu = cg_read_key_long(parent, "memory.stat", "percpu ");
-       slab = cg_read_key_long(parent, "memory.stat", "slab ");
+       percpu = cg_read_key_s64(parent, "memory.stat", "percpu ");
+       slab = cg_read_key_s64(parent, "memory.stat", "slab ");
 
        if (current > 0 && percpu > 0 && slab >= 0 &&
-                       labs(current - (percpu + slab)) < MAX_VMSTAT_ERROR)
+           llabs(current - (percpu + slab)) < MAX_VMSTAT_ERROR)
                ret = KSFT_PASS;
        else
-               printf("memory.current %ld\npercpu %ld\nslab %ld\ndelta %ld\n",
-                       current, percpu, slab, current - (percpu + slab));
+               printf("memory.current %ld\npercpu %lld\nslab %lld\ndelta 
%lld\n",
+                      current, percpu, slab, current - (percpu + slab));
 
 cleanup_children:
        for (i = 0; i < 1000; i++) {
diff --git a/tools/testing/selftests/cgroup/test_memcontrol.c 
b/tools/testing/selftests/cgroup/test_memcontrol.c
index 3a84d068fbf3..539650c1d562 100644
--- a/tools/testing/selftests/cgroup/test_memcontrol.c
+++ b/tools/testing/selftests/cgroup/test_memcontrol.c
@@ -192,7 +192,8 @@ static int alloc_anon_50M_check(const char *cgroup, void 
*arg)
 {
        size_t size = MB(50);
        char *buf;
-       long anon, current;
+       s64 anon;
+       long current;
        int ret = -1;
 
        buf = alloc_and_populate_anon(size);
@@ -206,7 +207,7 @@ static int alloc_anon_50M_check(const char *cgroup, void 
*arg)
        if (!values_close(size, current, 3))
                goto cleanup;
 
-       anon = cg_read_key_long(cgroup, "memory.stat", "anon ");
+       anon = cg_read_key_s64(cgroup, "memory.stat", "anon ");
        if (anon < 0)
                goto cleanup;
 
@@ -223,7 +224,8 @@ static int alloc_pagecache_50M_check(const char *cgroup, 
void *arg)
 {
        size_t size = MB(50);
        int ret = -1;
-       long current, file;
+       long current;
+       s64 file;
        int fd;
 
        fd = get_temp_fd();
@@ -237,7 +239,7 @@ static int alloc_pagecache_50M_check(const char *cgroup, 
void *arg)
        if (current < size)
                goto cleanup;
 
-       file = cg_read_key_long(cgroup, "memory.stat", "file ");
+       file = cg_read_key_s64(cgroup, "memory.stat", "file ");
        if (file < 0)
                goto cleanup;
 
@@ -623,10 +625,10 @@ static int test_memcg_protection(const char *root, bool 
min)
        for (i = 0; i < ARRAY_SIZE(children); i++) {
                int ignore_low_events_index = has_recursiveprot ? 2 : -1;
                int no_low_events_index = 1;
-               long low, oom;
+               s64 low, oom;
 
-               oom = cg_read_key_long(children[i], "memory.events", "oom ");
-               low = cg_read_key_long(children[i], "memory.events", "low ");
+               oom = cg_read_key_s64(children[i], "memory.events", "oom ");
+               low = cg_read_key_s64(children[i], "memory.events", "low ");
 
                if (oom)
                        goto cleanup;
@@ -711,7 +713,7 @@ static int test_memcg_high(const char *root)
 {
        int ret = KSFT_FAIL;
        char *memcg;
-       long high;
+       s64 high;
 
        memcg = cg_name(root, "memcg_test");
        if (!memcg)
@@ -738,7 +740,7 @@ static int test_memcg_high(const char *root)
        if (cg_run(memcg, alloc_pagecache_max_30M, NULL))
                goto cleanup;
 
-       high = cg_read_key_long(memcg, "memory.events", "high ");
+       high = cg_read_key_s64(memcg, "memory.events", "high ");
        if (high <= 0)
                goto cleanup;
 
@@ -774,8 +776,8 @@ static int test_memcg_high_sync(const char *root)
 {
        int ret = KSFT_FAIL, pid, fd = -1;
        char *memcg;
-       long pre_high, pre_max;
-       long post_high, post_max;
+       s64 pre_high, pre_max;
+       s64 post_high, post_max;
 
        memcg = cg_name(root, "memcg_test");
        if (!memcg)
@@ -784,8 +786,8 @@ static int test_memcg_high_sync(const char *root)
        if (cg_create(memcg))
                goto cleanup;
 
-       pre_high = cg_read_key_long(memcg, "memory.events", "high ");
-       pre_max = cg_read_key_long(memcg, "memory.events", "max ");
+       pre_high = cg_read_key_s64(memcg, "memory.events", "high ");
+       pre_max = cg_read_key_s64(memcg, "memory.events", "max ");
        if (pre_high < 0 || pre_max < 0)
                goto cleanup;
 
@@ -808,8 +810,8 @@ static int test_memcg_high_sync(const char *root)
 
        cg_wait_for(fd);
 
-       post_high = cg_read_key_long(memcg, "memory.events", "high ");
-       post_max = cg_read_key_long(memcg, "memory.events", "max ");
+       post_high = cg_read_key_s64(memcg, "memory.events", "high ");
+       post_max = cg_read_key_s64(memcg, "memory.events", "max ");
        if (post_high < 0 || post_max < 0)
                goto cleanup;
 
@@ -836,7 +838,8 @@ static int test_memcg_max(const char *root)
 {
        int ret = KSFT_FAIL;
        char *memcg;
-       long current, max;
+       long current;
+       s64 max;
 
        memcg = cg_name(root, "memcg_test");
        if (!memcg)
@@ -865,7 +868,7 @@ static int test_memcg_max(const char *root)
        if (current > MB(30) || !current)
                goto cleanup;
 
-       max = cg_read_key_long(memcg, "memory.events", "max ");
+       max = cg_read_key_s64(memcg, "memory.events", "max ");
        if (max <= 0)
                goto cleanup;
 
@@ -1029,7 +1032,8 @@ static int test_memcg_swap_max_peak(const char *root)
 {
        int ret = KSFT_FAIL;
        char *memcg;
-       long max, peak;
+       s64 max;
+       long peak;
        struct stat ss;
        int swap_peak_fd = -1, mem_peak_fd = -1;
 
@@ -1122,10 +1126,10 @@ static int test_memcg_swap_max_peak(const char *root)
        if (!cg_run(memcg, alloc_anon, (void *)MB(100)))
                goto cleanup;
 
-       if (cg_read_key_long(memcg, "memory.events", "oom ") != 1)
+       if (cg_read_key_s64(memcg, "memory.events", "oom ") != 1)
                goto cleanup;
 
-       if (cg_read_key_long(memcg, "memory.events", "oom_kill ") != 1)
+       if (cg_read_key_s64(memcg, "memory.events", "oom_kill ") != 1)
                goto cleanup;
 
        peak = cg_read_long(memcg, "memory.peak");
@@ -1186,7 +1190,7 @@ static int test_memcg_swap_max_peak(const char *root)
        if (cg_run(memcg, alloc_anon_50M_check_swap, (void *)MB(30)))
                goto cleanup;
 
-       max = cg_read_key_long(memcg, "memory.events", "max ");
+       max = cg_read_key_s64(memcg, "memory.events", "max ");
        if (max <= 0)
                goto cleanup;
 
@@ -1248,10 +1252,10 @@ static int test_memcg_oom_events(const char *root)
        if (cg_read_strcmp(memcg, "cgroup.procs", ""))
                goto cleanup;
 
-       if (cg_read_key_long(memcg, "memory.events", "oom ") != 1)
+       if (cg_read_key_s64(memcg, "memory.events", "oom ") != 1)
                goto cleanup;
 
-       if (cg_read_key_long(memcg, "memory.events", "oom_kill ") != 1)
+       if (cg_read_key_s64(memcg, "memory.events", "oom_kill ") != 1)
                goto cleanup;
 
        ret = KSFT_PASS;
@@ -1354,13 +1358,14 @@ static int tcp_client(const char *cgroup, unsigned 
short port)
        ret = KSFT_FAIL;
        while (retries--) {
                uint8_t buf[0x100000];
-               long current, sock;
+               long current;
+               s64 sock;
 
                if (read(sk, buf, sizeof(buf)) <= 0)
                        goto close_sk;
 
                current = cg_read_long(cgroup, "memory.current");
-               sock = cg_read_key_long(cgroup, "memory.stat", "sock ");
+               sock = cg_read_key_s64(cgroup, "memory.stat", "sock ");
 
                if (current < 0 || sock < 0)
                        goto close_sk;
@@ -1392,7 +1397,7 @@ static int test_memcg_sock(const char *root)
        int bind_retries = 5, ret = KSFT_FAIL, pid, err;
        unsigned short port;
        char *memcg;
-       long sock_post = -1;
+       s64 sock_post = -1;
 
        memcg = cg_name(root, "memcg_test");
        if (!memcg)
@@ -1459,7 +1464,7 @@ static int test_memcg_sock(const char *root)
         * scheduling slack) and require that the "sock " counter
         * eventually drops to zero.
         */
-       sock_post = cg_read_key_long_poll(memcg, "memory.stat", "sock ", 0,
+       sock_post = cg_read_key_s64_poll(memcg, "memory.stat", "sock ", 0,
                                         MEMCG_SOCKSTAT_WAIT_RETRIES,
                                         DEFAULT_WAIT_INTERVAL_US);
        if (sock_post)
@@ -1484,7 +1489,7 @@ static int test_memcg_oom_group_leaf_events(const char 
*root)
 {
        int ret = KSFT_FAIL;
        char *parent, *child;
-       long parent_oom_events;
+       s64 parent_oom_events;
 
        parent = cg_name(root, "memcg_test_0");
        child = cg_name(root, "memcg_test_0/memcg_test_1");
@@ -1519,11 +1524,11 @@ static int test_memcg_oom_group_leaf_events(const char 
*root)
        if (cg_test_proc_killed(child))
                goto cleanup;
 
-       if (cg_read_key_long(child, "memory.events", "oom_kill ") <= 0)
+       if (cg_read_key_s64(child, "memory.events", "oom_kill ") <= 0)
                goto cleanup;
 
-       parent_oom_events = cg_read_key_long(
-                       parent, "memory.events", "oom_kill ");
+       parent_oom_events =
+               cg_read_key_s64(parent, "memory.events", "oom_kill ");
        /*
         * If memory_localevents is not enabled (the default), the parent should
         * count OOM events in its children groups. Otherwise, it should not
@@ -1639,7 +1644,7 @@ static int test_memcg_oom_group_score_events(const char 
*root)
        if (!cg_run(memcg, alloc_anon, (void *)MB(100)))
                goto cleanup;
 
-       if (cg_read_key_long(memcg, "memory.events", "oom_kill ") != 3)
+       if (cg_read_key_s64(memcg, "memory.events", "oom_kill ") != 3)
                goto cleanup;
 
        if (kill(safe_pid, SIGKILL))
diff --git a/tools/testing/selftests/cgroup/test_pids.c 
b/tools/testing/selftests/cgroup/test_pids.c
index 710109b53dfe..f4d5bc9f5f24 100644
--- a/tools/testing/selftests/cgroup/test_pids.c
+++ b/tools/testing/selftests/cgroup/test_pids.c
@@ -111,12 +111,11 @@ static int test_pids_events(const char *root)
        if (kill(pid, SIGINT))
                goto cleanup;
 
-       if (cg_read_key_long(cg_child, "pids.events", "max ") != 0)
+       if (cg_read_key_s64(cg_child, "pids.events", "max ") != 0)
                goto cleanup;
-       if (cg_read_key_long(cg_parent, "pids.events", "max ") != 1)
+       if (cg_read_key_s64(cg_parent, "pids.events", "max ") != 1)
                goto cleanup;
 
-
        ret = KSFT_PASS;
 
 cleanup:
diff --git a/tools/testing/selftests/cgroup/test_zswap.c 
b/tools/testing/selftests/cgroup/test_zswap.c
index 8f2c9aa4776c..f4ee440b3c66 100644
--- a/tools/testing/selftests/cgroup/test_zswap.c
+++ b/tools/testing/selftests/cgroup/test_zswap.c
@@ -59,14 +59,14 @@ static int get_zswap_stored_pages(size_t *value)
        return read_int(PATH_ZSWAP_STORED_PAGES, value);
 }
 
-static long get_cg_wb_count(const char *cg)
+static s64 get_cg_wb_count(const char *cg)
 {
-       return cg_read_key_long(cg, "memory.stat", "zswpwb");
+       return cg_read_key_s64(cg, "memory.stat", "zswpwb");
 }
 
-static long get_zswpout(const char *cgroup)
+static s64 get_zswpout(const char *cgroup)
 {
-       return cg_read_key_long(cgroup, "memory.stat", "zswpout ");
+       return cg_read_key_s64(cgroup, "memory.stat", "zswpout ");
 }
 
 static int allocate_and_read_bytes(const char *cgroup, void *arg)
@@ -125,9 +125,10 @@ static char *setup_test_group_1M(const char *root, const 
char *name)
  * Writeback is asynchronous; poll until at least one writeback has
  * been recorded for @cg, or until @timeout_ms has elapsed.
  */
-static long wait_for_writeback(const char *cg, int timeout_ms)
+static s64 wait_for_writeback(const char *cg, int timeout_ms)
 {
-       long elapsed, count;
+       long elapsed;
+       s64 count;
        for (elapsed = 0; elapsed < timeout_ms; elapsed += 100) {
                count = get_cg_wb_count(cg);
 
@@ -147,7 +148,7 @@ static long wait_for_writeback(const char *cg, int 
timeout_ms)
  */
 static int test_zswap_usage(const char *root)
 {
-       long zswpout_before, zswpout_after;
+       s64 zswpout_before, zswpout_after;
        int ret = KSFT_FAIL;
        char *test_group;
 
@@ -191,7 +192,8 @@ static int test_swapin_nozswap(const char *root)
 {
        int ret = KSFT_FAIL;
        char *test_group, mem_max_buf[32];
-       long swap_peak, zswpout, min_swap;
+       long swap_peak, min_swap;
+       s64 zswpout;
        size_t allocation_size = page_size * 512;
 
        min_swap = allocation_size / 4;
@@ -248,7 +250,7 @@ static int test_zswapin(const char *root)
 {
        int ret = KSFT_FAIL;
        char *test_group;
-       long zswpin;
+       s64 zswpin;
 
        test_group = cg_name(root, "zswapin_test");
        if (!test_group)
@@ -264,7 +266,7 @@ static int test_zswapin(const char *root)
        if (cg_run(test_group, allocate_and_read_bytes, (void *)MB(32)))
                goto out;
 
-       zswpin = cg_read_key_long(test_group, "memory.stat", "zswpin ");
+       zswpin = cg_read_key_s64(test_group, "memory.stat", "zswpin ");
        if (zswpin < 0) {
                ksft_print_msg("failed to get zswpin\n");
                goto out;
@@ -355,11 +357,11 @@ static int attempt_writeback(const char *cgroup, void 
*arg)
 
 static int test_zswap_writeback_one(const char *cgroup, bool wb)
 {
-       long zswpwb_before, zswpwb_after;
+       s64 zswpwb_before, zswpwb_after;
 
        zswpwb_before = get_cg_wb_count(cgroup);
        if (zswpwb_before != 0) {
-               ksft_print_msg("zswpwb_before = %ld instead of 0\n", 
zswpwb_before);
+               ksft_print_msg("zswpwb_before = %lld instead of 0\n", 
zswpwb_before);
                return -1;
        }
 
@@ -375,7 +377,7 @@ static int test_zswap_writeback_one(const char *cgroup, 
bool wb)
                return -1;
 
        if (wb != !!zswpwb_after) {
-               ksft_print_msg("zswpwb_after is %ld while wb is %s\n",
+               ksft_print_msg("zswpwb_after is %lld while wb is %s\n",
                                zswpwb_after, wb ? "enabled" : "disabled");
                return -1;
        }
@@ -487,7 +489,7 @@ static int test_no_invasive_cgroup_shrink(const char *root)
                memset(&zw_allocation[off], 0, page_size);
                memset(&zw_allocation[off], 'a', page_size/4);
        }
-       if (cg_read_key_long(zw_group, "memory.stat", "zswapped") < 1)
+       if (cg_read_key_s64(zw_group, "memory.stat", "zswapped") < 1)
                goto out;
 
        /* Push wb_group memory into zswap with hard-to-compress data to 
trigger wb */
@@ -630,7 +632,7 @@ static int test_no_kmem_bypass(const char *root)
                        break;
                /* If memory was pushed to zswap, verify it belongs to memcg */
                if (stored_pages > stored_pages_threshold) {
-                       int zswapped = cg_read_key_long(test_group, 
"memory.stat", "zswapped ");
+                       s64 zswapped = cg_read_key_s64(test_group, 
"memory.stat", "zswapped ");
                        int delta = stored_pages * page_size - zswapped;
                        int result_ok = delta < stored_pages * page_size / 4;
 
@@ -703,9 +705,9 @@ static int allocate_random_and_wait(const char *cgroup, 
void *arg)
        return 0;
 }
 
-static long get_zswap_incomp(const char *cgroup)
+static s64 get_zswap_incomp(const char *cgroup)
 {
-       return cg_read_key_long(cgroup, "memory.stat", "zswap_incomp ");
+       return cg_read_key_s64(cgroup, "memory.stat", "zswap_incomp ");
 }
 
 /*
@@ -721,7 +723,7 @@ static int test_zswap_incompressible(const char *root)
        int ret = KSFT_FAIL;
        struct incomp_child_args *values;
        char *test_group;
-       long zswap_incomp;
+       s64 zswap_incomp;
        pid_t child_pid;
        int child_status;
        char buf;
@@ -757,13 +759,15 @@ static int test_zswap_incompressible(const char *root)
 
        zswap_incomp = get_zswap_incomp(test_group);
        if (zswap_incomp <= 0) {
-               long zswpout = get_zswpout(test_group);
-               long zswapped = cg_read_key_long(test_group, "memory.stat", 
"zswapped ");
-               long zswap_b = cg_read_key_long(test_group, "memory.stat", 
"zswap ");
-
-               ksft_print_msg("zswap_incomp not increased: %ld\n", 
zswap_incomp);
-               ksft_print_msg("debug: zswpout=%ld zswapped=%ld zswap_b=%ld\n",
-                              zswpout, zswapped, zswap_b);
+               s64 zswpout = get_zswpout(test_group);
+               s64 zswapped =
+                       cg_read_key_s64(test_group, "memory.stat", "zswapped ");
+               s64 zswap_b =
+                       cg_read_key_s64(test_group, "memory.stat", "zswap ");
+
+               ksft_print_msg("zswap_incomp not increased: %lld\n", 
zswap_incomp);
+               ksft_print_msg("debug: zswpout=%lld zswapped=%lld 
zswap_b=%lld\n",
+                               zswpout, zswapped, zswap_b);
                ksft_print_msg("debug: madvise ret=%d errno=%d\n",
                               values->madvise_ret, values->madvise_errno);
                goto out_kill;
-- 
2.55.0.979.g7e5102b832-goog


Reply via email to