bpf: Report may_goto timeout to BPF stderr

Begin reporting may_goto timeouts to BPF program's stderr stream.

Acked-by: Eduard Zingerman <eddyz87@gmail.com>
Reviewed-by: Emil Tsalapatis <emil@etsalapatis.com>
Signed-off-by: Kumar Kartikeya Dwivedi <memxor@gmail.com>
Link: https://lore.kernel.org/r/20250703204818.925464-8-memxor@gmail.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
Kumar Kartikeya Dwivedi 2025-07-03 13:48:13 -07:00 committed by Alexei Starovoitov
parent d7c431cafc
commit e8d0133022

View File

@ -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;
}