Messages in this thread Patch in this message | | | From | Song Liu <> | Subject | Re: Getting empty callchain from perf_callchain_kernel() | Date | Fri, 17 May 2019 18:40:42 +0000 |
| |
+Alexei, Daniel, and bpf
> On May 17, 2019, at 2:10 AM, Peter Zijlstra <peterz@infradead.org> wrote: > > On Fri, May 17, 2019 at 04:15:39PM +0800, Kairui Song wrote: >> Hi, I think the actual problem is that bpf_get_stackid_tp (and maybe >> some other bfp functions) is now broken, or, strating an unwind >> directly inside a bpf program will end up strangely. It have following >> kernel message: > > Urgh, what is that bpf_get_stackid_tp() doing to get the regs? I can't > follow.
I guess we need something like the following? (we should be able to optimize the PER_CPU stuff).
Thanks, Song
diff --git i/kernel/trace/bpf_trace.c w/kernel/trace/bpf_trace.c index f92d6ad5e080..c525149028a7 100644 --- i/kernel/trace/bpf_trace.c +++ w/kernel/trace/bpf_trace.c @@ -696,11 +696,13 @@ static const struct bpf_func_proto bpf_perf_event_output_proto_tp = { .arg5_type = ARG_CONST_SIZE_OR_ZERO, };
+static DEFINE_PER_CPU(struct pt_regs, bpf_stackid_tp_regs); BPF_CALL_3(bpf_get_stackid_tp, void *, tp_buff, struct bpf_map *, map, u64, flags) { - struct pt_regs *regs = *(struct pt_regs **)tp_buff; + struct pt_regs *regs = this_cpu_ptr(&bpf_stackid_tp_regs);
+ perf_fetch_caller_regs(regs); /* * Same comment as in bpf_perf_event_output_tp(), only that this time * the other helper's function body cannot be inlined due to being @@ -719,10 +721,13 @@ static const struct bpf_func_proto bpf_get_stackid_proto_tp = { .arg3_type = ARG_ANYTHING, };
+static DEFINE_PER_CPU(struct pt_regs, bpf_stack_tp_regs); BPF_CALL_4(bpf_get_stack_tp, void *, tp_buff, void *, buf, u32, size, u64, flags) { - struct pt_regs *regs = *(struct pt_regs **)tp_buff; + struct pt_regs *regs = this_cpu_ptr(&bpf_stack_tp_regs); + + perf_fetch_caller_regs(regs);
return bpf_get_stack((unsigned long) regs, (unsigned long) buf, (unsigned long) size, flags, 0); | |