aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
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