Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftests/bpf: Run cgroup1_hierarchy test in own mount namespace

The cgroup1_hierarchy test uses setup_classid_environment to setup
cgroupv1 environment. The problem is that the environment is set in
/sys/fs/cgroup and therefore, if not run under an own mount namespace,
effectively deletes all system cgroups:

$ ls /sys/fs/cgroup | wc -l
27
$ sudo ./test_progs -t cgroup1_hierarchy
#41/1 cgroup1_hierarchy/test_cgroup1_hierarchy:OK
#41/2 cgroup1_hierarchy/test_root_cgid:OK
#41/3 cgroup1_hierarchy/test_invalid_level:OK
#41/4 cgroup1_hierarchy/test_invalid_cgid:OK
#41/5 cgroup1_hierarchy/test_invalid_hid:OK
#41/6 cgroup1_hierarchy/test_invalid_cgrp_name:OK
#41/7 cgroup1_hierarchy/test_invalid_cgrp_name2:OK
#41/8 cgroup1_hierarchy/test_sleepable_prog:OK
#41 cgroup1_hierarchy:OK
Summary: 1/8 PASSED, 0 SKIPPED, 0 FAILED
$ ls /sys/fs/cgroup | wc -l
1

To avoid this, run setup_cgroup_environment first which will create an
own mount namespace. This only affects the cgroupv1_hierarchy test as
all other cgroup1 test progs already run setup_cgroup_environment prior
to running setup_classid_environment.

Also add a comment to the header of setup_classid_environment to warn
against this invalid usage in future.

Fixes: 360769233cc9 ("selftests/bpf: Add selftests for cgroup1 hierarchy")
Signed-off-by: Viktor Malik <vmalik@redhat.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/20240429112311.402497-1-vmalik@redhat.com

authored by

Viktor Malik and committed by
Andrii Nakryiko
19468ed5 a3034872

+9 -1
+3
tools/testing/selftests/bpf/cgroup_helpers.c
··· 508 508 /** 509 509 * setup_classid_environment() - Setup the cgroupv1 net_cls environment 510 510 * 511 + * This function should only be called in a custom mount namespace, e.g. 512 + * created by running setup_cgroup_environment. 513 + * 511 514 * After calling this function, cleanup_classid_environment should be called 512 515 * once testing is complete. 513 516 *
+6 -1
tools/testing/selftests/bpf/prog_tests/cgroup1_hierarchy.c
··· 87 87 goto destroy; 88 88 89 89 /* Setup cgroup1 hierarchy */ 90 + err = setup_cgroup_environment(); 91 + if (!ASSERT_OK(err, "setup_cgroup_environment")) 92 + goto destroy; 90 93 err = setup_classid_environment(); 91 94 if (!ASSERT_OK(err, "setup_classid_environment")) 92 - goto destroy; 95 + goto cleanup_cgroup; 93 96 94 97 err = join_classid(); 95 98 if (!ASSERT_OK(err, "join_cgroup1")) ··· 156 153 157 154 cleanup: 158 155 cleanup_classid_environment(); 156 + cleanup_cgroup: 157 + cleanup_cgroup_environment(); 159 158 destroy: 160 159 test_cgroup1_hierarchy__destroy(skel); 161 160 }