From 4db8234c37369146cc00423b6892b3827472c82a Mon Sep 17 00:00:00 2001 From: Edward Liaw Date: Tue, 30 Jul 2024 21:19:22 +0000 Subject: [PATCH] cgroup_core02: Requires cgroup2 mounted with nsdelegate If cgroup2 is not mounted with the nsdelegate option, this test will fail. It has been patched in kernel kselftests commit 4793cb599b1b ("selftests: cgroup: skip test_cgcore_lesser_ns_open when cgroup2 mounted without nsdelegate"), therefore port it to LTP as well. This adds an additional tst_test configuration option, needs_cgroup_nsdelegate, to check for the mount option. Link: https://lore.kernel.org/linux-kernel/20240327024437.3196-1-dtcccc@linux.alibaba.com/ Link: https://www.mail-archive.com/canonical-ubuntu-qa@lists.launchpad.net/msg02400.html Link: https://lore.kernel.org/ltp/20240730211922.3648849-1-edliaw@google.com/ Reviewed-by: Petr Vorel Signed-off-by: Edward Liaw Signed-off-by: Petr Vorel --- include/tst_cgroup.h | 1 + include/tst_test.h | 2 ++ lib/tst_cgroup.c | 16 ++++++++++++++++ lib/tst_test.c | 1 + .../kernel/controllers/cgroup/cgroup_core02.c | 1 + 5 files changed, 21 insertions(+) diff --git a/include/tst_cgroup.h b/include/tst_cgroup.h index be14d07c680..d23a8e652bc 100644 --- a/include/tst_cgroup.h +++ b/include/tst_cgroup.h @@ -104,6 +104,7 @@ struct tst_cg_opts { * directory as opposed to the default pid of the calling process. */ int test_pid; + int needs_nsdelegate; }; /* A Control Group in LTP's aggregated hierarchy */ diff --git a/include/tst_test.h b/include/tst_test.h index 6c76f043d3a..af622e50702 100644 --- a/include/tst_test.h +++ b/include/tst_test.h @@ -578,6 +578,8 @@ struct tst_fs { const enum tst_cg_ver needs_cgroup_ver; const char *const *needs_cgroup_ctrls; + + int needs_cgroup_nsdelegate:1; }; /** diff --git a/lib/tst_cgroup.c b/lib/tst_cgroup.c index f6afb51d664..6055015eb52 100644 --- a/lib/tst_cgroup.c +++ b/lib/tst_cgroup.c @@ -71,6 +71,8 @@ struct cgroup_root { /* CGroup for current test. Which may have children. */ struct cgroup_dir test_dir; + int nsdelegate:1; + int we_mounted_it:1; /* cpuset is in compatability mode */ int no_cpuset_prefix:1; @@ -344,6 +346,11 @@ static int cgroup_v1_mounted(void) return !!roots[1].ver; } +static int cgroup_v2_nsdelegate(void) +{ + return !!roots[0].nsdelegate; +} + static int cgroup_mounted(void) { return cgroup_v2_mounted() || cgroup_v1_mounted(); @@ -568,6 +575,7 @@ static void cgroup_root_scan(const char *const mnt_type, struct cgroup_ctrl *ctrl; uint32_t ctrl_field = 0; int no_prefix = 0; + int nsdelegate = 0; char buf[BUFSIZ]; char *tok; const int mnt_dfd = SAFE_OPEN(mnt_dir, O_PATH | O_DIRECTORY); @@ -582,6 +590,9 @@ static void cgroup_root_scan(const char *const mnt_type, if (const_ctrl) add_ctrl(&ctrl_field, const_ctrl); } + for (tok = strtok(mnt_opts, ","); tok; tok = strtok(NULL, ",")) { + nsdelegate |= !strcmp("nsdelegate", tok); + } if (root->ver && ctrl_field == root->ctrl_field) goto discard; @@ -632,6 +643,7 @@ static void cgroup_root_scan(const char *const mnt_type, root->mnt_dir.dir_fd = mnt_dfd; root->ctrl_field = ctrl_field; root->no_cpuset_prefix = no_prefix; + root->nsdelegate = nsdelegate; for_each_ctrl(ctrl) { if (has_ctrl(root->ctrl_field, ctrl)) @@ -869,6 +881,10 @@ void tst_cg_require(const char *const ctrl_name, mkdirs: root = ctrl->ctrl_root; + + if (options->needs_nsdelegate && cgroup_v2_mounted() && !cgroup_v2_nsdelegate()) + tst_brk(TCONF, "Requires cgroup2 to be mounted with nsdelegate"); + add_ctrl(&root->mnt_dir.ctrl_field, ctrl); if (cgroup_ctrl_on_v2(ctrl) && options->needs_ver == TST_CG_V1) { diff --git a/lib/tst_test.c b/lib/tst_test.c index e5bc5bf4da1..b5aae20ab72 100644 --- a/lib/tst_test.c +++ b/lib/tst_test.c @@ -1130,6 +1130,7 @@ static void do_cgroup_requires(void) { const struct tst_cg_opts cg_opts = { .needs_ver = tst_test->needs_cgroup_ver, + .needs_nsdelegate = tst_test->needs_cgroup_nsdelegate, }; const char *const *ctrl_names = tst_test->needs_cgroup_ctrls; diff --git a/testcases/kernel/controllers/cgroup/cgroup_core02.c b/testcases/kernel/controllers/cgroup/cgroup_core02.c index 1872a7dff45..733e88ee74d 100644 --- a/testcases/kernel/controllers/cgroup/cgroup_core02.c +++ b/testcases/kernel/controllers/cgroup/cgroup_core02.c @@ -121,6 +121,7 @@ static struct tst_test test = { .needs_root = 1, .needs_cgroup_ctrls = (const char *const[]){"memory", NULL}, .needs_cgroup_ver = TST_CG_V2, + .needs_cgroup_nsdelegate = 1, .tags = (const struct tst_tag[]) { {"linux-git", "e57457641613"}, {"CVE", "2021-4197"},