> diff --git a/tools/testing/selftests/bpf/test_progs.c 
> b/tools/testing/selftests/bpf/test_progs.c
> index cc14b13e23fe..7ba82974ee78 100644
> --- a/tools/testing/selftests/bpf/test_progs.c
> +++ b/tools/testing/selftests/bpf/test_progs.c

[ ... ]

> @@ -2046,15 +2069,20 @@ int main(int argc, char **argv)
>               struct prog_test_def *test = &prog_test_defs[i];
>
>               test->test_num = i + 1;
> -             test->should_run = should_run(&env.test_selector,
> -                                           test->test_num, test->test_name);
> +             test->selected = should_run(&env.test_selector,
> +                                         test->test_num, test->test_name);
> +             test->should_run = test->selected;
>
> -             if ((test->run_test == NULL && test->run_serial_test == NULL) ||
> -                 (test->run_test != NULL && test->run_serial_test != NULL)) {
> +             if (test->run_test && test->run_serial_test) {
>                       fprintf(stderr, "Test %d:%s must have either test_%s() 
> or serial_test_%sl() defined.\n",
>                               test->test_num, test->test_name, 
> test->test_name, test->test_name);
>                       exit(EXIT_ERR_SETUP_INFRA);
>               }
> +             if (!test->run_test && !test->run_serial_test) {
> +                     test->not_built = true;
> +                     test->should_run = false;
> +                     continue;
> +             }
>               if (test->should_run)
>                       test->should_tmon = should_tmon(&env.tmon_selector, 
> test->test_name);
>       }
> @@ -2106,9 +2134,18 @@ int main(int argc, char **argv)
>
>       for (i = 0; i < prog_test_cnt; i++) {
>               struct prog_test_def *test = &prog_test_defs[i];
> +             struct test_state *state = &test_states[i];
>
> -             if (!test->should_run)
> +             if (!test->should_run) {
> +                     if (test->not_built && test->selected &&
> +                         !env.get_test_cnt && !env.list_test_names) {
> +                             state->tested = true;
> +                             state->skip_cnt = 1;
> +                             env.not_built_cnt++;
> +                             print_test_result(test, state);
> +                     }
>                       continue;
> +             }

When test->should_run is false (which it is for unbuilt tests due to the
code above setting test->should_run = false), the continue statement skips
the env.get_test_cnt and env.list_test_names blocks that follow.

Won't this completely omit unbuilt tests from the output of --list (-l) and
--count modes? The code only prints unbuilt tests when !env.get_test_cnt &&
!env.list_test_names is true.

If CI systems use test_progs -l to discover and distribute tests across
parallel jobs, they won't be aware of unbuilt tests. Could this undermine
the stated goal of keeping unbuilt tests visible in CI results?

Reference: sashiko-bot raised this concern in v10 discussion at
https://lore.kernel.org/bpf/[email protected]/

>
>               if (env.get_test_cnt) {
>                       env.succ_cnt++;

[ ... ]


---
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/25167006036

Reply via email to