This comes useful when using selftests from mainline on older
kernels/setups that still rely on cgroup v1.
The core tests that rely on v2 specific features are skipped, the
remaining ones are adjusted to work with a v1 hierarchy.

The expected output on v1 system:
        ok 1 # SKIP test_cgcore_internal_process_constraint
        ok 2 # SKIP test_cgcore_top_down_constraint_enable
        ok 3 # SKIP test_cgcore_top_down_constraint_disable
        ok 4 # SKIP test_cgcore_no_internal_process_constraint_on_threads
        ok 5 # SKIP test_cgcore_parent_becomes_threaded
        ok 6 # SKIP test_cgcore_invalid_domain
        ok 7 # SKIP test_cgcore_populated
        ok 8 test_cgcore_proc_migration
        ok 9 test_cgcore_thread_migration
        ok 10 test_cgcore_destroy
        ok 11 test_cgcore_lesser_euid_open
        ok 12 # SKIP test_cgcore_lesser_ns_open

Signed-off-by: Michal Koutný <[email protected]>
---
 tools/testing/selftests/cgroup/test_core.c | 31 ++++++++++++++++++----
 1 file changed, 26 insertions(+), 5 deletions(-)

diff --git a/tools/testing/selftests/cgroup/test_core.c 
b/tools/testing/selftests/cgroup/test_core.c
index 0c4cc4e5fc8c2..338e276aae5da 100644
--- a/tools/testing/selftests/cgroup/test_core.c
+++ b/tools/testing/selftests/cgroup/test_core.c
@@ -148,6 +148,9 @@ static int test_cgcore_populated(const char *root)
        int cgroup_fd = -EBADF;
        pid_t pid;
 
+       if (cg_test_v1_named)
+               return KSFT_SKIP;
+
        cg_test_a = cg_name(root, "cg_test_a");
        cg_test_b = cg_name(root, "cg_test_a/cg_test_b");
        cg_test_c = cg_name(root, "cg_test_a/cg_test_b/cg_test_c");
@@ -277,6 +280,9 @@ static int test_cgcore_invalid_domain(const char *root)
        int ret = KSFT_FAIL;
        char *grandparent = NULL, *parent = NULL, *child = NULL;
 
+       if (cg_test_v1_named)
+               return KSFT_SKIP;
+
        grandparent = cg_name(root, "cg_test_grandparent");
        parent = cg_name(root, "cg_test_grandparent/cg_test_parent");
        child = cg_name(root, 
"cg_test_grandparent/cg_test_parent/cg_test_child");
@@ -339,6 +345,9 @@ static int test_cgcore_parent_becomes_threaded(const char 
*root)
        int ret = KSFT_FAIL;
        char *parent = NULL, *child = NULL;
 
+       if (cg_test_v1_named)
+               return KSFT_SKIP;
+
        parent = cg_name(root, "cg_test_parent");
        child = cg_name(root, "cg_test_parent/cg_test_child");
        if (!parent || !child)
@@ -378,7 +387,8 @@ static int 
test_cgcore_no_internal_process_constraint_on_threads(const char *roo
        int ret = KSFT_FAIL;
        char *parent = NULL, *child = NULL;
 
-       if (cg_read_strstr(root, "cgroup.controllers", "cpu") ||
+       if (cg_test_v1_named ||
+           cg_read_strstr(root, "cgroup.controllers", "cpu") ||
            cg_write(root, "cgroup.subtree_control", "+cpu")) {
                ret = KSFT_SKIP;
                goto cleanup;
@@ -430,6 +440,9 @@ static int test_cgcore_top_down_constraint_enable(const 
char *root)
        int ret = KSFT_FAIL;
        char *parent = NULL, *child = NULL;
 
+       if (cg_test_v1_named)
+               return KSFT_SKIP;
+
        parent = cg_name(root, "cg_test_parent");
        child = cg_name(root, "cg_test_parent/cg_test_child");
        if (!parent || !child)
@@ -465,6 +478,9 @@ static int test_cgcore_top_down_constraint_disable(const 
char *root)
        int ret = KSFT_FAIL;
        char *parent = NULL, *child = NULL;
 
+       if (cg_test_v1_named)
+               return KSFT_SKIP;
+
        parent = cg_name(root, "cg_test_parent");
        child = cg_name(root, "cg_test_parent/cg_test_child");
        if (!parent || !child)
@@ -506,6 +522,9 @@ static int test_cgcore_internal_process_constraint(const 
char *root)
        int ret = KSFT_FAIL;
        char *parent = NULL, *child = NULL;
 
+       if (cg_test_v1_named)
+               return KSFT_SKIP;
+
        parent = cg_name(root, "cg_test_parent");
        child = cg_name(root, "cg_test_parent/cg_test_child");
        if (!parent || !child)
@@ -642,10 +661,12 @@ static int test_cgcore_thread_migration(const char *root)
        if (cg_create(grps[2]))
                goto cleanup;
 
-       if (cg_write(grps[1], "cgroup.type", "threaded"))
-               goto cleanup;
-       if (cg_write(grps[2], "cgroup.type", "threaded"))
-               goto cleanup;
+       if (!cg_test_v1_named) {
+               if (cg_write(grps[1], "cgroup.type", "threaded"))
+                       goto cleanup;
+               if (cg_write(grps[2], "cgroup.type", "threaded"))
+                       goto cleanup;
+       }
 
        if (cg_enter_current(grps[1]))
                goto cleanup;
-- 
2.49.0


Reply via email to