diff options
Diffstat (limited to 'include/linux/perf_event.h')
| -rw-r--r-- | include/linux/perf_event.h | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index 9e1c3ada91c4..dbd18246b36e 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h | |||
| @@ -61,6 +61,11 @@ struct perf_callchain_entry { | |||
| 61 | __u64 ip[0]; /* /proc/sys/kernel/perf_event_max_stack */ | 61 | __u64 ip[0]; /* /proc/sys/kernel/perf_event_max_stack */ |
| 62 | }; | 62 | }; |
| 63 | 63 | ||
| 64 | struct perf_callchain_entry_ctx { | ||
| 65 | struct perf_callchain_entry *entry; | ||
| 66 | u32 max_stack; | ||
| 67 | }; | ||
| 68 | |||
| 64 | struct perf_raw_record { | 69 | struct perf_raw_record { |
| 65 | u32 size; | 70 | u32 size; |
| 66 | void *data; | 71 | void *data; |
| @@ -1063,19 +1068,20 @@ extern void perf_event_fork(struct task_struct *tsk); | |||
| 1063 | /* Callchains */ | 1068 | /* Callchains */ |
| 1064 | DECLARE_PER_CPU(struct perf_callchain_entry, perf_callchain_entry); | 1069 | DECLARE_PER_CPU(struct perf_callchain_entry, perf_callchain_entry); |
| 1065 | 1070 | ||
| 1066 | extern void perf_callchain_user(struct perf_callchain_entry *entry, struct pt_regs *regs); | 1071 | extern void perf_callchain_user(struct perf_callchain_entry_ctx *entry, struct pt_regs *regs); |
| 1067 | extern void perf_callchain_kernel(struct perf_callchain_entry *entry, struct pt_regs *regs); | 1072 | extern void perf_callchain_kernel(struct perf_callchain_entry_ctx *entry, struct pt_regs *regs); |
| 1068 | extern struct perf_callchain_entry * | 1073 | extern struct perf_callchain_entry * |
| 1069 | get_perf_callchain(struct pt_regs *regs, u32 init_nr, bool kernel, bool user, | 1074 | get_perf_callchain(struct pt_regs *regs, u32 init_nr, bool kernel, bool user, |
| 1070 | bool crosstask, bool add_mark); | 1075 | u32 max_stack, bool crosstask, bool add_mark); |
| 1071 | extern int get_callchain_buffers(void); | 1076 | extern int get_callchain_buffers(void); |
| 1072 | extern void put_callchain_buffers(void); | 1077 | extern void put_callchain_buffers(void); |
| 1073 | 1078 | ||
| 1074 | extern int sysctl_perf_event_max_stack; | 1079 | extern int sysctl_perf_event_max_stack; |
| 1075 | 1080 | ||
| 1076 | static inline int perf_callchain_store(struct perf_callchain_entry *entry, u64 ip) | 1081 | static inline int perf_callchain_store(struct perf_callchain_entry_ctx *ctx, u64 ip) |
| 1077 | { | 1082 | { |
| 1078 | if (entry->nr < sysctl_perf_event_max_stack) { | 1083 | struct perf_callchain_entry *entry = ctx->entry; |
| 1084 | if (entry->nr < ctx->max_stack) { | ||
| 1079 | entry->ip[entry->nr++] = ip; | 1085 | entry->ip[entry->nr++] = ip; |
| 1080 | return 0; | 1086 | return 0; |
| 1081 | } else { | 1087 | } else { |
