[PATCH v2 12/12] selftests: cgroup: Add functional tests for dynamic housekeeping

From: Qiliang Yuan

Date: Mon Apr 13 2026 - 03:52:05 EST


This extends the cgroup v2 testing framework in selftests to validate the
newly added Dynamic Housekeeping Management (DHM) cpuset interface:
`cpuset.housekeeping.cpus` and `cpuset.housekeeping.smt_aware`.

The `test_cpuset_housekeeping` functional test verifies:
- Validation of DHM's SMT safety guard (`cpuset.housekeeping.smt_aware`)
by ensuring writing to it behaves as expected.
- Basic read and write capabilities of `cpuset.housekeeping.cpus` using
the base CPU mask.

If the DHM functionality is not present in the kernel, the selftest skips gracefully.

Signed-off-by: Qiliang Yuan <realwujing@xxxxxxxxx>
---
tools/testing/selftests/cgroup/test_cpuset.c | 36 ++++++++++++++++++++++++++++
1 file changed, 36 insertions(+)

diff --git a/tools/testing/selftests/cgroup/test_cpuset.c b/tools/testing/selftests/cgroup/test_cpuset.c
index c5cf8b56ceb8f..b2a032be4407a 100644
--- a/tools/testing/selftests/cgroup/test_cpuset.c
+++ b/tools/testing/selftests/cgroup/test_cpuset.c
@@ -232,6 +232,41 @@ static int test_cpuset_perms_subtree(const char *root)
return ret;
}

+static int test_cpuset_housekeeping(const char *root)
+{
+ char buf[PAGE_SIZE];
+ int ret = KSFT_FAIL;
+
+ /* If the kernel doesn't have DHM patch, skip */
+ if (cg_read(root, "cpuset.housekeeping.cpus", buf, sizeof(buf)))
+ return KSFT_SKIP;
+
+ /* Test writing 1 and 0 to smt_aware */
+ if (cg_write(root, "cpuset.housekeeping.smt_aware", "1"))
+ goto cleanup;
+
+ if (cg_read_strstr(root, "cpuset.housekeeping.smt_aware", "1"))
+ goto cleanup;
+
+ if (cg_write(root, "cpuset.housekeeping.smt_aware", "0"))
+ goto cleanup;
+
+ if (cg_read_strstr(root, "cpuset.housekeeping.smt_aware", "0"))
+ goto cleanup;
+
+ /* Read root cpuset.cpus.effective */
+ if (cg_read(root, "cpuset.cpus.effective", buf, sizeof(buf)))
+ goto cleanup;
+
+ /* Write it back to housekeeping.cpus */
+ if (cg_write(root, "cpuset.housekeeping.cpus", buf))
+ goto cleanup;
+
+ ret = KSFT_PASS;
+
+cleanup:
+ return ret;
+}

#define T(x) { x, #x }
struct cpuset_test {
@@ -241,6 +276,7 @@ struct cpuset_test {
T(test_cpuset_perms_object_allow),
T(test_cpuset_perms_object_deny),
T(test_cpuset_perms_subtree),
+ T(test_cpuset_housekeeping),
};
#undef T


--
2.43.0