perf tools: Fixup exit path when not able to open events
Commit-ID: c286c419c784c238cd699be37fec7a9acc30d89f Gitweb: http://git.kernel.org/tip/c286c419c784c238cd699be37fec7a9acc30d89f Author: Arnaldo Carvalho de Melo <[email protected]> AuthorDate: Mon, 28 Mar 2011 09:50:11 -0300 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Tue, 29 Mar 2011 13:40:27 -0300
perf tools: Fixup exit path when not able to open events
We have to deal with the TUI mode in perf top, so that we don't end up with a garbled screen when, say, a non root user on a machine with a paranoid setting (the default) tries to use 'perf top'.
Introduce a ui__warning_paranoid() routine shared by top and record that tells the user the valid values for /proc/sys/kernel/perf_event_paranoid.
Cc: David Ahern <[email protected]>
Cc: Frederic Weisbecker <[email protected]>
Cc: Ingo Molnar <[email protected]>
Cc: Mike Galbraith <[email protected]>
Cc: Paul Mackerras <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Stephane Eranian <[email protected]>
Cc: Tom Zanussi <[email protected]>
LKML-Reference: <new-submission>
Signed-off-by Arnaldo Carvalho de Melo <[email protected]>
--- tools/perf/builtin-record.c | 9 ++++----- tools/perf/builtin-top.c | 38 ++++++++++++++++++++++++-------------- tools/perf/util/debug.c | 10 ++++++++++ tools/perf/util/debug.h | 1 + 4 files changed, 39 insertions(+), 19 deletions(-)
tools/perf/builtin-record.c +4 -5
@@ -275,11 +275,10 @@ try_again: !no_inherit) < 0) {int err = errno; -if (err ==EPERM || err ==EACCES ) -die ("Permission error - are you root?\n" -"\t Consider tweaking" -" /proc/sys/kernel/perf_event_paranoid.\n" ); -else if (err ==ENODEV && cpu_list) { +if (err ==EPERM || err ==EACCES ) { +ui__warning_paranoid (); +exit (EXIT_FAILURE ); + }else if (err ==ENODEV && cpu_list) {die ("No such device - did you specify" " an out-of-range profile CPU?\n" ); }else if (err ==EINVAL && sample_id_all_avail) {
tools/perf/builtin-top.c +24 -14
@@ -850,10 +850,10 @@ try_again: top.evlist->threads, group, inherit) < 0) {int err = errno; -if (err ==EPERM || err ==EACCES ) -die ("Permission error - are you root?\n" -"\t Consider tweaking" -" /proc/sys/kernel/perf_event_paranoid.\n" ); +if (err ==EPERM || err ==EACCES ) { +ui__warning_paranoid (); + goto out_err; + }/* * If it's cycles then fall back to hrtimer * based cpu-clock-tick sw counter, which
@@ -861,25 +861,35 @@ try_again:*/ if (attr->type ==PERF_TYPE_HARDWARE && attr->config ==PERF_COUNT_HW_CPU_CYCLES ) { -if (verbose) -warning (" ... trying to fall back to cpu-clock-ticks\n" ); +ui__warning ("Cycles event not supported,\n" +"trying to fall back to cpu-clock-ticks\n" ); attr->type =PERF_TYPE_SOFTWARE ; attr->config =PERF_COUNT_SW_CPU_CLOCK ; goto try_again; } -printf ("\n" ); -error ("sys_perf_event_open() syscall returned with %d " -"(%s). /bin/dmesg may provide additional information.\n" , - err,strerror (err)); -die ("No CONFIG_PERF_EVENTS=y kernel support configured?\n" ); -exit (-1 ); + +ui__warning ("The sys_perf_event_open() syscall " +"returned with %d (%s). /bin/dmesg " +"may provide additional information.\n" +"No CONFIG_PERF_EVENTS=y kernel support " +"configured?\n" , err,strerror (err)); + goto out_err; } } -if (perf_evlist__mmap (evlist, mmap_pages, false) <0 ) -die ("failed to mmap with %d (%s)\n" , errno,strerror (errno)); +if (perf_evlist__mmap (evlist, mmap_pages, false) <0 ) { +ui__warning ("Failed to mmap with %d (%s)\n" , + errno,strerror (errno)); + goto out_err; + } + +return ; + +out_err: +exit_browser (0 ); +exit (0 ); }static int __cmd_top (void )
tools/perf/util/debug.c +10 -0
@@ -57,6 +57,16 @@ void ui__warning(const char *format, ...) }#endif +void ui__warning_paranoid (void ) +{ +ui__warning ("Permission error - are you root?\n" +"Consider tweaking /proc/sys/kernel/perf_event_paranoid:\n" +" -1 - Not paranoid at all\n" +" 0 - Disallow raw tracepoint access for unpriv\n" +" 1 - Disallow cpu events for unpriv\n" +" 2 - Disallow kernel profiling for unpriv\n" ); +} +void trace_event (union perf_event *event) {unsigned char *raw_event = (void *)event;
tools/perf/util/debug.h +1 -0
@@ -36,5 +36,6 @@ int ui_helpline__show_help(const char *format, va_list ap);#endif void ui__warning (const char *format, ...) __attribute__((format (printf,1 ,2 ))); +void ui__warning_paranoid (void );#endif /* __PERF_DEBUG_H */