diff options
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 | } |