aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/perf_event.h
diff options
context:
space:
mode:
authorArnaldo Carvalho de Melo <acme@redhat.com>2016-04-21 11:28:50 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2016-04-27 09:20:39 -0400
commitc5dfd78eb79851e278b7973031b9ca363da87a7e (patch)
treeeb48703a86c059b4de2a13e4c7021232c22e3715 /include/linux/perf_event.h
parentc2a218c63ba36946aca5943c0c8ebd3a42e3dc4b (diff)
perf core: Allow setting up max frame stack depth via sysctl
The default remains 127, which is good for most cases, and not even hit most of the time, but then for some cases, as reported by Brendan, 1024+ deep frames are appearing on the radar for things like groovy, ruby. And in some workloads putting a _lower_ cap on this may make sense. One that is per event still needs to be put in place tho. The new file is: # cat /proc/sys/kernel/perf_event_max_stack 127 Chaging it: # echo 256 > /proc/sys/kernel/perf_event_max_stack # cat /proc/sys/kernel/perf_event_max_stack 256 But as soon as there is some event using callchains we get: # echo 512 > /proc/sys/kernel/perf_event_max_stack -bash: echo: write error: Device or resource busy # Because we only allocate the callchain percpu data structures when there is a user, which allows for changing the max easily, its just a matter of having no callchain users at that point. Reported-and-Tested-by: Brendan Gregg <brendan.d.gregg@gmail.com> Reviewed-by: Frederic Weisbecker <fweisbec@gmail.com> Acked-by: Alexei Starovoitov <ast@kernel.org> Acked-by: David Ahern <dsahern@gmail.com> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.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/r/20160426002928.GB16708@kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'include/linux/perf_event.h')
-rw-r--r--include/linux/perf_event.h8
1 files changed, 6 insertions, 2 deletions
diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h
index 85749ae8cb5f..a090700cccca 100644
--- a/include/linux/perf_event.h
+++ b/include/linux/perf_event.h
@@ -58,7 +58,7 @@ struct perf_guest_info_callbacks {
58 58
59struct perf_callchain_entry { 59struct perf_callchain_entry {
60 __u64 nr; 60 __u64 nr;
61 __u64 ip[PERF_MAX_STACK_DEPTH]; 61 __u64 ip[0]; /* /proc/sys/kernel/perf_event_max_stack */
62}; 62};
63 63
64struct perf_raw_record { 64struct perf_raw_record {
@@ -993,9 +993,11 @@ get_perf_callchain(struct pt_regs *regs, u32 init_nr, bool kernel, bool user,
993extern int get_callchain_buffers(void); 993extern int get_callchain_buffers(void);
994extern void put_callchain_buffers(void); 994extern void put_callchain_buffers(void);
995 995
996extern int sysctl_perf_event_max_stack;
997
996static inline int perf_callchain_store(struct perf_callchain_entry *entry, u64 ip) 998static inline int perf_callchain_store(struct perf_callchain_entry *entry, u64 ip)
997{ 999{
998 if (entry->nr < PERF_MAX_STACK_DEPTH) { 1000 if (entry->nr < sysctl_perf_event_max_stack) {
999 entry->ip[entry->nr++] = ip; 1001 entry->ip[entry->nr++] = ip;
1000 return 0; 1002 return 0;
1001 } else { 1003 } else {
@@ -1017,6 +1019,8 @@ extern int perf_cpu_time_max_percent_handler(struct ctl_table *table, int write,
1017 void __user *buffer, size_t *lenp, 1019 void __user *buffer, size_t *lenp,
1018 loff_t *ppos); 1020 loff_t *ppos);
1019 1021
1022int perf_event_max_stack_handler(struct ctl_table *table, int write,
1023 void __user *buffer, size_t *lenp, loff_t *ppos);
1020 1024
1021static inline bool perf_paranoid_tracepoint_raw(void) 1025static inline bool perf_paranoid_tracepoint_raw(void)
1022{ 1026{