diff mbox series

cgroup_core02: Requires cgroup2 mounted with nsdelegate

Message ID 20240730211922.3648849-1-edliaw@google.com
State Accepted
Headers show
Series cgroup_core02: Requires cgroup2 mounted with nsdelegate | expand

Commit Message

Edward Liaw July 30, 2024, 9:19 p.m. UTC
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.

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>
---
 include/tst_cgroup.h                            |  1 +
 include/tst_test.h                              |  2 ++
 lib/tst_cgroup.c                                | 17 +++++++++++++++++
 lib/tst_test.c                                  |  1 +
 .../kernel/controllers/cgroup/cgroup_core02.c   |  1 +
 5 files changed, 22 insertions(+)

Comments

Petr Vorel July 31, 2024, 8:07 a.m. UTC | #1
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"},
diff mbox series

Patch

diff --git a/include/tst_cgroup.h b/include/tst_cgroup.h
index be14d07c6..d23a8e652 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 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;
 };
 
 /**
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())
+		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"},