Re: [PATCH] selftests/sched_ext: Fix bpf_link leak on early return in prog_run
Andrea Righi <[email protected]>
| Newsgroups | dev.linux.lists.sched-ext,org.kernel.vger.linux-kernel,org.kernel.vger.linux-kselftest |
|---|---|
| Message-ID | <alAFQFupPov3YxMX@gpd4> |
Hi Liang, On Thu, Jul 09, 2026 at 06:03:40PM +0800, [email protected] wrote: > From: Liang Luo <[email protected]> > > In prog_run's run(), the bpf_link is attached early but only destroyed > on the success path. The three SCX_EQ assertions between attach and > destroy expand to a direct 'return SCX_TEST_FAIL', so if any of them > triggers, bpf_link__destroy() is never reached and the BPF scheduler > stays loaded. All subsequent tests then fail to attach because SCX is > not in the DISABLED state. > > Convert those assertions to explicit checks that jump to a unified > 'out' label which always runs the cleanup, matching the pattern used > in cyclic_kick_wait.c. > > Signed-off-by: Liang Luo <[email protected]> We could also add (optionally): Fixes: a5db7817af78 ("sched_ext: Add selftests") Other than that, looks good to me. Reviewed-by: Andrea Righi <[email protected]> Thanks, -Andrea > --- > tools/testing/selftests/sched_ext/prog_run.c | 34 +++++++++++++++----- > 1 file changed, 26 insertions(+), 8 deletions(-) > > diff --git a/tools/testing/selftests/sched_ext/prog_run.c b/tools/testing/selftests/sched_ext/prog_run.c > index 05974820ca69..1129ec2aaddc 100644 > --- a/tools/testing/selftests/sched_ext/prog_run.c > +++ b/tools/testing/selftests/sched_ext/prog_run.c > @@ -28,7 +28,8 @@ static enum scx_test_status setup(void **ctx) > static enum scx_test_status run(void *ctx) > { > struct prog_run *skel = ctx; > - struct bpf_link *link; > + struct bpf_link *link = NULL; > + enum scx_test_status status = SCX_TEST_PASS; > int prog_fd, err = 0; > > prog_fd = bpf_program__fd(skel->progs.prog_run_syscall); > @@ -42,23 +43,40 @@ static enum scx_test_status run(void *ctx) > link = bpf_map__attach_struct_ops(skel->maps.prog_run_ops); > if (!link) { > SCX_ERR("Failed to attach scheduler"); > - close(prog_fd); > - return SCX_TEST_FAIL; > + status = SCX_TEST_FAIL; > + goto out; > } > > err = bpf_prog_test_run_opts(prog_fd, &topts); > - SCX_EQ(err, 0); > + if (err) { > + SCX_ERR("BPF_PROG_RUN failed (%d)", err); > + status = SCX_TEST_FAIL; > + goto out; > + } > > /* Assumes uei.kind is written last */ > while (skel->data->uei.kind == EXIT_KIND(SCX_EXIT_NONE)) > sched_yield(); > > - SCX_EQ(skel->data->uei.kind, EXIT_KIND(SCX_EXIT_UNREG_BPF)); > - SCX_EQ(skel->data->uei.exit_code, 0xdeadbeef); > + if (skel->data->uei.kind != EXIT_KIND(SCX_EXIT_UNREG_BPF)) { > + SCX_ERR("Unexpected exit kind: %llu", > + (unsigned long long)skel->data->uei.kind); > + status = SCX_TEST_FAIL; > + goto out; > + } > + if (skel->data->uei.exit_code != 0xdeadbeef) { > + SCX_ERR("Unexpected exit code: %lld", > + (long long)skel->data->uei.exit_code); > + status = SCX_TEST_FAIL; > + goto out; > + } > + > +out: > close(prog_fd); > - bpf_link__destroy(link); > + if (link) > + bpf_link__destroy(link); > > - return SCX_TEST_PASS; > + return status; > } > > static void cleanup(void *ctx) > -- > 2.43.0 >