[LTP] [PATCH] controllers/memcg: update regression tests to work under cgroup2

Luke Nowakowski-Krijger
2021-11-15T19:05:53Z

Some tests no longer make sense under cgroup2, while other tests just
needed to be updated to use new parameters introduced by the cgroup2
interface.

Signed-off-by: Luke Nowakowski-Krijger <luke.nowakowskikrijger@canonical.com>
---
.../memcg/regression/memcg_regression_test.sh | 41 ++++++++++++++++---
.../memcg/regression/memcg_test_1.c | 12 +++++-
.../memcg/regression/memcg_test_3.c | 8 ++++
.../memcg/regression/memcg_test_4.sh | 18 ++++++--
4 files changed, 68 insertions(+), 11 deletions(-)

diff --git a/testcases/kernel/controllers/memcg/regression/memcg_regression_test.sh b/testcases/kernel/controllers/memcg/regression/memcg_regression_test.sh
index c91a4069e..ad88d49d1 100755
--- a/testcases/kernel/controllers/memcg/regression/memcg_regression_test.sh
+++ b/testcases/kernel/controllers/memcg/regression/memcg_regression_test.sh
@@ -103,7 +103,12 @@ check_kernel_bug()
test_1()
{
mkdir memcg/0/
- echo 0 > memcg/0/memory.limit_in_bytes
+
+ if [ "$cgroup_ver" = "cgroup2" ]; then
+ echo 0 > memcg/0/memory.max
+ else
+ echo 0 > memcg/0/memory.limit_in_bytes
+ fi

./memcg_test_1

@@ -124,6 +129,16 @@ test_1()
#---------------------------------------------------------------------------
test_2()
{
+ # for cgroup2 the default behaivor is to check the new memory limit and
+ # then to start killing processes if oom. This test then doesen't
+ # make sense as we don't expect EBUSY to be returned. The shrink
+ # operation (write to memory.max in cgroup2) would kill the pid1 process
+ # and exit.
+ if [ "$cgroup_ver" = "cgroup2" ]; then
+ tst_resm TCONF "cgroup2 found, skipping test"
+ return
+ fi
+
./memcg_test_2 &
pid1=$!
sleep 1
@@ -177,12 +192,20 @@ test_2()
test_3()
{
mkdir memcg/0
- for pid in `cat memcg/tasks`; do
- echo $pid > memcg/0/tasks 2> /dev/null
+ if [ "$cgroup_ver" = "cgroup2" ]; then
+ memcg_procs=memcg/cgroup.procs
+ memcg_subprocs=memcg/0/cgroup.procs
+ else
+ memcg_procs=memcg/tasks
+ memcg_subprocs=memcg/0/tasks
+ fi
+
+ for pid in `cat $memcg_procs`; do
+ echo $pid > $memcg_subprocs 2> /dev/null
done

- for pid in `cat memcg/0/tasks`; do
- echo $pid > memcg/tasks 2> /dev/null
+ for pid in `cat $memcg_subprocs`; do
+ echo $pid > $memcg_procs 2> /dev/null
done
rmdir memcg/0

@@ -218,13 +241,19 @@ test_4()
}

# main
+cgroup_ver=$(grep "/sys/fs/cgroup" /proc/mounts | cut -d' ' -f1)
failed=0
mkdir memcg/

for cur in $(seq 1 $TST_TOTAL); do
export TST_COUNT=$cur

- mount -t cgroup -o memory xxx memcg/
+ if [ "$cgroup_ver" = "cgroup2" ]; then
+ mount -t cgroup2 xxx memcg/
+ else
+ mount -t cgroup -o memory xxx memcg/
+ fi
+
if [ $? -ne 0 ]; then
tst_resm TFAIL "failed to mount memory subsystem"
failed=1
diff --git a/testcases/kernel/controllers/memcg/regression/memcg_test_1.c b/testcases/kernel/controllers/memcg/regression/memcg_test_1.c
index c7fb948fe..b9277e633 100644
--- a/testcases/kernel/controllers/memcg/regression/memcg_test_1.c
+++ b/testcases/kernel/controllers/memcg/regression/memcg_test_1.c
@@ -33,6 +33,16 @@

#define FORKED_PROC_COUNT 10

+static int open_cgroup_procs(void)
+{
+ int fd = open("memcg/0/tasks", O_WRONLY);
+ if (fd >= 0)
+ return fd;
+
+ fd = open("memcg/0/cgroup.procs", O_WRONLY);
+ return fd;
+}
+
int main(void)
{
char buf[10];
@@ -40,7 +50,7 @@ int main(void)
int loop;
int pid;
int size = getpagesize();
- int fd = open("memcg/0/tasks", O_WRONLY);
+ int fd = open_cgroup_procs();

if (fd < 0)
return 1;
diff --git a/testcases/kernel/controllers/memcg/regression/memcg_test_3.c b/testcases/kernel/controllers/memcg/regression/memcg_test_3.c
index 75a6e1545..d5531fe87 100644
--- a/testcases/kernel/controllers/memcg/regression/memcg_test_3.c
+++ b/testcases/kernel/controllers/memcg/regression/memcg_test_3.c
@@ -66,6 +66,14 @@ static void setup(void)
SAFE_MKDIR(MNTPOINT, 0644);

ret = mount("memcg", MNTPOINT, "cgroup", 0, "memory");
+
+ if (!ret) {
+ mount_flag = 1;
+ return;
+ }
+
+ ret = mount("memcg", MNTPOINT, "cgroup2", 0, NULL);
+
if (ret) {
if (errno == ENOENT)
tst_brk(TCONF | TERRNO, "memcg not supported");
diff --git a/testcases/kernel/controllers/memcg/regression/memcg_test_4.sh b/testcases/kernel/controllers/memcg/regression/memcg_test_4.sh
index 620031366..287864b81 100755
--- a/testcases/kernel/controllers/memcg/regression/memcg_test_4.sh
+++ b/testcases/kernel/controllers/memcg/regression/memcg_test_4.sh
@@ -22,9 +22,19 @@
## ##
################################################################################

+cgroup_ver=$(grep "/sys/fs/cgroup" /proc/mounts | cut -d' ' -f1)
+
+if [ "$cgroup_ver" = 'cgroup2' ]; then
+ cgroup_proc=cgroup.procs
+ cgroup_mem_limit=memory.max
+else
+ cgroup_proc=tasks
+ cgroup_mem_limit=memory.limit_in_bytes
+fi
+
# attach current task to memcg/0/
mkdir memcg/0
-echo $$ > memcg/0/tasks
+echo $$ > memcg/0/${cgroup_proc}

./memcg_test_4 &
pid=$!
@@ -35,13 +45,13 @@ sleep 1
sleep 1

# shrink memory, and then 80M will be swapped
-echo 40M > memcg/0/memory.limit_in_bytes
+echo 40M > memcg/0/${cgroup_mem_limit}

# turn off swap, and swapoff will be killed
swapoff -a
sleep 1
-echo $pid > memcg/tasks 2> /dev/null
-echo $$ > memcg/tasks 2> /dev/null
+echo $pid > memcg/${cgroup_proc} 2> /dev/null
+echo $$ > memcg/${cgroup_proc} 2> /dev/null

# now remove the cgroup
rmdir memcg/0
--
2.32.0