perf fixes
Subsystems (2)
Linus,
Please pull the latest perf-fixes-for-linus git tree from:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip.git perf-fixes-for-linus
Thanks,
Ingo
------------------>
Arnaldo Carvalho de Melo (3):
perf evsel: Fix order of event list deletion
perf top: Fix annotate segv
Revert "perf tools: Emit clearer message for sys_perf_event_open ENOENT return"
Kirill Smelkov (1):
perf record: Add "nodelay" mode, disabled by default
Lai Jiangshan (1):
tracing: Remove syscall_exit_fields
Stephane Eranian (1):
perf sched: Fix list of events, dropping unsupported ':r' modifier
Steven Rostedt (1):
tracing: Only process module tracepoints once
include/trace/events/module.h | 10 +++++++++ kernel/trace/trace_syscalls.c | 33 ++++++++++------------------- tools/perf/Documentation/perf-record.txt | 3 ++ tools/perf/builtin-record.c | 12 ++++++++-- tools/perf/builtin-sched.c | 18 ++++++++-------- tools/perf/builtin-stat.c | 1 + tools/perf/builtin-top.c | 5 ++- tools/perf/perf.c | 2 - 8 files changed, 47 insertions(+), 37 deletions(-)
include/trace/events/module.h +10 -0
@@ -1,5 +1,15 @@ +/* +* Because linux/module.h has tracepoints in the header, and ftrace.h +* eventually includes this file, define_trace.h includes linux/module.h +* But we do not want the module.h to override the TRACE_SYSTEM macro +* variable that define_trace.h is processing, so we only set it +* when module events are being processed, which would happen when +* CREATE_TRACE_POINTS is defined. +*/ +#ifdef CREATE_TRACE_POINTS #undef TRACE_SYSTEM#define TRACE_SYSTEM module +#endif #if !defined(_TRACE_MODULE_H) || defined(TRACE_HEADER_MULTI_READ )#define _TRACE_MODULE_H
kernel/trace/trace_syscalls.c +12 -21
@@ -23,9 +23,6 @@ static int syscall_exit_register(struct ftrace_event_call *event,static int syscall_enter_define_fields (struct ftrace_event_call *call);static int syscall_exit_define_fields (struct ftrace_event_call *call); -/* All syscall exit events have the same fields */ -static LIST_HEAD (syscall_exit_fields); -static struct list_head *syscall_get_enter_fields (struct ftrace_event_call *call) {
@@ -34,34 +31,28 @@ syscall_get_enter_fields(struct ftrace_event_call *call)return &entry->enter_fields; } -static struct list_head * -syscall_get_exit_fields (struct ftrace_event_call *call) -{ -return &syscall_exit_fields; -} -struct trace_event_functions enter_syscall_print_funcs = { - .trace = print_syscall_enter, + .trace = print_syscall_enter, };struct trace_event_functions exit_syscall_print_funcs = { - .trace = print_syscall_exit, + .trace = print_syscall_exit, };struct ftrace_event_class event_class_syscall_enter = { - .system ="syscalls" , - .reg = syscall_enter_register, - .define_fields = syscall_enter_define_fields, - .get_fields = syscall_get_enter_fields, - .raw_init = init_syscall_trace, + .system ="syscalls" , + .reg = syscall_enter_register, + .define_fields = syscall_enter_define_fields, + .get_fields = syscall_get_enter_fields, + .raw_init = init_syscall_trace, };struct ftrace_event_class event_class_syscall_exit = { - .system ="syscalls" , - .reg = syscall_exit_register, - .define_fields = syscall_exit_define_fields, - .get_fields = syscall_get_exit_fields, - .raw_init = init_syscall_trace, + .system ="syscalls" , + .reg = syscall_exit_register, + .define_fields = syscall_exit_define_fields, + .fields =LIST_HEAD_INIT (event_class_syscall_exit.fields), + .raw_init = init_syscall_trace, };extern unsigned long __start_syscalls_metadata[];
tools/perf/Documentation/perf-record.txt +3 -0
@@ -61,6 +61,9 @@ OPTIONS -r:: --realtime=:: Collect data with this RT SCHED_FIFO priority. +-D:: +--no-delay:: + Collect data without buffering. -A:: --append:: Append to the output file to do incremental profiling.
tools/perf/builtin-record.c +9 -3
@@ -49,6 +49,7 @@ static int pipe_output = 0;static const char *output_name ="perf.data" ;static int group =0 ;static int realtime_prio =0 ; +static bool nodelay = false;static bool raw_samples = false;static bool sample_id_all_avail = true;static bool system_wide = false;
@@ -307,6 +308,11 @@ static void create_counter(struct perf_evsel *evsel, int cpu) attr->sample_type |=PERF_SAMPLE_CPU ; } +if (nodelay) { + attr->watermark =0 ; + attr->wakeup_events =1 ; + } + attr->mmap = track; attr->comm = track; attr->inherit = !no_inherit;
@@ -331,9 +337,6 @@ try_again:else if (err ==ENODEV && cpu_list) {die ("No such device - did you specify" " an out-of-range profile CPU?\n" ); - }else if (err ==ENOENT ) { -die ("%s event is not supported. " , -event_name (evsel)); }else if (err ==EINVAL && sample_id_all_avail) {/* * Old kernel, no attr->sample_id_type_all field
@@ -480,6 +483,7 @@ static void atexit_header(void)process_buildids ();perf_header__write (&session->header, output, true);perf_session__delete (session); +perf_evsel_list__delete ();symbol__exit (); } }
@@ -845,6 +849,8 @@ const struct option record_options[] = { "record events on existing thread id"),OPT_INTEGER ('r' ,"realtime" , &realtime_prio,"collect data with this RT SCHED_FIFO priority" ), +OPT_BOOLEAN ('D' ,"no-delay" , &nodelay, +"collect data without buffering" ),OPT_BOOLEAN ('R' ,"raw-samples" , &raw_samples,"collect raw sample records from all opened counters" ), OPT_BOOLEAN('a', "all-cpus", &system_wide,
tools/perf/builtin-sched.c +9 -9
@@ -1843,15 +1843,15 @@ static const char *record_args[] = {"-f" ,"-m" ,"1024" ,"-c" ,"1" , -"-e" ,"sched:sched_switch:r" , -"-e" ,"sched:sched_stat_wait:r" , -"-e" ,"sched:sched_stat_sleep:r" , -"-e" ,"sched:sched_stat_iowait:r" , -"-e" ,"sched:sched_stat_runtime:r" , -"-e" ,"sched:sched_process_exit:r" , -"-e" ,"sched:sched_process_fork:r" , -"-e" ,"sched:sched_wakeup:r" , - "-e", "sched:sched_migrate_task:r", +"-e" ,"sched:sched_switch" , +"-e" ,"sched:sched_stat_wait" , +"-e" ,"sched:sched_stat_sleep" , +"-e" ,"sched:sched_stat_iowait" , +"-e" ,"sched:sched_stat_runtime" , +"-e" ,"sched:sched_process_exit" , +"-e" ,"sched:sched_process_fork" , +"-e" ,"sched:sched_wakeup" , + "-e", "sched:sched_migrate_task", };static int __cmd_record (int argc,const char **argv)
tools/perf/builtin-stat.c +1 -0
@@ -743,6 +743,7 @@ int cmd_stat(int argc, const char **argv, const char *prefix __used) out_free_fd:list_for_each_entry (pos, &evsel_list, node)perf_evsel__free_stat_priv (pos); +perf_evsel_list__delete (); out:thread_map__delete (threads); threads =NULL ;
tools/perf/builtin-top.c +3 -2
@@ -1247,8 +1247,6 @@ try_again:die ("Permission error - are you root?\n" "\t Consider tweaking" " /proc/sys/kernel/perf_event_paranoid.\n" ); -if (err ==ENOENT ) -die ("%s event is not supported. " ,event_name (evsel));/* * If it's cycles then fall back to hrtimer * based cpu-clock-tick sw counter, which
@@ -1473,6 +1471,8 @@ int cmd_top(int argc, const char **argv, const char *prefix __used) pos->attr.sample_period = default_interval; } + sym_evsel = list_entry(evsel_list.next, struct perf_evsel, node); + symbol_conf.priv_size = (sizeof (struct sym_entry ) + (nr_counters +1 ) *sizeof (unsigned long ));
@@ -1490,6 +1490,7 @@ int cmd_top(int argc, const char **argv, const char *prefix __used) out_free_fd:list_for_each_entry (pos, &evsel_list, node)perf_evsel__free_mmap (pos); +perf_evsel_list__delete ();return status; }
tools/perf/perf.c +0 -2
@@ -286,8 +286,6 @@ static int run_builtin(struct cmd_struct *p, int argc, const char **argv) status = p->fn (argc, argv, prefix);exit_browser (status); -perf_evsel_list__delete (); -if (status)return status &0xff ;