]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
bpf: Report may_goto timeout to BPF stderr
authorKumar Kartikeya Dwivedi <memxor@gmail.com>
Thu, 3 Jul 2025 20:48:13 +0000 (13:48 -0700)
committerAlexei Starovoitov <ast@kernel.org>
Fri, 4 Jul 2025 02:30:07 +0000 (19:30 -0700)
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>
kernel/bpf/core.c

index 037d67cf5fb1f87bdcfb9e6c3f18585c0fc1ea4b..fe8a53f3c5bc4190195dd911091b00fb7d0dd67a 100644 (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;
 }