> diff --git a/tools/testing/selftests/bpf/prog_tests/cgroup_mprog_opts.c > b/tools/testing/selftests/bpf/prog_tests/cgroup_mprog_opts.c > index bb60704a3ef92..343357d9c460e 100644 > --- a/tools/testing/selftests/bpf/prog_tests/cgroup_mprog_opts.c > +++ b/tools/testing/selftests/bpf/prog_tests/cgroup_mprog_opts.c
[ ... ] > @@ -357,6 +380,34 @@ static void test_preorder_prog_attach_detach(int atype) > > assert_mprog_count(cg, atype, 4); > > + optq.prog_ids = prog_ids; > + optq.prog_attach_flags = prog_attach_flags; > + optq.count = 10; > + err = bpf_prog_query_opts(cg, atype, &optq); > + if (!ASSERT_OK(err, "prog_query")) > + goto cleanup4; > + > + ASSERT_EQ(optq.count, 4, "count"); > + /* Direct query reports attached programs in cgroup list order. > + * Lookup by prog_id to verify per-program flags independently of slot > index. > + */ > + err = find_prog_attach_flags(&optq, id1, &flags); > + if (ASSERT_OK(err, "find id1")) > + ASSERT_EQ(flags, BPF_F_ALLOW_MULTI, "flags id1"); > + > + err = find_prog_attach_flags(&optq, id2, &flags); > + if (ASSERT_OK(err, "find id2")) > + ASSERT_EQ(flags, BPF_F_ALLOW_MULTI | BPF_F_PREORDER, "flags > id2"); > + > + err = find_prog_attach_flags(&optq, id3, &flags); > + if (ASSERT_OK(err, "find id3")) > + ASSERT_EQ(flags, BPF_F_ALLOW_MULTI | BPF_F_PREORDER, "flags > id3"); > + > + err = find_prog_attach_flags(&optq, id4, &flags); > + if (ASSERT_OK(err, "find id4")) > + ASSERT_EQ(flags, BPF_F_ALLOW_MULTI, "flags id4"); > + > +cleanup4: > err = bpf_prog_detach_opts(fd4, cg, atype, &optd); [ ... ] > @@ -460,6 +520,34 @@ static void test_preorder_link_attach_detach(int atype) > > assert_mprog_count(cg, atype, 4); > > + optq.prog_ids = prog_ids; > + optq.prog_attach_flags = prog_attach_flags; > + optq.count = 10; > + err = bpf_prog_query_opts(cg, atype, &optq); > + if (!ASSERT_OK(err, "prog_query")) > + goto cleanup4; > + > + ASSERT_EQ(optq.count, 4, "count"); > + /* Direct query reports attached programs in cgroup list order. > + * Lookup by prog_id to verify per-program flags independently of slot > index. > + */ > + err = find_prog_attach_flags(&optq, id1, &flags); > + if (ASSERT_OK(err, "find id1")) > + ASSERT_EQ(flags, BPF_F_ALLOW_MULTI, "flags id1"); > + > + err = find_prog_attach_flags(&optq, id2, &flags); > + if (ASSERT_OK(err, "find id2")) > + ASSERT_EQ(flags, BPF_F_ALLOW_MULTI | BPF_F_PREORDER, "flags > id2"); > + > + err = find_prog_attach_flags(&optq, id3, &flags); > + if (ASSERT_OK(err, "find id3")) > + ASSERT_EQ(flags, BPF_F_ALLOW_MULTI | BPF_F_PREORDER, "flags > id3"); > + > + err = find_prog_attach_flags(&optq, id4, &flags); > + if (ASSERT_OK(err, "find id4")) > + ASSERT_EQ(flags, BPF_F_ALLOW_MULTI, "flags id4"); > + > +cleanup4: > bpf_link__destroy(link4); This isn't a bug, but since the patch already introduces a helper (find_prog_attach_flags), would it be worth folding this query-and-check block into one too, so the two preorder subtests share it instead of carrying identical copies? The pattern appears twice: first in test_preorder_prog_attach_detach() and again verbatim in test_preorder_link_attach_detach() - same query setup, same comment, same four id/flag expectations, together with duplicated locals (prog_ids[10], prog_attach_flags[10], flags, optq). --- AI reviewed your patch. Please fix the bug or email reply why it's not a bug. See: https://github.com/kernel-patches/vmtest/blob/master/ci/claude/README.md CI run summary: https://github.com/kernel-patches/bpf/actions/runs/35376083935

