Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

selftests/bpf: cover BPF_CGROUP_ITER_CHILDREN control option

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>

authored by

Matt Bobrowski and committed by
Alexei Starovoitov
1456ebb2 752b8070

+25 -4
+12
tools/testing/selftests/bpf/prog_tests/cgroup_iter.c
··· 190 190 BPF_CGROUP_ITER_SELF_ONLY, "self_only"); 191 191 } 192 192 193 + static void test_walk_children(struct cgroup_iter *skel) 194 + { 195 + snprintf(expected_output, sizeof(expected_output), 196 + PROLOGUE "%8llu\n%8llu\n" EPILOGUE, cg_id[CHILD1], 197 + cg_id[CHILD2]); 198 + 199 + read_from_cgroup_iter(skel->progs.cgroup_id_printer, cg_fd[PARENT], 200 + BPF_CGROUP_ITER_CHILDREN, "children"); 201 + } 202 + 193 203 static void test_walk_dead_self_only(struct cgroup_iter *skel) 194 204 { 195 205 DECLARE_LIBBPF_OPTS(bpf_iter_attach_opts, opts); ··· 335 325 test_walk_dead_self_only(skel); 336 326 if (test__start_subtest("cgroup_iter__self_only_css_task")) 337 327 test_walk_self_only_css_task(); 328 + if (test__start_subtest("cgroup_iter__children")) 329 + test_walk_children(skel); 338 330 339 331 out: 340 332 cgroup_iter__destroy(skel);
+7 -1
tools/testing/selftests/bpf/prog_tests/iters.c
··· 253 253 { "/cg1/cg2" }, 254 254 { "/cg1/cg2/cg3" }, 255 255 { "/cg1/cg2/cg3/cg4" }, 256 + { "/cg1/cg5" }, 257 + { "/cg1/cg5/cg6" }, 258 + { "/cg1/cg7" }, 259 + { "/cg1/cg7/cg8" }, 260 + { "/cg1/cg7/cg8/cg9" }, 256 261 }; 257 262 int err, cg_nr = ARRAY_SIZE(cgs); 258 263 int i; ··· 289 284 290 285 ASSERT_EQ(skel->bss->post_order_cnt, cg_nr, "post_order_cnt"); 291 286 ASSERT_EQ(skel->bss->last_cg_id, get_cgroup_id(cgs[0].path), "last_cg_id"); 292 - ASSERT_EQ(skel->bss->tree_high, cg_nr - 1, "tree_high"); 287 + ASSERT_EQ(skel->bss->children_cnt, 3, "children_cnt"); 288 + ASSERT_EQ(skel->bss->tree_high, 3, "tree_high"); 293 289 iters_css__detach(skel); 294 290 cleanup: 295 291 cleanup_cgroup_environment();
+6 -3
tools/testing/selftests/bpf/progs/iters_css.c
··· 12 12 pid_t target_pid; 13 13 u64 root_cg_id, leaf_cg_id; 14 14 u64 first_cg_id, last_cg_id; 15 - 16 - int pre_order_cnt, post_order_cnt, tree_high; 15 + int pre_order_cnt, post_order_cnt, children_cnt, tree_high; 17 16 18 17 struct cgroup *bpf_cgroup_from_id(u64 cgid) __ksym; 19 18 void bpf_cgroup_release(struct cgroup *p) __ksym; ··· 42 43 } 43 44 root_css = &root_cgrp->self; 44 45 leaf_css = &leaf_cgrp->self; 45 - pre_order_cnt = post_order_cnt = tree_high = 0; 46 + pre_order_cnt = post_order_cnt = children_cnt = tree_high = 0; 46 47 first_cg_id = last_cg_id = 0; 47 48 48 49 bpf_rcu_read_lock(); ··· 57 58 pre_order_cnt++; 58 59 if (!first_cg_id) 59 60 first_cg_id = cur_cgrp->kn->id; 61 + } 62 + 63 + bpf_for_each(css, pos, root_css, BPF_CGROUP_ITER_CHILDREN) { 64 + children_cnt++; 60 65 } 61 66 62 67 bpf_for_each(css, pos, leaf_css, BPF_CGROUP_ITER_ANCESTORS_UP)