Introduce the function bpf_prog_report_probe_violation(), which is used to report the memory probe fault to the user by the BPF stderr. Signed-off-by: Menglong Dong --- include/linux/bpf.h | 1 + kernel/trace/bpf_trace.c | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/include/linux/bpf.h b/include/linux/bpf.h index 6338e54a9b1f..a31c5ce56c32 100644 --- a/include/linux/bpf.h +++ b/include/linux/bpf.h @@ -2902,6 +2902,7 @@ void bpf_dynptr_init(struct bpf_dynptr_kern *ptr, void *data, void bpf_dynptr_set_null(struct bpf_dynptr_kern *ptr); void bpf_dynptr_set_rdonly(struct bpf_dynptr_kern *ptr); void bpf_prog_report_arena_violation(bool write, unsigned long addr, unsigned long fault_ip); +void bpf_prog_report_probe_violation(bool write, unsigned long fault_ip); #else /* !CONFIG_BPF_SYSCALL */ static inline struct bpf_prog *bpf_prog_get(u32 ufd) diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c index 8f23f5273bab..9bd03a9f53db 100644 --- a/kernel/trace/bpf_trace.c +++ b/kernel/trace/bpf_trace.c @@ -2055,6 +2055,24 @@ void bpf_put_raw_tracepoint(struct bpf_raw_event_map *btp) module_put(mod); } +void bpf_prog_report_probe_violation(bool write, unsigned long fault_ip) +{ + struct bpf_stream_stage ss; + struct bpf_prog *prog; + + rcu_read_lock(); + prog = bpf_prog_ksym_find(fault_ip); + rcu_read_unlock(); + if (!prog) + return; + + bpf_stream_stage(ss, prog, BPF_STDERR, ({ + bpf_stream_printk(ss, "ERROR: Probe %s access faule, insn=0x%lx\n", + write ? "WRITE" : "READ", fault_ip); + bpf_stream_dump_stack(ss); + })); +} + static __always_inline void __bpf_trace_run(struct bpf_raw_tp_link *link, u64 *args) { -- 2.51.0