mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-08 05:43:28 -04:00
cgroup: selftests: Move memcontrol specific helpers out of common cgroup_util.c
Move a handful of helpers out of cgroup_util.c and into test_memcontrol.c that have nothing to with cgroups in general, in anticipation of making cgroup_util.c a generic library that can be used by other selftests. Make read_text() and write_text() non-static so test_memcontrol.c can use them. Signed-off-by: James Houghton <jthoughton@google.com> Acked-by: Michal Koutný <mkoutny@suse.com> Link: https://lore.kernel.org/r/20250508184649.2576210-4-jthoughton@google.com Signed-off-by: Sean Christopherson <seanjc@google.com>
This commit is contained in:
@@ -20,7 +20,7 @@
|
||||
#include "../clone3/clone3_selftests.h"
|
||||
|
||||
/* Returns read len on success, or -errno on failure. */
|
||||
static ssize_t read_text(const char *path, char *buf, size_t max_len)
|
||||
ssize_t read_text(const char *path, char *buf, size_t max_len)
|
||||
{
|
||||
ssize_t len;
|
||||
int fd;
|
||||
@@ -39,7 +39,7 @@ static ssize_t read_text(const char *path, char *buf, size_t max_len)
|
||||
}
|
||||
|
||||
/* Returns written len on success, or -errno on failure. */
|
||||
static ssize_t write_text(const char *path, char *buf, ssize_t len)
|
||||
ssize_t write_text(const char *path, char *buf, ssize_t len)
|
||||
{
|
||||
int fd;
|
||||
|
||||
@@ -488,84 +488,6 @@ int cg_run_nowait(const char *cgroup,
|
||||
return pid;
|
||||
}
|
||||
|
||||
int get_temp_fd(void)
|
||||
{
|
||||
return open(".", O_TMPFILE | O_RDWR | O_EXCL);
|
||||
}
|
||||
|
||||
int alloc_pagecache(int fd, size_t size)
|
||||
{
|
||||
char buf[PAGE_SIZE];
|
||||
struct stat st;
|
||||
int i;
|
||||
|
||||
if (fstat(fd, &st))
|
||||
goto cleanup;
|
||||
|
||||
size += st.st_size;
|
||||
|
||||
if (ftruncate(fd, size))
|
||||
goto cleanup;
|
||||
|
||||
for (i = 0; i < size; i += sizeof(buf))
|
||||
read(fd, buf, sizeof(buf));
|
||||
|
||||
return 0;
|
||||
|
||||
cleanup:
|
||||
return -1;
|
||||
}
|
||||
|
||||
int alloc_anon(const char *cgroup, void *arg)
|
||||
{
|
||||
size_t size = (unsigned long)arg;
|
||||
char *buf, *ptr;
|
||||
|
||||
buf = malloc(size);
|
||||
for (ptr = buf; ptr < buf + size; ptr += PAGE_SIZE)
|
||||
*ptr = 0;
|
||||
|
||||
free(buf);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int is_swap_enabled(void)
|
||||
{
|
||||
char buf[PAGE_SIZE];
|
||||
const char delim[] = "\n";
|
||||
int cnt = 0;
|
||||
char *line;
|
||||
|
||||
if (read_text("/proc/swaps", buf, sizeof(buf)) <= 0)
|
||||
return -1;
|
||||
|
||||
for (line = strtok(buf, delim); line; line = strtok(NULL, delim))
|
||||
cnt++;
|
||||
|
||||
return cnt > 1;
|
||||
}
|
||||
|
||||
int set_oom_adj_score(int pid, int score)
|
||||
{
|
||||
char path[PATH_MAX];
|
||||
int fd, len;
|
||||
|
||||
sprintf(path, "/proc/%d/oom_score_adj", pid);
|
||||
|
||||
fd = open(path, O_WRONLY | O_APPEND);
|
||||
if (fd < 0)
|
||||
return fd;
|
||||
|
||||
len = dprintf(fd, "%d", score);
|
||||
if (len < 0) {
|
||||
close(fd);
|
||||
return len;
|
||||
}
|
||||
|
||||
close(fd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int proc_mount_contains(const char *option)
|
||||
{
|
||||
char buf[4 * PAGE_SIZE];
|
||||
|
||||
@@ -21,6 +21,9 @@ static inline int values_close(long a, long b, int err)
|
||||
return labs(a - b) <= (a + b) / 100 * err;
|
||||
}
|
||||
|
||||
extern ssize_t read_text(const char *path, char *buf, size_t max_len);
|
||||
extern ssize_t write_text(const char *path, char *buf, ssize_t len);
|
||||
|
||||
extern int cg_find_unified_root(char *root, size_t len, bool *nsdelegate);
|
||||
extern char *cg_name(const char *root, const char *name);
|
||||
extern char *cg_name_indexed(const char *root, const char *name, int index);
|
||||
@@ -49,11 +52,6 @@ extern int cg_enter_current_thread(const char *cgroup);
|
||||
extern int cg_run_nowait(const char *cgroup,
|
||||
int (*fn)(const char *cgroup, void *arg),
|
||||
void *arg);
|
||||
extern int get_temp_fd(void);
|
||||
extern int alloc_pagecache(int fd, size_t size);
|
||||
extern int alloc_anon(const char *cgroup, void *arg);
|
||||
extern int is_swap_enabled(void);
|
||||
extern int set_oom_adj_score(int pid, int score);
|
||||
extern int cg_wait_for_proc_count(const char *cgroup, int count);
|
||||
extern int cg_killall(const char *cgroup);
|
||||
int proc_mount_contains(const char *option);
|
||||
|
||||
@@ -24,6 +24,84 @@
|
||||
static bool has_localevents;
|
||||
static bool has_recursiveprot;
|
||||
|
||||
int get_temp_fd(void)
|
||||
{
|
||||
return open(".", O_TMPFILE | O_RDWR | O_EXCL);
|
||||
}
|
||||
|
||||
int alloc_pagecache(int fd, size_t size)
|
||||
{
|
||||
char buf[PAGE_SIZE];
|
||||
struct stat st;
|
||||
int i;
|
||||
|
||||
if (fstat(fd, &st))
|
||||
goto cleanup;
|
||||
|
||||
size += st.st_size;
|
||||
|
||||
if (ftruncate(fd, size))
|
||||
goto cleanup;
|
||||
|
||||
for (i = 0; i < size; i += sizeof(buf))
|
||||
read(fd, buf, sizeof(buf));
|
||||
|
||||
return 0;
|
||||
|
||||
cleanup:
|
||||
return -1;
|
||||
}
|
||||
|
||||
int alloc_anon(const char *cgroup, void *arg)
|
||||
{
|
||||
size_t size = (unsigned long)arg;
|
||||
char *buf, *ptr;
|
||||
|
||||
buf = malloc(size);
|
||||
for (ptr = buf; ptr < buf + size; ptr += PAGE_SIZE)
|
||||
*ptr = 0;
|
||||
|
||||
free(buf);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int is_swap_enabled(void)
|
||||
{
|
||||
char buf[PAGE_SIZE];
|
||||
const char delim[] = "\n";
|
||||
int cnt = 0;
|
||||
char *line;
|
||||
|
||||
if (read_text("/proc/swaps", buf, sizeof(buf)) <= 0)
|
||||
return -1;
|
||||
|
||||
for (line = strtok(buf, delim); line; line = strtok(NULL, delim))
|
||||
cnt++;
|
||||
|
||||
return cnt > 1;
|
||||
}
|
||||
|
||||
int set_oom_adj_score(int pid, int score)
|
||||
{
|
||||
char path[PATH_MAX];
|
||||
int fd, len;
|
||||
|
||||
sprintf(path, "/proc/%d/oom_score_adj", pid);
|
||||
|
||||
fd = open(path, O_WRONLY | O_APPEND);
|
||||
if (fd < 0)
|
||||
return fd;
|
||||
|
||||
len = dprintf(fd, "%d", score);
|
||||
if (len < 0) {
|
||||
close(fd);
|
||||
return len;
|
||||
}
|
||||
|
||||
close(fd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* This test creates two nested cgroups with and without enabling
|
||||
* the memory controller.
|
||||
|
||||
Reference in New Issue
Block a user