aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorArnaldo Carvalho de Melo <acme@redhat.com>2016-04-28 11:30:53 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2016-05-16 22:11:50 -0400
commitcfbcf468454ab4b20f0b4b62da51920b99fdb19e (patch)
tree08b7caa605bd1ef1babb8f58cb0771bc20e518c4 /kernel
parenta831100aeefbe6d9f3e47a3e2712f82c042f1f5c (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.c3
-rw-r--r--kernel/events/callchain.c20
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);
32static struct callchain_cpus_entries *callchain_cpus_entries; 32static 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
182struct perf_callchain_entry * 182struct perf_callchain_entry *
183get_perf_callchain(struct pt_regs *regs, u32 init_nr, bool kernel, bool user, 183get_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