diff options
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 | ||
