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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.