perf evsel: Introduce perf_evsel__open_strerror method
That consolidates the error messages in 'record', 'stat' and 'top', that now get a consistent set of messages and allow other tools to use the new method to report problems using whatever UI toolkit. Cc: David Ahern <dsahern@gmail.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Mike Galbraith <efault@gmx.de> Cc: Namhyung Kim <namhyung@gmail.com> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephane Eranian <eranian@google.com> Link: http://lkml.kernel.org/n/tip-1cudb7wl996kz7ilz83ctvhr@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
@@ -16,6 +16,5 @@ void trace_event(union perf_event *event);
|
||||
|
||||
int ui__error(const char *format, ...) __attribute__((format(printf, 1, 2)));
|
||||
int ui__warning(const char *format, ...) __attribute__((format(printf, 1, 2)));
|
||||
int ui__error_paranoid(void);
|
||||
|
||||
#endif /* __PERF_DEBUG_H */
|
||||
|
@@ -1406,3 +1406,52 @@ bool perf_evsel__fallback(struct perf_evsel *evsel, int err,
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
int perf_evsel__open_strerror(struct perf_evsel *evsel,
|
||||
struct perf_target *target,
|
||||
int err, char *msg, size_t size)
|
||||
{
|
||||
switch (err) {
|
||||
case EPERM:
|
||||
case EACCES:
|
||||
return scnprintf(msg, size, "%s",
|
||||
"You may not have permission to collect %sstats.\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",
|
||||
target->system_wide ? "system-wide " : "");
|
||||
case ENOENT:
|
||||
return scnprintf(msg, size, "The %s event is not supported.",
|
||||
perf_evsel__name(evsel));
|
||||
case EMFILE:
|
||||
return scnprintf(msg, size, "%s",
|
||||
"Too many events are opened.\n"
|
||||
"Try again after reducing the number of events.");
|
||||
case ENODEV:
|
||||
if (target->cpu_list)
|
||||
return scnprintf(msg, size, "%s",
|
||||
"No such device - did you specify an out-of-range profile CPU?\n");
|
||||
break;
|
||||
case EOPNOTSUPP:
|
||||
if (evsel->attr.precise_ip)
|
||||
return scnprintf(msg, size, "%s",
|
||||
"\'precise\' request may not be supported. Try removing 'p' modifier.");
|
||||
#if defined(__i386__) || defined(__x86_64__)
|
||||
if (evsel->attr.type == PERF_TYPE_HARDWARE)
|
||||
return scnprintf(msg, size, "%s",
|
||||
"No hardware sampling interrupt available.\n"
|
||||
"No APIC? If so then you can boot the kernel with the \"lapic\" boot parameter to force-enable it.");
|
||||
#endif
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return scnprintf(msg, size,
|
||||
"The sys_perf_event_open() syscall returned with %d (%s) for event (%s). \n"
|
||||
"/bin/dmesg may provide additional information.\n"
|
||||
"No CONFIG_PERF_EVENTS=y kernel support configured?\n",
|
||||
err, strerror(err), perf_evsel__name(evsel));
|
||||
}
|
||||
|
@@ -254,4 +254,7 @@ int perf_evsel__fprintf(struct perf_evsel *evsel,
|
||||
|
||||
bool perf_evsel__fallback(struct perf_evsel *evsel, int err,
|
||||
char *msg, size_t msgsize);
|
||||
int perf_evsel__open_strerror(struct perf_evsel *evsel,
|
||||
struct perf_target *target,
|
||||
int err, char *msg, size_t size);
|
||||
#endif /* __PERF_EVSEL_H */
|
||||
|
Reference in New Issue
Block a user