diff options
author | Song Liu <songliubraving@fb.com> | 2020-06-30 08:28:43 +0200 |
---|---|---|
committer | Alexei Starovoitov <ast@kernel.org> | 2020-07-01 17:22:08 +0200 |
commit | d141b8bc5773cbbaf5b8530f08f94fc10fff9e8c (patch) | |
tree | b38dafc5c0d9bd82ed208d027c505ea034f764d8 /kernel/events | |
parent | bpf: Remove redundant synchronize_rcu. (diff) | |
download | linux-d141b8bc5773cbbaf5b8530f08f94fc10fff9e8c.tar.xz linux-d141b8bc5773cbbaf5b8530f08f94fc10fff9e8c.zip |
perf: Expose get/put_callchain_entry()
Sanitize and expose get/put_callchain_entry(). This would be used by bpf
stack map.
Suggested-by: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Song Liu <songliubraving@fb.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Acked-by: Andrii Nakryiko <andriin@fb.com>
Link: https://lore.kernel.org/bpf/20200630062846.664389-2-songliubraving@fb.com
Diffstat (limited to 'kernel/events')
-rw-r--r-- | kernel/events/callchain.c | 13 |
1 files changed, 6 insertions, 7 deletions
diff --git a/kernel/events/callchain.c b/kernel/events/callchain.c index 334d48b16c36..c6ce894e4ce9 100644 --- a/kernel/events/callchain.c +++ b/kernel/events/callchain.c @@ -149,7 +149,7 @@ void put_callchain_buffers(void) } } -static struct perf_callchain_entry *get_callchain_entry(int *rctx) +struct perf_callchain_entry *get_callchain_entry(int *rctx) { int cpu; struct callchain_cpus_entries *entries; @@ -159,8 +159,10 @@ static struct perf_callchain_entry *get_callchain_entry(int *rctx) return NULL; entries = rcu_dereference(callchain_cpus_entries); - if (!entries) + if (!entries) { + put_recursion_context(this_cpu_ptr(callchain_recursion), *rctx); return NULL; + } cpu = smp_processor_id(); @@ -168,7 +170,7 @@ static struct perf_callchain_entry *get_callchain_entry(int *rctx) (*rctx * perf_callchain_entry__sizeof())); } -static void +void put_callchain_entry(int rctx) { put_recursion_context(this_cpu_ptr(callchain_recursion), rctx); @@ -183,11 +185,8 @@ get_perf_callchain(struct pt_regs *regs, u32 init_nr, bool kernel, bool user, int rctx; entry = get_callchain_entry(&rctx); - if (rctx == -1) - return NULL; - if (!entry) - goto exit_put; + return NULL; ctx.entry = entry; ctx.max_stack = max_stack; |