Skip to content

Commit

Permalink
perf tools: Fixup exit path when not able to open events
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Arnaldo Carvalho de Melo committed Mar 29, 2011
1 parent 1dfd7b4 commit c286c41
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 19 deletions.
9 changes: 4 additions & 5 deletions tools/perf/builtin-record.c
Original file line number Diff line number Diff line change
Expand Up @@ -275,11 +275,10 @@ static void open_counters(struct perf_evlist *evlist)
!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) {
Expand Down
38 changes: 24 additions & 14 deletions tools/perf/builtin-top.c
Original file line number Diff line number Diff line change
Expand Up @@ -850,36 +850,46 @@ static void start_counters(struct perf_evlist *evlist)
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
* is always available even if no PMU support:
*/
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)
Expand Down
10 changes: 10 additions & 0 deletions tools/perf/util/debug.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
1 change: 1 addition & 0 deletions tools/perf/util/debug.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */

0 comments on commit c286c41

Please sign in to comment.