diff options
-rw-r--r-- | kernel/events/callchain.c | 15 | ||||
-rw-r--r-- | kernel/events/core.c | 16 | ||||
-rw-r--r-- | kernel/events/internal.h | 4 |
3 files changed, 16 insertions, 19 deletions
diff --git a/kernel/events/callchain.c b/kernel/events/callchain.c index 1b2be63c8528..772a43fea825 100644 --- a/kernel/events/callchain.c +++ b/kernel/events/callchain.c | |||
@@ -179,21 +179,6 @@ put_callchain_entry(int rctx) | |||
179 | } | 179 | } |
180 | 180 | ||
181 | struct perf_callchain_entry * | 181 | struct perf_callchain_entry * |
182 | perf_callchain(struct perf_event *event, struct pt_regs *regs) | ||
183 | { | ||
184 | bool kernel = !event->attr.exclude_callchain_kernel; | ||
185 | bool user = !event->attr.exclude_callchain_user; | ||
186 | /* Disallow cross-task user callchains. */ | ||
187 | bool crosstask = event->ctx->task && event->ctx->task != current; | ||
188 | const u32 max_stack = event->attr.sample_max_stack; | ||
189 | |||
190 | if (!kernel && !user) | ||
191 | return NULL; | ||
192 | |||
193 | return get_perf_callchain(regs, 0, kernel, user, max_stack, crosstask, true); | ||
194 | } | ||
195 | |||
196 | struct perf_callchain_entry * | ||
197 | get_perf_callchain(struct pt_regs *regs, u32 init_nr, bool kernel, bool user, | 182 | get_perf_callchain(struct pt_regs *regs, u32 init_nr, bool kernel, bool user, |
198 | u32 max_stack, bool crosstask, bool add_mark) | 183 | u32 max_stack, bool crosstask, bool add_mark) |
199 | { | 184 | { |
diff --git a/kernel/events/core.c b/kernel/events/core.c index 55fb648a32b0..5fc1ded4b450 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c | |||
@@ -5980,6 +5980,22 @@ static u64 perf_virt_to_phys(u64 virt) | |||
5980 | return phys_addr; | 5980 | return phys_addr; |
5981 | } | 5981 | } |
5982 | 5982 | ||
5983 | static struct perf_callchain_entry * | ||
5984 | perf_callchain(struct perf_event *event, struct pt_regs *regs) | ||
5985 | { | ||
5986 | bool kernel = !event->attr.exclude_callchain_kernel; | ||
5987 | bool user = !event->attr.exclude_callchain_user; | ||
5988 | /* Disallow cross-task user callchains. */ | ||
5989 | bool crosstask = event->ctx->task && event->ctx->task != current; | ||
5990 | const u32 max_stack = event->attr.sample_max_stack; | ||
5991 | |||
5992 | if (!kernel && !user) | ||
5993 | return NULL; | ||
5994 | |||
5995 | return get_perf_callchain(regs, 0, kernel, user, | ||
5996 | max_stack, crosstask, true); | ||
5997 | } | ||
5998 | |||
5983 | void perf_prepare_sample(struct perf_event_header *header, | 5999 | void perf_prepare_sample(struct perf_event_header *header, |
5984 | struct perf_sample_data *data, | 6000 | struct perf_sample_data *data, |
5985 | struct perf_event *event, | 6001 | struct perf_event *event, |
diff --git a/kernel/events/internal.h b/kernel/events/internal.h index 09b1537ae06c..6dc725a7e7bc 100644 --- a/kernel/events/internal.h +++ b/kernel/events/internal.h | |||
@@ -201,10 +201,6 @@ arch_perf_out_copy_user(void *dst, const void *src, unsigned long n) | |||
201 | 201 | ||
202 | DEFINE_OUTPUT_COPY(__output_copy_user, arch_perf_out_copy_user) | 202 | DEFINE_OUTPUT_COPY(__output_copy_user, arch_perf_out_copy_user) |
203 | 203 | ||
204 | /* Callchain handling */ | ||
205 | extern struct perf_callchain_entry * | ||
206 | perf_callchain(struct perf_event *event, struct pt_regs *regs); | ||
207 | |||
208 | static inline int get_recursion_context(int *recursion) | 204 | static inline int get_recursion_context(int *recursion) |
209 | { | 205 | { |
210 | int rctx; | 206 | int rctx; |