+Alexei, Daniel, and bpf > On May 17, 2019, at 2:10 AM, Peter Zijlstra <peterz@xxxxxxxxxxxxx> 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);