diff options
| author | Arnaldo Carvalho de Melo <acme@redhat.com> | 2016-04-28 11:30:53 -0400 |
|---|---|---|
| committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2016-05-16 22:11:50 -0400 |
| commit | cfbcf468454ab4b20f0b4b62da51920b99fdb19e (patch) | |
| tree | 08b7caa605bd1ef1babb8f58cb0771bc20e518c4 /kernel | |
| parent | a831100aeefbe6d9f3e47a3e2712f82c042f1f5c (diff) | |
perf core: Pass max stack as a perf_callchain_entry context
This makes perf_callchain_{user,kernel}() receive the max stack
as context for the perf_callchain_entry, instead of accessing
the global sysctl_perf_event_max_stack.
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Alexei Starovoitov <ast@kernel.org>
Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: He Kuang <hekuang@huawei.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Milian Wolff <milian.wolff@kdab.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Vince Weaver <vincent.weaver@maine.edu>
Cc: Wang Nan <wangnan0@huawei.com>
Cc: Zefan Li <lizefan@huawei.com>
Link: http://lkml.kernel.org/n/tip-kolmn1yo40p7jhswxwrc7rrd@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/bpf/stackmap.c | 3 | ||||
| -rw-r--r-- | kernel/events/callchain.c | 20 |
2 files changed, 14 insertions, 9 deletions
diff --git a/kernel/bpf/stackmap.c b/kernel/bpf/stackmap.c index f5a19548be12..a82d7605db3f 100644 --- a/kernel/bpf/stackmap.c +++ b/kernel/bpf/stackmap.c | |||
| @@ -136,7 +136,8 @@ static u64 bpf_get_stackid(u64 r1, u64 r2, u64 flags, u64 r4, u64 r5) | |||
| 136 | BPF_F_FAST_STACK_CMP | BPF_F_REUSE_STACKID))) | 136 | BPF_F_FAST_STACK_CMP | BPF_F_REUSE_STACKID))) |
| 137 | return -EINVAL; | 137 | return -EINVAL; |
| 138 | 138 | ||
| 139 | trace = get_perf_callchain(regs, init_nr, kernel, user, false, false); | 139 | trace = get_perf_callchain(regs, init_nr, kernel, user, |
| 140 | sysctl_perf_event_max_stack, false, false); | ||
| 140 | 141 | ||
| 141 | if (unlikely(!trace)) | 142 | if (unlikely(!trace)) |
| 142 | /* couldn't fetch the stack trace */ | 143 | /* couldn't fetch the stack trace */ |
diff --git a/kernel/events/callchain.c b/kernel/events/callchain.c index 7fc89939ede9..af95ad92893a 100644 --- a/kernel/events/callchain.c +++ b/kernel/events/callchain.c | |||
| @@ -32,12 +32,12 @@ static DEFINE_MUTEX(callchain_mutex); | |||
| 32 | static struct callchain_cpus_entries *callchain_cpus_entries; | 32 | static struct callchain_cpus_entries *callchain_cpus_entries; |
| 33 | 33 | ||
| 34 | 34 | ||
| 35 | __weak void perf_callchain_kernel(struct perf_callchain_entry *entry, | 35 | __weak void perf_callchain_kernel(struct perf_callchain_entry_ctx *entry, |
| 36 | struct pt_regs *regs) | 36 | struct pt_regs *regs) |
| 37 | { | 37 | { |
| 38 | } | 38 | } |
| 39 | 39 | ||
| 40 | __weak void perf_callchain_user(struct perf_callchain_entry *entry, | 40 | __weak void perf_callchain_user(struct perf_callchain_entry_ctx *entry, |
| 41 | struct pt_regs *regs) | 41 | struct pt_regs *regs) |
| 42 | { | 42 | { |
| 43 | } | 43 | } |
| @@ -176,14 +176,15 @@ perf_callchain(struct perf_event *event, struct pt_regs *regs) | |||
| 176 | if (!kernel && !user) | 176 | if (!kernel && !user) |
| 177 | return NULL; | 177 | return NULL; |
| 178 | 178 | ||
| 179 | return get_perf_callchain(regs, 0, kernel, user, crosstask, true); | 179 | return get_perf_callchain(regs, 0, kernel, user, sysctl_perf_event_max_stack, crosstask, true); |
| 180 | } | 180 | } |
| 181 | 181 | ||
| 182 | struct perf_callchain_entry * | 182 | struct perf_callchain_entry * |
| 183 | get_perf_callchain(struct pt_regs *regs, u32 init_nr, bool kernel, bool user, | 183 | get_perf_callchain(struct pt_regs *regs, u32 init_nr, bool kernel, bool user, |
| 184 | bool crosstask, bool add_mark) | 184 | u32 max_stack, bool crosstask, bool add_mark) |
| 185 | { | 185 | { |
| 186 | struct perf_callchain_entry *entry; | 186 | struct perf_callchain_entry *entry; |
| 187 | struct perf_callchain_entry_ctx ctx; | ||
| 187 | int rctx; | 188 | int rctx; |
| 188 | 189 | ||
| 189 | entry = get_callchain_entry(&rctx); | 190 | entry = get_callchain_entry(&rctx); |
| @@ -193,12 +194,15 @@ get_perf_callchain(struct pt_regs *regs, u32 init_nr, bool kernel, bool user, | |||
| 193 | if (!entry) | 194 | if (!entry) |
| 194 | goto exit_put; | 195 | goto exit_put; |
| 195 | 196 | ||
| 197 | ctx.entry = entry; | ||
| 198 | ctx.max_stack = max_stack; | ||
| 199 | |||
| 196 | entry->nr = init_nr; | 200 | entry->nr = init_nr; |
| 197 | 201 | ||
| 198 | if (kernel && !user_mode(regs)) { | 202 | if (kernel && !user_mode(regs)) { |
| 199 | if (add_mark) | 203 | if (add_mark) |
| 200 | perf_callchain_store(entry, PERF_CONTEXT_KERNEL); | 204 | perf_callchain_store(&ctx, PERF_CONTEXT_KERNEL); |
| 201 | perf_callchain_kernel(entry, regs); | 205 | perf_callchain_kernel(&ctx, regs); |
| 202 | } | 206 | } |
| 203 | 207 | ||
| 204 | if (user) { | 208 | if (user) { |
| @@ -214,8 +218,8 @@ get_perf_callchain(struct pt_regs *regs, u32 init_nr, bool kernel, bool user, | |||
| 214 | goto exit_put; | 218 | goto exit_put; |
| 215 | 219 | ||
| 216 | if (add_mark) | 220 | if (add_mark) |
| 217 | perf_callchain_store(entry, PERF_CONTEXT_USER); | 221 | perf_callchain_store(&ctx, PERF_CONTEXT_USER); |
| 218 | perf_callchain_user(entry, regs); | 222 | perf_callchain_user(&ctx, regs); |
| 219 | } | 223 | } |
| 220 | } | 224 | } |
| 221 | 225 | ||
