[PATCH bpf-next v4 1/2] selftests/bpf: Move alloc_pagecache() to cgroup_helpers
From: listout
Date: Tue Oct 13 2026 - 14:23:55 EST
From: Brahmajit Das <bdas@xxxxxxx>
arena_memcg has a static alloc_pagecache() that fills the page cache
with clean, reclaimable pages by reading a sparse O_TMPFILE. The next
patch needs the same helper for the memcg kfunc tests.
Move it to cgroup_helpers.c, which test_progs already links, so both
tests share one copy and fixes to the reclaimability detection only
have to be made once.
No functional change.
Assisted-by: Claude:claude-opus-5-5
Signed-off-by: Brahmajit Das <bdas@xxxxxxx>
---
tools/testing/selftests/bpf/cgroup_helpers.c | 34 +++++++++++++++++++
tools/testing/selftests/bpf/cgroup_helpers.h | 1 +
.../selftests/bpf/prog_tests/arena_memcg.c | 34 -------------------
3 files changed, 35 insertions(+), 34 deletions(-)
diff --git a/tools/testing/selftests/bpf/cgroup_helpers.c b/tools/testing/selftests/bpf/cgroup_helpers.c
index 4183ff6150c2..ace15b9cd2e4 100644
--- a/tools/testing/selftests/bpf/cgroup_helpers.c
+++ b/tools/testing/selftests/bpf/cgroup_helpers.c
@@ -5,6 +5,8 @@
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/xattr.h>
+#include <sys/vfs.h>
+#include <linux/magic.h>
#include <linux/limits.h>
#include <stdio.h>
#include <stdlib.h>
@@ -613,6 +615,38 @@ int cgroup_setup_and_join(const char *path) {
return cg_fd;
}
+/*
+ * Fill the page cache with @size bytes of clean, reclaimable pages by
+ * reading a sparse temp file, the way the cgroup selftests do. Returns the
+ * fd, which must stay open: closing it drops the cache. Returns -EOPNOTSUPP
+ * if the working directory cannot back such a file, -1 on error.
+ */
+int alloc_pagecache(size_t size)
+{
+ struct statfs stfs;
+ char buf[4096];
+ size_t off;
+ int fd;
+
+ fd = open(".", O_TMPFILE | O_RDWR | O_EXCL, 0600);
+ if (fd < 0)
+ return errno == EOPNOTSUPP ? -EOPNOTSUPP : -1;
+ /* tmpfs hands out shmem pages, which are not reclaimable without swap */
+ if (fstatfs(fd, &stfs) || stfs.f_type == TMPFS_MAGIC) {
+ close(fd);
+ return -EOPNOTSUPP;
+ }
+ if (ftruncate(fd, size))
+ goto err;
+ for (off = 0; off < size; off += sizeof(buf))
+ if (read(fd, buf, sizeof(buf)) < 0)
+ goto err;
+ return fd;
+err:
+ close(fd);
+ return -1;
+}
+
/**
* setup_classid_environment() - Setup the cgroupv1 net_cls environment
*
diff --git a/tools/testing/selftests/bpf/cgroup_helpers.h b/tools/testing/selftests/bpf/cgroup_helpers.h
index d42d2e13044e..6cc5ccb63fc2 100644
--- a/tools/testing/selftests/bpf/cgroup_helpers.h
+++ b/tools/testing/selftests/bpf/cgroup_helpers.h
@@ -20,6 +20,7 @@ int read_cgroup_file(const char *relative_path, const char *file,
int read_cgroup_file_parent(const char *relative_path, const char *file,
char *buf, size_t len);
int cgroup_setup_and_join(const char *relative_path);
+int alloc_pagecache(size_t size);
int get_root_cgroup(void);
int create_and_get_cgroup(const char *relative_path);
void remove_cgroup(const char *relative_path);
diff --git a/tools/testing/selftests/bpf/prog_tests/arena_memcg.c b/tools/testing/selftests/bpf/prog_tests/arena_memcg.c
index c76a7eb2f01d..55c8db956ff3 100644
--- a/tools/testing/selftests/bpf/prog_tests/arena_memcg.c
+++ b/tools/testing/selftests/bpf/prog_tests/arena_memcg.c
@@ -2,8 +2,6 @@
#define _GNU_SOURCE
#include <test_progs.h>
#include <fcntl.h>
-#include <linux/magic.h>
-#include <sys/vfs.h>
#include <sys/wait.h>
#include <unistd.h>
#include <sys/user.h>
@@ -37,38 +35,6 @@ static void dump_memcg(void)
fprintf(stderr, "memory.events:\n%s", buf);
}
-/*
- * Fill the page cache with @size bytes of clean, reclaimable pages by
- * reading a sparse temp file, the way the cgroup selftests do. Returns the
- * fd, which must stay open: closing it drops the cache. Returns -EOPNOTSUPP
- * if the working directory cannot back such a file, -1 on error.
- */
-static int alloc_pagecache(size_t size)
-{
- struct statfs stfs;
- char buf[4096];
- size_t off;
- int fd;
-
- fd = open(".", O_TMPFILE | O_RDWR | O_EXCL, 0600);
- if (fd < 0)
- return errno == EOPNOTSUPP ? -EOPNOTSUPP : -1;
- /* tmpfs hands out shmem pages, which are not reclaimable without swap */
- if (fstatfs(fd, &stfs) || stfs.f_type == TMPFS_MAGIC) {
- close(fd);
- return -EOPNOTSUPP;
- }
- if (ftruncate(fd, size))
- goto err;
- for (off = 0; off < size; off += sizeof(buf))
- if (read(fd, buf, sizeof(buf)) < 0)
- goto err;
- return fd;
-err:
- close(fd);
- return -1;
-}
-
void serial_test_arena_memcg(void)
{
int cgroup_fd = -1, status, err;
--
2.56.0