This commit adds tests for some of the core functionalities
of cgroups v2.
The commit adds tests for some core principles of croup V2 API:
- test_cgcore_internal_process_constraint
Tests internal process constraint.
You can't add a pid to a domain parent if a controller is enabled.
- test_cgcore_top_down_constraint_enable
Tests that you can't enable a controller on a child if it's not enabled
on the parent.
- test_cgcore_top_down_constraint_disable
Tests that you can't disable a controller on a parent if it's
enabled in a child.
- test_cgcore_no_internal_process_constraint_on_threads
Tests that there's no internal process constrain on threaded cgroups.
You can add threads/processes on a parent with a controller enabled.
- test_cgcore_parent_becomes_threaded
Tests that when a child becomes threaded the parent type becomes
domain threaded.
- test_cgcore_invalid_domain
In a situation like:
A (domain threaded) - B (threaded) - C (domain)
it tests that C can't be used until it is turned into a threaded cgroup.
The "cgroup.type" file will report "domain (invalid)" in these cases.
Operations which fail due to invalid topology use EOPNOTSUPP as the errno.
- test_cgcore_populated
In a situation like:
A(0) - B(0) - C(1)
\ D(0)
It tests that A, B and C's "populated" fields would be 1 while D's 0.
It tests that after the one process in C is moved to root, A,B and C's
"populated" fields would flip to "0" and file modified events will
be generated on the "cgroup.events" files of both cgroups.
Signed-off-by: Claudio Zumbo <claudioz@fb.com>
Cc: Shuah Khan <shuah@kernel.org>
Cc: Roman Gushchin <guro@fb.com>
Cc: Tejun Heo <tj@kernel.org>
Cc: kernel-team@fb.com
Acked-by: Tejun Heo <tj@kernel.org>
Reviewed-by: Roman Gushchin <guro@fb.com>
Signed-off-by: Shuah Khan (Samsung OSG) <shuah@kernel.org>
43 lines
1.5 KiB
C
43 lines
1.5 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#include <stdlib.h>
|
|
|
|
#define PAGE_SIZE 4096
|
|
|
|
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
|
|
|
|
#define MB(x) (x << 20)
|
|
|
|
/*
|
|
* Checks if two given values differ by less than err% of their sum.
|
|
*/
|
|
static inline int values_close(long a, long b, int err)
|
|
{
|
|
return abs(a - b) <= (a + b) / 100 * err;
|
|
}
|
|
|
|
extern int cg_find_unified_root(char *root, size_t len);
|
|
extern char *cg_name(const char *root, const char *name);
|
|
extern char *cg_name_indexed(const char *root, const char *name, int index);
|
|
extern int cg_create(const char *cgroup);
|
|
extern int cg_destroy(const char *cgroup);
|
|
extern int cg_read(const char *cgroup, const char *control,
|
|
char *buf, size_t len);
|
|
extern int cg_read_strcmp(const char *cgroup, const char *control,
|
|
const char *expected);
|
|
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);
|
|
long cg_read_key_long(const char *cgroup, const char *control, const char *key);
|
|
extern int cg_write(const char *cgroup, const char *control, char *buf);
|
|
extern int cg_run(const char *cgroup,
|
|
int (*fn)(const char *cgroup, void *arg),
|
|
void *arg);
|
|
extern int cg_enter_current(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);
|