aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/builtin-record.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf/builtin-record.c')
-rw-r--r--tools/perf/builtin-record.c54
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
225static int perf_record__open(struct perf_record *rec) 225static 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;
238try_again: 237try_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 }