[LTP] [PATCH] cgroup_core02: Requires cgroup2 mounted with nsdelegate

Edward Liaw edliaw@google.com
Tue Jul 30 23:19:22 CEST 2024


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(+)

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"},
-- 
2.46.0.rc1.232.g9752f9e123-goog



More information about the ltp mailing list