On Tue, Aug 13, 2024 at 8:17 AM Joe Damato <jdamato@xxxxxxxxxx> wrote: > > From: Kyle Huey <me@xxxxxxxxxxxx> > > The regressing commit is new in 6.10. It assumed that anytime event->prog > is set bpf_overflow_handler() should be invoked to execute the attached bpf > program. This assumption is false for tracing events, and as a result the > regressing commit broke bpftrace by invoking the bpf handler with garbage > inputs on overflow. > > Prior to the regression the overflow handlers formed a chain (of length 0, > 1, or 2) and perf_event_set_bpf_handler() (the !tracing case) added > bpf_overflow_handler() to that chain, while perf_event_attach_bpf_prog() > (the tracing case) did not. Both set event->prog. The chain of overflow > handlers was replaced by a single overflow handler slot and a fixed call to > bpf_overflow_handler() when appropriate. This modifies the condition there > to check event->prog->type == BPF_PROG_TYPE_PERF_EVENT, restoring the > previous behavior and fixing bpftrace. > > Signed-off-by: Kyle Huey <khuey@xxxxxxxxxxxx> > Suggested-by: Andrii Nakryiko <andrii.nakryiko@xxxxxxxxx> > Reported-by: Joe Damato <jdamato@xxxxxxxxxx> > Closes: https://lore.kernel.org/lkml/ZpFfocvyF3KHaSzF@LQ3V64L9R2/ > Fixes: f11f10bfa1ca ("perf/bpf: Call BPF handler directly, not through overflow machinery") > Cc: stable@xxxxxxxxxxxxxxx > Tested-by: Joe Damato <jdamato@xxxxxxxxxx> # bpftrace > --- > v2: > - Update patch based on Andrii's suggestion > - Update commit message > LGTM, thanks. Acked-by: Andrii Nakryiko <andrii@xxxxxxxxxx> > kernel/events/core.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/kernel/events/core.c b/kernel/events/core.c > index aa3450bdc227..c973e3c11e03 100644 > --- a/kernel/events/core.c > +++ b/kernel/events/core.c > @@ -9706,7 +9706,8 @@ static int __perf_event_overflow(struct perf_event *event, > > ret = __perf_event_account_interrupt(event, throttle); > > - if (event->prog && !bpf_overflow_handler(event, data, regs)) > + if (event->prog && event->prog->type == BPF_PROG_TYPE_PERF_EVENT && > + !bpf_overflow_handler(event, data, regs)) > return ret; > > /* > -- > 2.25.1 >