On Tue, 2024-10-01 at 21:20 +0800, Leon Hwang wrote: [...] > > > diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c > > > index a8f1808a1ca54..db17c52fa35db 100644 > > > --- a/kernel/bpf/syscall.c > > > +++ b/kernel/bpf/syscall.c > > > @@ -3212,14 +3212,23 @@ 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); > > > - > > > - WARN_ON_ONCE(bpf_trampoline_unlink_prog(&tr_link->link, > > > - tr_link->trampoline)); > > > + struct bpf_prog *tgt_prog = tr_link->tgt_prog; > > > + > > > + if (link->prog->type == BPF_PROG_TYPE_EXT) { > > > + mutex_lock(&tgt_prog->aux->ext_mutex); > > > + WARN_ON_ONCE(bpf_trampoline_unlink_prog(&tr_link->link, > > > + tr_link->trampoline)); > > > + tgt_prog->aux->is_extended = false; > > > > In case if unlink fails is_extended should not be reset. > > > > Nope. > > In bpf_trampoline_unlink_prog(), 'tr->extension_prog = NULL;' always no > matter whether fail to unlink. > > So, it should reset is_extended always too. Hm, you are correct, sorry for the noise. It is unfortunate that these updates are separated in the code, tbh. [...]