[LTP] [PATCH] cgroup_core02: Requires cgroup2 mounted with nsdelegate
Petr Vorel
pvorel@suse.cz
Wed Jul 31 10:07:18 CEST 2024
Hi Edward, all,
Merged (with few changes below), thank you!
> If cgroup2 is not mounted with the nsdelegate option, this test will
> fail. It has been patched in kselftests, but has not been ported to LTP
> yet. This adds an additional tst_test configuration option,
> needs_cgroup_nsdelegate, to check for the mount option.
I mentioned also the kernel commit 4793cb599b1b ("selftests: cgroup: skip
test_cgcore_lesser_ns_open when cgroup2 mounted without nsdelegate")
> Link: https://lore.kernel.org/linux-kernel/Zg2xPtwFvT-lsSJX@slm.duckdns.org/T/
> Link: https://www.mail-archive.com/canonical-ubuntu-qa@lists.launchpad.net/msg02400.html
> Signed-off-by: Edward Liaw <edliaw@google.com>
...
> diff --git a/include/tst_test.h b/include/tst_test.h
> index 6c76f043d..af622e507 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;
New member also needs to be documented above:
*
* @needs_cgroup_nsdelegate: If set test the will run only if cgroup2 is mounted
* with nsdelegate option.
I added this before merge.
> };
> /**
> diff --git a/lib/tst_cgroup.c b/lib/tst_cgroup.c
> index f6afb51d6..b18efffed 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 @@ backref:
> 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,11 @@ void tst_cg_require(const char *const ctrl_name,
> mkdirs:
> root = ctrl->ctrl_root;
> +
> + if (options->needs_nsdelegate && cgroup_v2_mounted() &&
> + && !cgroup_v2_nsdelegate())
Double && broke the build, thus I fixed it (+ added inline for readability,
otherwise it'd be better to use { } when split on two lines).
Kind regards,
Petr
> + 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 e5bc5bf4d..b5aae20ab 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 1872a7dff..733e88ee7 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"},
More information about the ltp
mailing list