On Tue, Jul 1, 2025 at 11:17 PM Kumar Kartikeya Dwivedi <memxor@xxxxxxxxx> wrote: > > Begin reporting may_goto timeouts to BPF program's stderr stream. > > Acked-by: Eduard Zingerman <eddyz87@xxxxxxxxx> > Signed-off-by: Kumar Kartikeya Dwivedi <memxor@xxxxxxxxx> > --- > kernel/bpf/core.c | 20 +++++++++++++++++++- > 1 file changed, 19 insertions(+), 1 deletion(-) > Reviewed-by: Emil Tsalapatis <emil@xxxxxxxxxxxxxxx> > diff --git a/kernel/bpf/core.c b/kernel/bpf/core.c > index ab8b3446570c..47dcc4f19050 100644 > --- a/kernel/bpf/core.c > +++ b/kernel/bpf/core.c > @@ -3168,6 +3168,22 @@ u64 __weak arch_bpf_timed_may_goto(void) > return 0; > } > > +static noinline void bpf_prog_report_may_goto_violation(void) > +{ > +#ifdef CONFIG_BPF_SYSCALL > + struct bpf_stream_stage ss; > + struct bpf_prog *prog; > + > + prog = bpf_prog_find_from_stack(); > + if (!prog) > + return; > + bpf_stream_stage(ss, prog, BPF_STDERR, ({ > + bpf_stream_printk(ss, "ERROR: Timeout detected for may_goto instruction\n"); > + bpf_stream_dump_stack(ss); > + })); > +#endif > +} > + > u64 bpf_check_timed_may_goto(struct bpf_timed_may_goto *p) > { > u64 time = ktime_get_mono_fast_ns(); > @@ -3178,8 +3194,10 @@ u64 bpf_check_timed_may_goto(struct bpf_timed_may_goto *p) > return BPF_MAX_TIMED_LOOPS; > } > /* Check if we've exhausted our time slice, and zero count. */ > - if (time - p->timestamp >= (NSEC_PER_SEC / 4)) > + if (unlikely(time - p->timestamp >= (NSEC_PER_SEC / 4))) { > + bpf_prog_report_may_goto_violation(); > return 0; > + } > /* Refresh the count for the stack frame. */ > return BPF_MAX_TIMED_LOOPS; > } > -- > 2.47.1 >