diff options
Diffstat (limited to 'tools/perf/builtin-record.c')
-rw-r--r-- | tools/perf/builtin-record.c | 32 |
1 files changed, 23 insertions, 9 deletions
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index 6febcc168a8c..416538248a4b 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c | |||
@@ -41,7 +41,7 @@ static u64 user_interval = ULLONG_MAX; | |||
41 | static u64 default_interval = 0; | 41 | static u64 default_interval = 0; |
42 | 42 | ||
43 | static unsigned int page_size; | 43 | static unsigned int page_size; |
44 | static unsigned int mmap_pages = 128; | 44 | static unsigned int mmap_pages = UINT_MAX; |
45 | static unsigned int user_freq = UINT_MAX; | 45 | static unsigned int user_freq = UINT_MAX; |
46 | static int freq = 1000; | 46 | static int freq = 1000; |
47 | static int output; | 47 | static int output; |
@@ -163,6 +163,7 @@ static void config_attr(struct perf_evsel *evsel, struct perf_evlist *evlist) | |||
163 | struct perf_event_attr *attr = &evsel->attr; | 163 | struct perf_event_attr *attr = &evsel->attr; |
164 | int track = !evsel->idx; /* only the first counter needs these */ | 164 | int track = !evsel->idx; /* only the first counter needs these */ |
165 | 165 | ||
166 | attr->inherit = !no_inherit; | ||
166 | attr->read_format = PERF_FORMAT_TOTAL_TIME_ENABLED | | 167 | attr->read_format = PERF_FORMAT_TOTAL_TIME_ENABLED | |
167 | PERF_FORMAT_TOTAL_TIME_RUNNING | | 168 | PERF_FORMAT_TOTAL_TIME_RUNNING | |
168 | PERF_FORMAT_ID; | 169 | PERF_FORMAT_ID; |
@@ -251,6 +252,9 @@ static void open_counters(struct perf_evlist *evlist) | |||
251 | { | 252 | { |
252 | struct perf_evsel *pos; | 253 | struct perf_evsel *pos; |
253 | 254 | ||
255 | if (evlist->cpus->map[0] < 0) | ||
256 | no_inherit = true; | ||
257 | |||
254 | list_for_each_entry(pos, &evlist->entries, node) { | 258 | list_for_each_entry(pos, &evlist->entries, node) { |
255 | struct perf_event_attr *attr = &pos->attr; | 259 | struct perf_event_attr *attr = &pos->attr; |
256 | /* | 260 | /* |
@@ -271,15 +275,13 @@ static void open_counters(struct perf_evlist *evlist) | |||
271 | retry_sample_id: | 275 | retry_sample_id: |
272 | attr->sample_id_all = sample_id_all_avail ? 1 : 0; | 276 | attr->sample_id_all = sample_id_all_avail ? 1 : 0; |
273 | try_again: | 277 | try_again: |
274 | if (perf_evsel__open(pos, evlist->cpus, evlist->threads, group, | 278 | if (perf_evsel__open(pos, evlist->cpus, evlist->threads, group) < 0) { |
275 | !no_inherit) < 0) { | ||
276 | int err = errno; | 279 | int err = errno; |
277 | 280 | ||
278 | if (err == EPERM || err == EACCES) | 281 | if (err == EPERM || err == EACCES) { |
279 | die("Permission error - are you root?\n" | 282 | ui__warning_paranoid(); |
280 | "\t Consider tweaking" | 283 | exit(EXIT_FAILURE); |
281 | " /proc/sys/kernel/perf_event_paranoid.\n"); | 284 | } else if (err == ENODEV && cpu_list) { |
282 | else if (err == ENODEV && cpu_list) { | ||
283 | die("No such device - did you specify" | 285 | die("No such device - did you specify" |
284 | " an out-of-range profile CPU?\n"); | 286 | " an out-of-range profile CPU?\n"); |
285 | } else if (err == EINVAL && sample_id_all_avail) { | 287 | } else if (err == EINVAL && sample_id_all_avail) { |
@@ -302,11 +304,19 @@ try_again: | |||
302 | && attr->config == PERF_COUNT_HW_CPU_CYCLES) { | 304 | && attr->config == PERF_COUNT_HW_CPU_CYCLES) { |
303 | 305 | ||
304 | if (verbose) | 306 | if (verbose) |
305 | warning(" ... trying to fall back to cpu-clock-ticks\n"); | 307 | ui__warning("The cycles event is not supported, " |
308 | "trying to fall back to cpu-clock-ticks\n"); | ||
306 | attr->type = PERF_TYPE_SOFTWARE; | 309 | attr->type = PERF_TYPE_SOFTWARE; |
307 | attr->config = PERF_COUNT_SW_CPU_CLOCK; | 310 | attr->config = PERF_COUNT_SW_CPU_CLOCK; |
308 | goto try_again; | 311 | goto try_again; |
309 | } | 312 | } |
313 | |||
314 | if (err == ENOENT) { | ||
315 | ui__warning("The %s event is not supported.\n", | ||
316 | event_name(pos)); | ||
317 | exit(EXIT_FAILURE); | ||
318 | } | ||
319 | |||
310 | printf("\n"); | 320 | printf("\n"); |
311 | error("sys_perf_event_open() syscall returned with %d (%s). /bin/dmesg may provide additional information.\n", | 321 | error("sys_perf_event_open() syscall returned with %d (%s). /bin/dmesg may provide additional information.\n", |
312 | err, strerror(err)); | 322 | err, strerror(err)); |
@@ -506,6 +516,10 @@ static int __cmd_record(int argc, const char **argv) | |||
506 | if (have_tracepoints(&evsel_list->entries)) | 516 | if (have_tracepoints(&evsel_list->entries)) |
507 | perf_header__set_feat(&session->header, HEADER_TRACE_INFO); | 517 | perf_header__set_feat(&session->header, HEADER_TRACE_INFO); |
508 | 518 | ||
519 | /* 512 kiB: default amount of unprivileged mlocked memory */ | ||
520 | if (mmap_pages == UINT_MAX) | ||
521 | mmap_pages = (512 * 1024) / page_size; | ||
522 | |||
509 | if (forks) { | 523 | if (forks) { |
510 | child_pid = fork(); | 524 | child_pid = fork(); |
511 | if (child_pid < 0) { | 525 | if (child_pid < 0) { |