Re: [PATCH bpf-next v4] bpf: log error code on tramp oline unlink failure
Andrii Nakryiko <[email protected]>
| Newsgroups | org.kernel.vger.bpf,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <CAEf4Bzba=w2BwpUoMfOPXFszh-8z_kmAO2kWpxNjHb0gikOFyw@mail.gmail.com> |
On Tue, Jul 28, 2026 at 11:12 PM <[email protected]> wrote: > > From: Xu Xin <[email protected]> > > Replace silent WARN_ON_ONCE with WARN_ONCE that prints the actual error > code from bpf_trampoline_unlink_prog(). This aids debugging of race > conditions during link teardown, while keeping the warning rate limited > to avoid log flooding. > > This will be very helpful for speeding up trouble-shooting of some crash > UAF due to bpf_trampoline_unlink_prog failures. > > No change to unlink behavior. > > Signed-off-by: Xu Xin <[email protected]> > Acked-by: Leon Hwang <[email protected]> > --- > Change log: > - Small fixes according to the v3 disccusion: > https://lore.kernel.org/all/[email protected]/ > > kernel/bpf/syscall.c | 8 +++++--- > kernel/bpf/trampoline.c | 12 ++++++++---- > 2 files changed, 13 insertions(+), 7 deletions(-) > > diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c > index 6db306d23b47..52c57f8beb37 100644 > --- a/kernel/bpf/syscall.c > +++ b/kernel/bpf/syscall.c > @@ -3626,10 +3626,12 @@ static void bpf_tracing_link_release(struct bpf_link *link) > { > struct bpf_tracing_link *tr_link = > container_of(link, struct bpf_tracing_link, link.link); > + int err; > > - WARN_ON_ONCE(bpf_trampoline_unlink_prog(&tr_link->link.node, > - tr_link->trampoline, > - tr_link->tgt_prog)); > + err = bpf_trampoline_unlink_prog(&tr_link->link.node, > + tr_link->trampoline, > + tr_link->tgt_prog); > + WARN_ONCE(err, "bpf_trampoline_unlink_prog returns error: %d\n", err); > > bpf_trampoline_put(tr_link->trampoline); > > diff --git a/kernel/bpf/trampoline.c b/kernel/bpf/trampoline.c > index 1a721fc4bef5..49dceea3d51e 100644 > --- a/kernel/bpf/trampoline.c > +++ b/kernel/bpf/trampoline.c > @@ -997,12 +997,15 @@ static void bpf_shim_tramp_link_release(struct bpf_link *link) > { > struct bpf_shim_tramp_link *shim_link = > container_of(link, struct bpf_shim_tramp_link, link.link); > + int err; > > /* paired with 'shim_link->trampoline = tr' in bpf_trampoline_link_cgroup_shim */ > if (!shim_link->trampoline) > return; > > - WARN_ON_ONCE(bpf_trampoline_unlink_prog(&shim_link->link.node, shim_link->trampoline, NULL)); > + err = bpf_trampoline_unlink_prog(&shim_link->link.node, shim_link->trampoline, NULL); > + WARN_ONCE(err, "bpf_trampoline_unlink_prog returns error: %d\n", err); > + I changed wording to "bpf_trampoline_unlink_prog failed: %d\n" (in all three places), applied to bpf-next > bpf_trampoline_put(shim_link->trampoline); > } > > @@ -1712,15 +1715,16 @@ int bpf_trampoline_multi_detach(struct bpf_prog *prog, struct bpf_tracing_multi_ > { > struct bpf_tracing_multi_data *data = &link->data; > struct bpf_tracing_multi_node *mnode; > - int i; > + int i, err; > > trampoline_lock_all(); > > for_each_mnode(mnode, link) { > data->entry = &mnode->entry; > bpf_trampoline_multi_attach_init(mnode->trampoline); > - WARN_ON_ONCE(__bpf_trampoline_unlink_prog(&mnode->node, mnode->trampoline, > - NULL, &trampoline_multi_ops, data)); > + err = __bpf_trampoline_unlink_prog(&mnode->node, mnode->trampoline, NULL, > + &trampoline_multi_ops, data); > + WARN_ONCE(err, "__bpf_trampoline_unlink_prog returns error: %d\n", err); > } > > if (ftrace_hash_count(data->unreg)) > -- > 2.25.1