aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArnaldo Carvalho de Melo <acme@redhat.com>2011-03-28 08:50:11 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2011-03-29 12:40:27 -0400
commitc286c419c784c238cd699be37fec7a9acc30d89f (patch)
tree3c99ba8a937f97dc02df0962a8a72cb26f9d27b5
parent1dfd7b494b3d8fb1e8a7383a8095f77eb058cd83 (diff)
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 <daahern@cisco.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Ingo Molnar <mingo@elte.hu> Cc: Mike Galbraith <efault@gmx.de> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephane Eranian <eranian@google.com> Cc: Tom Zanussi <tzanussi@gmail.com> LKML-Reference: <new-submission> Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
-rw-r--r--tools/perf/builtin-record.c9
-rw-r--r--tools/perf/builtin-top.c38
-rw-r--r--tools/perf/util/debug.c10
-rw-r--r--tools/perf/util/debug.h1
4 files changed, 39 insertions, 19 deletions
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index 6febcc168a8c..623695e18254 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -275,11 +275,10 @@ try_again:
275 !no_inherit) < 0) { 275 !no_inherit) < 0) {
276 int err = errno; 276 int err = errno;
277 277
278 if (err == EPERM || err == EACCES) 278 if (err == EPERM || err == EACCES) {
279 die("Permission error - are you root?\n" 279 ui__warning_paranoid();
280 "\t Consider tweaking" 280 exit(EXIT_FAILURE);
281 " /proc/sys/kernel/perf_event_paranoid.\n"); 281 } else if (err == ENODEV && cpu_list) {
282 else if (err == ENODEV && cpu_list) {
283 die("No such device - did you specify" 282 die("No such device - did you specify"
284 " an out-of-range profile CPU?\n"); 283 " an out-of-range profile CPU?\n");
285 } else if (err == EINVAL && sample_id_all_avail) { 284 } else if (err == EINVAL && sample_id_all_avail) {
diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c
index 676b4fb0070f..935fc4fd878e 100644
--- a/tools/perf/builtin-top.c
+++ b/tools/perf/builtin-top.c
@@ -850,10 +850,10 @@ try_again:
850 top.evlist->threads, group, inherit) < 0) { 850 top.evlist->threads, group, inherit) < 0) {
851 int err = errno; 851 int err = errno;
852 852
853 if (err == EPERM || err == EACCES) 853 if (err == EPERM || err == EACCES) {
854 die("Permission error - are you root?\n" 854 ui__warning_paranoid();
855 "\t Consider tweaking" 855 goto out_err;
856 " /proc/sys/kernel/perf_event_paranoid.\n"); 856 }
857 /* 857 /*
858 * If it's cycles then fall back to hrtimer 858 * If it's cycles then fall back to hrtimer
859 * based cpu-clock-tick sw counter, which 859 * based cpu-clock-tick sw counter, which
@@ -861,25 +861,35 @@ try_again:
861 */ 861 */
862 if (attr->type == PERF_TYPE_HARDWARE && 862 if (attr->type == PERF_TYPE_HARDWARE &&
863 attr->config == PERF_COUNT_HW_CPU_CYCLES) { 863 attr->config == PERF_COUNT_HW_CPU_CYCLES) {
864
865 if (verbose) 864 if (verbose)
866 warning(" ... trying to fall back to cpu-clock-ticks\n"); 865 ui__warning("Cycles event not supported,\n"
866 "trying to fall back to cpu-clock-ticks\n");
867 867
868 attr->type = PERF_TYPE_SOFTWARE; 868 attr->type = PERF_TYPE_SOFTWARE;
869 attr->config = PERF_COUNT_SW_CPU_CLOCK; 869 attr->config = PERF_COUNT_SW_CPU_CLOCK;
870 goto try_again; 870 goto try_again;
871 } 871 }
872 printf("\n"); 872
873 error("sys_perf_event_open() syscall returned with %d " 873 ui__warning("The sys_perf_event_open() syscall "
874 "(%s). /bin/dmesg may provide additional information.\n", 874 "returned with %d (%s). /bin/dmesg "
875 err, strerror(err)); 875 "may provide additional information.\n"
876 die("No CONFIG_PERF_EVENTS=y kernel support configured?\n"); 876 "No CONFIG_PERF_EVENTS=y kernel support "
877 exit(-1); 877 "configured?\n", err, strerror(err));
878 goto out_err;
878 } 879 }
879 } 880 }
880 881
881 if (perf_evlist__mmap(evlist, mmap_pages, false) < 0) 882 if (perf_evlist__mmap(evlist, mmap_pages, false) < 0) {
882 die("failed to mmap with %d (%s)\n", errno, strerror(errno)); 883 ui__warning("Failed to mmap with %d (%s)\n",
884 errno, strerror(errno));
885 goto out_err;
886 }
887
888 return;
889
890out_err:
891 exit_browser(0);
892 exit(0);
883} 893}
884 894
885static int __cmd_top(void) 895static int __cmd_top(void)
diff --git a/tools/perf/util/debug.c b/tools/perf/util/debug.c
index d4536a9e0d8c..155749d74350 100644
--- a/tools/perf/util/debug.c
+++ b/tools/perf/util/debug.c
@@ -57,6 +57,16 @@ void ui__warning(const char *format, ...)
57} 57}
58#endif 58#endif
59 59
60void ui__warning_paranoid(void)
61{
62 ui__warning("Permission error - are you root?\n"
63 "Consider tweaking /proc/sys/kernel/perf_event_paranoid:\n"
64 " -1 - Not paranoid at all\n"
65 " 0 - Disallow raw tracepoint access for unpriv\n"
66 " 1 - Disallow cpu events for unpriv\n"
67 " 2 - Disallow kernel profiling for unpriv\n");
68}
69
60void trace_event(union perf_event *event) 70void trace_event(union perf_event *event)
61{ 71{
62 unsigned char *raw_event = (void *)event; 72 unsigned char *raw_event = (void *)event;
diff --git a/tools/perf/util/debug.h b/tools/perf/util/debug.h
index 93516cf4682c..fd53db47e3de 100644
--- a/tools/perf/util/debug.h
+++ b/tools/perf/util/debug.h
@@ -36,5 +36,6 @@ int ui_helpline__show_help(const char *format, va_list ap);
36#endif 36#endif
37 37
38void ui__warning(const char *format, ...) __attribute__((format(printf, 1, 2))); 38void ui__warning(const char *format, ...) __attribute__((format(printf, 1, 2)));
39void ui__warning_paranoid(void);
39 40
40#endif /* __PERF_DEBUG_H */ 41#endif /* __PERF_DEBUG_H */