diff options
author | Arnaldo Carvalho de Melo <acme@redhat.com> | 2012-12-13 13:10:58 -0500 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2013-01-24 14:40:09 -0500 |
commit | 56e52e85366717481cde16b3480f015c7eb32ba3 (patch) | |
tree | 5e68bd51510915b6da7db8e0fdcc5fc766dd6b6a /tools/perf/builtin-record.c | |
parent | c0a54341c0e89333ef201fc3f3001176962f6121 (diff) |
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>
Diffstat (limited to 'tools/perf/builtin-record.c')
-rw-r--r-- | tools/perf/builtin-record.c | 54 |
1 files changed, 6 insertions, 48 deletions
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index b8d0a39b484e..de60dd4ee5d3 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c | |||
@@ -224,7 +224,7 @@ static bool perf_evlist__equal(struct perf_evlist *evlist, | |||
224 | 224 | ||
225 | static int perf_record__open(struct perf_record *rec) | 225 | static int perf_record__open(struct perf_record *rec) |
226 | { | 226 | { |
227 | char msg[128]; | 227 | char msg[512]; |
228 | struct perf_evsel *pos; | 228 | struct perf_evsel *pos; |
229 | struct perf_evlist *evlist = rec->evlist; | 229 | struct perf_evlist *evlist = rec->evlist; |
230 | struct perf_session *session = rec->session; | 230 | struct perf_session *session = rec->session; |
@@ -234,60 +234,18 @@ static int perf_record__open(struct perf_record *rec) | |||
234 | perf_evlist__config(evlist, opts); | 234 | perf_evlist__config(evlist, opts); |
235 | 235 | ||
236 | list_for_each_entry(pos, &evlist->entries, node) { | 236 | list_for_each_entry(pos, &evlist->entries, node) { |
237 | struct perf_event_attr *attr = &pos->attr; | ||
238 | try_again: | 237 | try_again: |
239 | if (perf_evsel__open(pos, evlist->cpus, evlist->threads) < 0) { | 238 | if (perf_evsel__open(pos, evlist->cpus, evlist->threads) < 0) { |
240 | int err = errno; | 239 | if (perf_evsel__fallback(pos, errno, msg, sizeof(msg))) { |
241 | |||
242 | if (err == EPERM || err == EACCES) { | ||
243 | ui__error_paranoid(); | ||
244 | rc = -err; | ||
245 | goto out; | ||
246 | } else if (err == ENODEV && opts->target.cpu_list) { | ||
247 | pr_err("No such device - did you specify" | ||
248 | " an out-of-range profile CPU?\n"); | ||
249 | rc = -err; | ||
250 | goto out; | ||
251 | } | ||
252 | |||
253 | if (perf_evsel__fallback(pos, err, msg, sizeof(msg))) { | ||
254 | if (verbose) | 240 | if (verbose) |
255 | ui__warning("%s\n", msg); | 241 | ui__warning("%s\n", msg); |
256 | goto try_again; | 242 | goto try_again; |
257 | } | 243 | } |
258 | 244 | ||
259 | if (err == ENOENT) { | 245 | rc = -errno; |
260 | ui__error("The %s event is not supported.\n", | 246 | perf_evsel__open_strerror(pos, &opts->target, |
261 | perf_evsel__name(pos)); | 247 | errno, msg, sizeof(msg)); |
262 | rc = -err; | 248 | ui__error("%s\n", msg); |
263 | goto out; | ||
264 | } else if ((err == EOPNOTSUPP) && (attr->precise_ip)) { | ||
265 | ui__error("\'precise\' request may not be supported. " | ||
266 | "Try removing 'p' modifier\n"); | ||
267 | rc = -err; | ||
268 | goto out; | ||
269 | } | ||
270 | |||
271 | printf("\n"); | ||
272 | error("sys_perf_event_open() syscall returned with %d " | ||
273 | "(%s) for event %s. /bin/dmesg may provide " | ||
274 | "additional information.\n", | ||
275 | err, strerror(err), perf_evsel__name(pos)); | ||
276 | |||
277 | #if defined(__i386__) || defined(__x86_64__) | ||
278 | if (attr->type == PERF_TYPE_HARDWARE && | ||
279 | err == EOPNOTSUPP) { | ||
280 | pr_err("No hardware sampling interrupt available." | ||
281 | " No APIC? If so then you can boot the kernel" | ||
282 | " with the \"lapic\" boot parameter to" | ||
283 | " force-enable it.\n"); | ||
284 | rc = -err; | ||
285 | goto out; | ||
286 | } | ||
287 | #endif | ||
288 | |||
289 | pr_err("No CONFIG_PERF_EVENTS=y kernel support configured?\n"); | ||
290 | rc = -err; | ||
291 | goto out; | 249 | goto out; |
292 | } | 250 | } |
293 | } | 251 | } |