On 3/27/24 7:44 AM, Tianchen Ding wrote:
> The test case test_cgcore_lesser_ns_open only tasks effect when cgroup2
> is mounted with "nsdelegate" mount option. If it misses this option, or
> is remounted without "nsdelegate", the test case will fail. For example,
> running bpf/test_cgroup_storage first, and then run cgroup/test_core will
> fail on test_cgcore_lesser_ns_open. Skip it if "nsdelegate" is not
> detected in cgroup2 mount options.
> 
> Fixes: bf35a7879f1d ("selftests: cgroup: Test open-time cgroup namespace 
> usage for migration checks")
> Signed-off-by: Tianchen Ding <[email protected]>
Reviewed-by: Muhammad Usama Anjum <[email protected]>

> ---
>  tools/testing/selftests/cgroup/cgroup_util.c        | 8 +++++---
>  tools/testing/selftests/cgroup/cgroup_util.h        | 2 +-
>  tools/testing/selftests/cgroup/test_core.c          | 7 ++++++-
>  tools/testing/selftests/cgroup/test_cpu.c           | 2 +-
>  tools/testing/selftests/cgroup/test_cpuset.c        | 2 +-
>  tools/testing/selftests/cgroup/test_freezer.c       | 2 +-
>  tools/testing/selftests/cgroup/test_hugetlb_memcg.c | 2 +-
>  tools/testing/selftests/cgroup/test_kill.c          | 2 +-
>  tools/testing/selftests/cgroup/test_kmem.c          | 2 +-
>  tools/testing/selftests/cgroup/test_memcontrol.c    | 2 +-
>  tools/testing/selftests/cgroup/test_zswap.c         | 2 +-
>  11 files changed, 20 insertions(+), 13 deletions(-)
> 
> diff --git a/tools/testing/selftests/cgroup/cgroup_util.c 
> b/tools/testing/selftests/cgroup/cgroup_util.c
> index 0340d4ca8f51..432db923bced 100644
> --- a/tools/testing/selftests/cgroup/cgroup_util.c
> +++ b/tools/testing/selftests/cgroup/cgroup_util.c
> @@ -195,10 +195,10 @@ int cg_write_numeric(const char *cgroup, const char 
> *control, long value)
>       return cg_write(cgroup, control, buf);
>  }
>  
> -int cg_find_unified_root(char *root, size_t len)
> +int cg_find_unified_root(char *root, size_t len, bool *nsdelegate)
>  {
>       char buf[10 * PAGE_SIZE];
> -     char *fs, *mount, *type;
> +     char *fs, *mount, *type, *options;
>       const char delim[] = "\n\t ";
>  
>       if (read_text("/proc/self/mounts", buf, sizeof(buf)) <= 0)
> @@ -211,12 +211,14 @@ int cg_find_unified_root(char *root, size_t len)
>       for (fs = strtok(buf, delim); fs; fs = strtok(NULL, delim)) {
>               mount = strtok(NULL, delim);
>               type = strtok(NULL, delim);
> -             strtok(NULL, delim);
> +             options = strtok(NULL, delim);
>               strtok(NULL, delim);
>               strtok(NULL, delim);
>  
>               if (strcmp(type, "cgroup2") == 0) {
>                       strncpy(root, mount, len);
> +                     if (nsdelegate)
> +                             *nsdelegate = !!strstr(options, "nsdelegate");
>                       return 0;
>               }
>       }
> diff --git a/tools/testing/selftests/cgroup/cgroup_util.h 
> b/tools/testing/selftests/cgroup/cgroup_util.h
> index 1df7f202214a..89e8519fb271 100644
> --- a/tools/testing/selftests/cgroup/cgroup_util.h
> +++ b/tools/testing/selftests/cgroup/cgroup_util.h
> @@ -21,7 +21,7 @@ static inline int values_close(long a, long b, int err)
>       return abs(a - b) <= (a + b) / 100 * err;
>  }
>  
> -extern int cg_find_unified_root(char *root, size_t len);
> +extern int cg_find_unified_root(char *root, size_t len, bool *nsdelegate);
>  extern char *cg_name(const char *root, const char *name);
>  extern char *cg_name_indexed(const char *root, const char *name, int index);
>  extern char *cg_control(const char *cgroup, const char *control);
> diff --git a/tools/testing/selftests/cgroup/test_core.c 
> b/tools/testing/selftests/cgroup/test_core.c
> index 80aa6b2373b9..a5672a91d273 100644
> --- a/tools/testing/selftests/cgroup/test_core.c
> +++ b/tools/testing/selftests/cgroup/test_core.c
> @@ -18,6 +18,8 @@
>  #include "../kselftest.h"
>  #include "cgroup_util.h"
>  
> +static bool nsdelegate;
> +
>  static int touch_anon(char *buf, size_t size)
>  {
>       int fd;
> @@ -775,6 +777,9 @@ static int test_cgcore_lesser_ns_open(const char *root)
>       pid_t pid;
>       int status;
>  
> +     if (!nsdelegate)
> +             return KSFT_SKIP;
> +
>       cg_test_a = cg_name(root, "cg_test_a");
>       cg_test_b = cg_name(root, "cg_test_b");
>  
> @@ -862,7 +867,7 @@ int main(int argc, char *argv[])
>       char root[PATH_MAX];
>       int i, ret = EXIT_SUCCESS;
>  
> -     if (cg_find_unified_root(root, sizeof(root)))
> +     if (cg_find_unified_root(root, sizeof(root), &nsdelegate))
>               ksft_exit_skip("cgroup v2 isn't mounted\n");
>  
>       if (cg_read_strstr(root, "cgroup.subtree_control", "memory"))
> diff --git a/tools/testing/selftests/cgroup/test_cpu.c 
> b/tools/testing/selftests/cgroup/test_cpu.c
> index 24020a2c68dc..186bf96f6a28 100644
> --- a/tools/testing/selftests/cgroup/test_cpu.c
> +++ b/tools/testing/selftests/cgroup/test_cpu.c
> @@ -700,7 +700,7 @@ int main(int argc, char *argv[])
>       char root[PATH_MAX];
>       int i, ret = EXIT_SUCCESS;
>  
> -     if (cg_find_unified_root(root, sizeof(root)))
> +     if (cg_find_unified_root(root, sizeof(root), NULL))
>               ksft_exit_skip("cgroup v2 isn't mounted\n");
>  
>       if (cg_read_strstr(root, "cgroup.subtree_control", "cpu"))
> diff --git a/tools/testing/selftests/cgroup/test_cpuset.c 
> b/tools/testing/selftests/cgroup/test_cpuset.c
> index b061ed1e05b4..4034d14ba69a 100644
> --- a/tools/testing/selftests/cgroup/test_cpuset.c
> +++ b/tools/testing/selftests/cgroup/test_cpuset.c
> @@ -249,7 +249,7 @@ int main(int argc, char *argv[])
>       char root[PATH_MAX];
>       int i, ret = EXIT_SUCCESS;
>  
> -     if (cg_find_unified_root(root, sizeof(root)))
> +     if (cg_find_unified_root(root, sizeof(root), NULL))
>               ksft_exit_skip("cgroup v2 isn't mounted\n");
>  
>       if (cg_read_strstr(root, "cgroup.subtree_control", "cpuset"))
> diff --git a/tools/testing/selftests/cgroup/test_freezer.c 
> b/tools/testing/selftests/cgroup/test_freezer.c
> index 8845353aca53..8730645d363a 100644
> --- a/tools/testing/selftests/cgroup/test_freezer.c
> +++ b/tools/testing/selftests/cgroup/test_freezer.c
> @@ -827,7 +827,7 @@ int main(int argc, char *argv[])
>       char root[PATH_MAX];
>       int i, ret = EXIT_SUCCESS;
>  
> -     if (cg_find_unified_root(root, sizeof(root)))
> +     if (cg_find_unified_root(root, sizeof(root), NULL))
>               ksft_exit_skip("cgroup v2 isn't mounted\n");
>       for (i = 0; i < ARRAY_SIZE(tests); i++) {
>               switch (tests[i].fn(root)) {
> diff --git a/tools/testing/selftests/cgroup/test_hugetlb_memcg.c 
> b/tools/testing/selftests/cgroup/test_hugetlb_memcg.c
> index f0fefeb4cc24..856f9508ea56 100644
> --- a/tools/testing/selftests/cgroup/test_hugetlb_memcg.c
> +++ b/tools/testing/selftests/cgroup/test_hugetlb_memcg.c
> @@ -214,7 +214,7 @@ int main(int argc, char **argv)
>               return ret;
>       }
>  
> -     if (cg_find_unified_root(root, sizeof(root)))
> +     if (cg_find_unified_root(root, sizeof(root), NULL))
>               ksft_exit_skip("cgroup v2 isn't mounted\n");
>  
>       switch (test_hugetlb_memcg(root)) {
> diff --git a/tools/testing/selftests/cgroup/test_kill.c 
> b/tools/testing/selftests/cgroup/test_kill.c
> index 6153690319c9..0e5bb6c7307a 100644
> --- a/tools/testing/selftests/cgroup/test_kill.c
> +++ b/tools/testing/selftests/cgroup/test_kill.c
> @@ -276,7 +276,7 @@ int main(int argc, char *argv[])
>       char root[PATH_MAX];
>       int i, ret = EXIT_SUCCESS;
>  
> -     if (cg_find_unified_root(root, sizeof(root)))
> +     if (cg_find_unified_root(root, sizeof(root), NULL))
>               ksft_exit_skip("cgroup v2 isn't mounted\n");
>       for (i = 0; i < ARRAY_SIZE(tests); i++) {
>               switch (tests[i].fn(root)) {
> diff --git a/tools/testing/selftests/cgroup/test_kmem.c 
> b/tools/testing/selftests/cgroup/test_kmem.c
> index c82f974b85c9..137506db0312 100644
> --- a/tools/testing/selftests/cgroup/test_kmem.c
> +++ b/tools/testing/selftests/cgroup/test_kmem.c
> @@ -420,7 +420,7 @@ int main(int argc, char **argv)
>       char root[PATH_MAX];
>       int i, ret = EXIT_SUCCESS;
>  
> -     if (cg_find_unified_root(root, sizeof(root)))
> +     if (cg_find_unified_root(root, sizeof(root), NULL))
>               ksft_exit_skip("cgroup v2 isn't mounted\n");
>  
>       /*
> diff --git a/tools/testing/selftests/cgroup/test_memcontrol.c 
> b/tools/testing/selftests/cgroup/test_memcontrol.c
> index c7c9572003a8..b462416b3806 100644
> --- a/tools/testing/selftests/cgroup/test_memcontrol.c
> +++ b/tools/testing/selftests/cgroup/test_memcontrol.c
> @@ -1314,7 +1314,7 @@ int main(int argc, char **argv)
>       char root[PATH_MAX];
>       int i, proc_status, ret = EXIT_SUCCESS;
>  
> -     if (cg_find_unified_root(root, sizeof(root)))
> +     if (cg_find_unified_root(root, sizeof(root), NULL))
>               ksft_exit_skip("cgroup v2 isn't mounted\n");
>  
>       /*
> diff --git a/tools/testing/selftests/cgroup/test_zswap.c 
> b/tools/testing/selftests/cgroup/test_zswap.c
> index f0e488ed90d8..ef7f39545317 100644
> --- a/tools/testing/selftests/cgroup/test_zswap.c
> +++ b/tools/testing/selftests/cgroup/test_zswap.c
> @@ -440,7 +440,7 @@ int main(int argc, char **argv)
>       char root[PATH_MAX];
>       int i, ret = EXIT_SUCCESS;
>  
> -     if (cg_find_unified_root(root, sizeof(root)))
> +     if (cg_find_unified_root(root, sizeof(root), NULL))
>               ksft_exit_skip("cgroup v2 isn't mounted\n");
>  
>       if (!zswap_configured())

-- 
BR,
Muhammad Usama Anjum

Reply via email to