[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