]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
selftests/bpf: cover BPF_CGROUP_ITER_CHILDREN control option
authorMatt Bobrowski <mattbobrowski@google.com>
Tue, 27 Jan 2026 08:51:11 +0000 (08:51 +0000)
committerAlexei Starovoitov <ast@kernel.org>
Tue, 27 Jan 2026 17:06:03 +0000 (09:06 -0800)
Extend some of the existing CSS iterator selftests such that they
cover the newly introduced BPF_CGROUP_ITER_CHILDREN iterator control
option.

Signed-off-by: Matt Bobrowski <mattbobrowski@google.com>
Link: https://lore.kernel.org/r/20260127085112.3608687-2-mattbobrowski@google.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
tools/testing/selftests/bpf/prog_tests/cgroup_iter.c
tools/testing/selftests/bpf/prog_tests/iters.c
tools/testing/selftests/bpf/progs/iters_css.c

index 574d9a0cdc8e4a33c730bcb11a4136d60f718e86..0f88a9d00a22c7b2b7806b339f283c7488a249d7 100644 (file)
@@ -190,6 +190,16 @@ static void test_walk_self_only(struct cgroup_iter *skel)
                              BPF_CGROUP_ITER_SELF_ONLY, "self_only");
 }
 
+static void test_walk_children(struct cgroup_iter *skel)
+{
+       snprintf(expected_output, sizeof(expected_output),
+                PROLOGUE "%8llu\n%8llu\n" EPILOGUE, cg_id[CHILD1],
+                cg_id[CHILD2]);
+
+       read_from_cgroup_iter(skel->progs.cgroup_id_printer, cg_fd[PARENT],
+                             BPF_CGROUP_ITER_CHILDREN, "children");
+}
+
 static void test_walk_dead_self_only(struct cgroup_iter *skel)
 {
        DECLARE_LIBBPF_OPTS(bpf_iter_attach_opts, opts);
@@ -325,6 +335,8 @@ void test_cgroup_iter(void)
                test_walk_dead_self_only(skel);
        if (test__start_subtest("cgroup_iter__self_only_css_task"))
                test_walk_self_only_css_task();
+       if (test__start_subtest("cgroup_iter__children"))
+               test_walk_children(skel);
 
 out:
        cgroup_iter__destroy(skel);
index 3cea71f9c5001a6b98b92eea4c5ab76892075e15..a539980a2fbe5b7d0718ab37095c24481760dfde 100644 (file)
@@ -253,6 +253,11 @@ static void subtest_css_iters(void)
                { "/cg1/cg2" },
                { "/cg1/cg2/cg3" },
                { "/cg1/cg2/cg3/cg4" },
+               { "/cg1/cg5" },
+               { "/cg1/cg5/cg6" },
+               { "/cg1/cg7" },
+               { "/cg1/cg7/cg8" },
+               { "/cg1/cg7/cg8/cg9" },
        };
        int err, cg_nr = ARRAY_SIZE(cgs);
        int i;
@@ -284,7 +289,8 @@ static void subtest_css_iters(void)
 
        ASSERT_EQ(skel->bss->post_order_cnt, cg_nr, "post_order_cnt");
        ASSERT_EQ(skel->bss->last_cg_id, get_cgroup_id(cgs[0].path), "last_cg_id");
-       ASSERT_EQ(skel->bss->tree_high, cg_nr - 1, "tree_high");
+       ASSERT_EQ(skel->bss->children_cnt, 3, "children_cnt");
+       ASSERT_EQ(skel->bss->tree_high, 3, "tree_high");
        iters_css__detach(skel);
 cleanup:
        cleanup_cgroup_environment();
index ec1f6c2f590bec59ad2ef593b04a3a62d4e85895..5a1d87d186a99f94594c39d90480eb8cef4cbff4 100644 (file)
@@ -12,8 +12,7 @@ char _license[] SEC("license") = "GPL";
 pid_t target_pid;
 u64 root_cg_id, leaf_cg_id;
 u64 first_cg_id, last_cg_id;
-
-int pre_order_cnt, post_order_cnt, tree_high;
+int pre_order_cnt, post_order_cnt, children_cnt, tree_high;
 
 struct cgroup *bpf_cgroup_from_id(u64 cgid) __ksym;
 void bpf_cgroup_release(struct cgroup *p) __ksym;
@@ -43,7 +42,7 @@ int iter_css_for_each(const void *ctx)
        }
        root_css = &root_cgrp->self;
        leaf_css = &leaf_cgrp->self;
-       pre_order_cnt = post_order_cnt = tree_high = 0;
+       pre_order_cnt = post_order_cnt = children_cnt = tree_high = 0;
        first_cg_id = last_cg_id = 0;
 
        bpf_rcu_read_lock();
@@ -60,6 +59,10 @@ int iter_css_for_each(const void *ctx)
                        first_cg_id = cur_cgrp->kn->id;
        }
 
+       bpf_for_each(css, pos, root_css, BPF_CGROUP_ITER_CHILDREN) {
+               children_cnt++;
+       }
+
        bpf_for_each(css, pos, leaf_css, BPF_CGROUP_ITER_ANCESTORS_UP)
                tree_high++;