MAINTAINERS: Fix list of perf events source files
[linux-2.6-block.git] / tools / perf / builtin-record.c
CommitLineData
abaff32a 1/*
bf9e1876
IM
2 * builtin-record.c
3 *
4 * Builtin record command: Record the profile of a workload
5 * (or a CPU, or a PID) into the perf.data output file - for
6 * later analysis via perf report.
abaff32a 7 */
b8f46c5a
XG
8#define _FILE_OFFSET_BITS 64
9
16f762a2 10#include "builtin.h"
bf9e1876
IM
11
12#include "perf.h"
13
6122e4e4 14#include "util/build-id.h"
6eda5838 15#include "util/util.h"
0e9b20b8 16#include "util/parse-options.h"
8ad8db37 17#include "util/parse-events.h"
6eda5838 18
7c6a1c65 19#include "util/header.h"
66e274f3 20#include "util/event.h"
361c99a6 21#include "util/evlist.h"
69aad6f1 22#include "util/evsel.h"
8f28827a 23#include "util/debug.h"
94c744b6 24#include "util/session.h"
8d06367f 25#include "util/symbol.h"
a12b51c4 26#include "util/cpumap.h"
fd78260b 27#include "util/thread_map.h"
7c6a1c65 28
97124d5e 29#include <unistd.h>
de9ac07b 30#include <sched.h>
a41794cd 31#include <sys/mman.h>
de9ac07b 32
7865e817
FW
33enum write_mode_t {
34 WRITE_FORCE,
35 WRITE_APPEND
36};
37
3de29cab
SE
38static u64 user_interval = ULLONG_MAX;
39static u64 default_interval = 0;
a21ca2ca 40
de9ac07b 41static unsigned int page_size;
800cd25c 42static unsigned int mmap_pages = UINT_MAX;
f9212819 43static unsigned int user_freq = UINT_MAX;
42e59d7d 44static int freq = 1000;
de9ac07b 45static int output;
529870e3 46static int pipe_output = 0;
d7065adb 47static const char *output_name = NULL;
42e59d7d 48static int group = 0;
1967936d 49static int realtime_prio = 0;
acac03fa 50static bool nodelay = false;
c0555642 51static bool raw_samples = false;
9c90a61c 52static bool sample_id_all_avail = true;
c0555642 53static bool system_wide = false;
42e59d7d 54static pid_t target_pid = -1;
d6d901c2 55static pid_t target_tid = -1;
42e59d7d 56static pid_t child_pid = -1;
2e6cdf99 57static bool no_inherit = false;
7865e817 58static enum write_mode_t write_mode = WRITE_FORCE;
c0555642
IM
59static bool call_graph = false;
60static bool inherit_stat = false;
61static bool no_samples = false;
62static bool sample_address = false;
9c90a61c 63static bool sample_time = false;
a1ac1d3c 64static bool no_buildid = false;
baa2f6ce 65static bool no_buildid_cache = false;
361c99a6 66static struct perf_evlist *evsel_list;
42e59d7d
IM
67
68static long samples = 0;
42e59d7d 69static u64 bytes_written = 0;
a21ca2ca 70
42e59d7d 71static int file_new = 1;
6122e4e4 72static off_t post_processing_offset;
7c6a1c65 73
94c744b6 74static struct perf_session *session;
c45c6ea2 75static const char *cpu_list;
f5970550 76
9215545e
TZ
77static void advance_output(size_t size)
78{
79 bytes_written += size;
80}
81
f5970550
PZ
82static void write_output(void *buf, size_t size)
83{
84 while (size) {
85 int ret = write(output, buf, size);
86
87 if (ret < 0)
88 die("failed to write");
89
90 size -= ret;
91 buf += ret;
92
93 bytes_written += ret;
94 }
95}
96
8115d60c 97static int process_synthesized_event(union perf_event *event,
8d50e5b4 98 struct perf_sample *sample __used,
d8f66248 99 struct perf_session *self __used)
234fbbf5 100{
6122e4e4 101 write_output(event, event->header.size);
234fbbf5
ACM
102 return 0;
103}
104
744bd8aa 105static void mmap_read(struct perf_mmap *md)
de9ac07b 106{
744bd8aa 107 unsigned int head = perf_mmap__read_head(md);
de9ac07b
PZ
108 unsigned int old = md->prev;
109 unsigned char *data = md->base + page_size;
110 unsigned long size;
111 void *buf;
de9ac07b 112
dc82009a
ACM
113 if (old == head)
114 return;
115
116 samples++;
de9ac07b
PZ
117
118 size = head - old;
119
120 if ((old & md->mask) + size != (head & md->mask)) {
121 buf = &data[old & md->mask];
122 size = md->mask + 1 - (old & md->mask);
123 old += size;
021e9f47 124
6122e4e4 125 write_output(buf, size);
de9ac07b
PZ
126 }
127
128 buf = &data[old & md->mask];
129 size = head - old;
130 old += size;
021e9f47 131
6122e4e4 132 write_output(buf, size);
de9ac07b
PZ
133
134 md->prev = old;
115d2d89 135 perf_mmap__write_tail(md, old);
de9ac07b
PZ
136}
137
138static volatile int done = 0;
f7b7c26e 139static volatile int signr = -1;
de9ac07b 140
16c8a109 141static void sig_handler(int sig)
de9ac07b 142{
16c8a109 143 done = 1;
f7b7c26e
PZ
144 signr = sig;
145}
146
147static void sig_atexit(void)
148{
5ffc8881 149 if (child_pid > 0)
933da83a
CW
150 kill(child_pid, SIGTERM);
151
18483b81 152 if (signr == -1 || signr == SIGUSR1)
f7b7c26e
PZ
153 return;
154
155 signal(signr, SIG_DFL);
156 kill(getpid(), signr);
de9ac07b
PZ
157}
158
dd7927f4
ACM
159static void config_attr(struct perf_evsel *evsel, struct perf_evlist *evlist)
160{
161 struct perf_event_attr *attr = &evsel->attr;
162 int track = !evsel->idx; /* only the first counter needs these */
7c6a1c65 163
5d2cd909 164 attr->inherit = !no_inherit;
7c6a1c65
PZ
165 attr->read_format = PERF_FORMAT_TOTAL_TIME_ENABLED |
166 PERF_FORMAT_TOTAL_TIME_RUNNING |
167 PERF_FORMAT_ID;
16c8a109 168
3a9f131f 169 attr->sample_type |= PERF_SAMPLE_IP | PERF_SAMPLE_TID;
3efa1cc9 170
361c99a6 171 if (evlist->nr_entries > 1)
8907fd60
EM
172 attr->sample_type |= PERF_SAMPLE_ID;
173
f9212819
FW
174 /*
175 * We default some events to a 1 default interval. But keep
176 * it a weak assumption overridable by the user.
177 */
178 if (!attr->sample_period || (user_freq != UINT_MAX &&
3de29cab 179 user_interval != ULLONG_MAX)) {
f9212819
FW
180 if (freq) {
181 attr->sample_type |= PERF_SAMPLE_PERIOD;
182 attr->freq = 1;
183 attr->sample_freq = freq;
184 } else {
185 attr->sample_period = default_interval;
186 }
1dba15e7 187 }
3efa1cc9 188
649c48a9
PZ
189 if (no_samples)
190 attr->sample_freq = 0;
191
192 if (inherit_stat)
193 attr->inherit_stat = 1;
194
3af9e859 195 if (sample_address) {
4bba828d 196 attr->sample_type |= PERF_SAMPLE_ADDR;
3af9e859
EM
197 attr->mmap_data = track;
198 }
4bba828d 199
3efa1cc9
IM
200 if (call_graph)
201 attr->sample_type |= PERF_SAMPLE_CALLCHAIN;
202
f60f3593
AS
203 if (system_wide)
204 attr->sample_type |= PERF_SAMPLE_CPU;
205
a43d3f08
ACM
206 if (sample_id_all_avail &&
207 (sample_time || system_wide || !no_inherit || cpu_list))
9c90a61c
ACM
208 attr->sample_type |= PERF_SAMPLE_TIME;
209
cd6feeea 210 if (raw_samples) {
6ddf259d 211 attr->sample_type |= PERF_SAMPLE_TIME;
daac07b2 212 attr->sample_type |= PERF_SAMPLE_RAW;
cd6feeea
IM
213 attr->sample_type |= PERF_SAMPLE_CPU;
214 }
f413cdb8 215
acac03fa
KS
216 if (nodelay) {
217 attr->watermark = 0;
218 attr->wakeup_events = 1;
219 }
220
a21ca2ca
IM
221 attr->mmap = track;
222 attr->comm = track;
dd7927f4 223
2e6cdf99 224 if (target_pid == -1 && target_tid == -1 && !system_wide) {
46be604b 225 attr->disabled = 1;
bedbfdea 226 attr->enable_on_exec = 1;
46be604b 227 }
dd7927f4 228}
bedbfdea 229
a91e5431
ACM
230static bool perf_evlist__equal(struct perf_evlist *evlist,
231 struct perf_evlist *other)
232{
233 struct perf_evsel *pos, *pair;
234
235 if (evlist->nr_entries != other->nr_entries)
236 return false;
237
238 pair = list_entry(other->entries.next, struct perf_evsel, node);
239
240 list_for_each_entry(pos, &evlist->entries, node) {
241 if (memcmp(&pos->attr, &pair->attr, sizeof(pos->attr) != 0))
242 return false;
243 pair = list_entry(pair->node.next, struct perf_evsel, node);
244 }
245
246 return true;
247}
248
dd7927f4
ACM
249static void open_counters(struct perf_evlist *evlist)
250{
251 struct perf_evsel *pos;
dd7927f4 252
5d2cd909
ACM
253 if (evlist->cpus->map[0] < 0)
254 no_inherit = true;
255
dd7927f4
ACM
256 list_for_each_entry(pos, &evlist->entries, node) {
257 struct perf_event_attr *attr = &pos->attr;
258 /*
259 * Check if parse_single_tracepoint_event has already asked for
260 * PERF_SAMPLE_TIME.
261 *
262 * XXX this is kludgy but short term fix for problems introduced by
263 * eac23d1c that broke 'perf script' by having different sample_types
264 * when using multiple tracepoint events when we use a perf binary
265 * that tries to use sample_id_all on an older kernel.
266 *
267 * We need to move counter creation to perf_session, support
268 * different sample_types, etc.
269 */
270 bool time_needed = attr->sample_type & PERF_SAMPLE_TIME;
d6d901c2 271
dd7927f4
ACM
272 config_attr(pos, evlist);
273retry_sample_id:
274 attr->sample_id_all = sample_id_all_avail ? 1 : 0;
275try_again:
5d2cd909 276 if (perf_evsel__open(pos, evlist->cpus, evlist->threads, group) < 0) {
d6d901c2
ZY
277 int err = errno;
278
c286c419
ACM
279 if (err == EPERM || err == EACCES) {
280 ui__warning_paranoid();
281 exit(EXIT_FAILURE);
282 } else if (err == ENODEV && cpu_list) {
d6d901c2
ZY
283 die("No such device - did you specify"
284 " an out-of-range profile CPU?\n");
9c90a61c
ACM
285 } else if (err == EINVAL && sample_id_all_avail) {
286 /*
287 * Old kernel, no attr->sample_id_type_all field
288 */
289 sample_id_all_avail = false;
a43d3f08 290 if (!sample_time && !raw_samples && !time_needed)
eac23d1c
IM
291 attr->sample_type &= ~PERF_SAMPLE_TIME;
292
9c90a61c 293 goto retry_sample_id;
d6d901c2 294 }
3da297a6 295
d6d901c2
ZY
296 /*
297 * If it's cycles then fall back to hrtimer
298 * based cpu-clock-tick sw counter, which
299 * is always available even if no PMU support:
300 */
301 if (attr->type == PERF_TYPE_HARDWARE
302 && attr->config == PERF_COUNT_HW_CPU_CYCLES) {
303
304 if (verbose)
ca6a4258
DA
305 ui__warning("The cycles event is not supported, "
306 "trying to fall back to cpu-clock-ticks\n");
d6d901c2
ZY
307 attr->type = PERF_TYPE_SOFTWARE;
308 attr->config = PERF_COUNT_SW_CPU_CLOCK;
309 goto try_again;
310 }
ca6a4258
DA
311
312 if (err == ENOENT) {
313 ui__warning("The %s event is not supported.\n",
314 event_name(pos));
315 exit(EXIT_FAILURE);
316 }
317
d6d901c2 318 printf("\n");
d9cf837e 319 error("sys_perf_event_open() syscall returned with %d (%s). /bin/dmesg may provide additional information.\n",
dd7927f4 320 err, strerror(err));
bfd45118
SK
321
322#if defined(__i386__) || defined(__x86_64__)
d6d901c2
ZY
323 if (attr->type == PERF_TYPE_HARDWARE && err == EOPNOTSUPP)
324 die("No hardware sampling interrupt available."
325 " No APIC? If so then you can boot the kernel"
326 " with the \"lapic\" boot parameter to"
327 " force-enable it.\n");
bfd45118
SK
328#endif
329
d6d901c2 330 die("No CONFIG_PERF_EVENTS=y kernel support configured?\n");
c171b552
LZ
331 }
332 }
a43d3f08 333
0a102479
FW
334 if (perf_evlist__set_filters(evlist)) {
335 error("failed to set filter with %d (%s)\n", errno,
336 strerror(errno));
337 exit(-1);
338 }
339
7e2ed097 340 if (perf_evlist__mmap(evlist, mmap_pages, false) < 0)
0a27d7f9
ACM
341 die("failed to mmap with %d (%s)\n", errno, strerror(errno));
342
a91e5431
ACM
343 if (file_new)
344 session->evlist = evlist;
345 else {
346 if (!perf_evlist__equal(session->evlist, evlist)) {
347 fprintf(stderr, "incompatible append\n");
348 exit(-1);
349 }
350 }
351
352 perf_session__update_sample_type(session);
16c8a109
PZ
353}
354
6122e4e4
ACM
355static int process_buildids(void)
356{
357 u64 size = lseek(output, 0, SEEK_CUR);
358
9f591fd7
ACM
359 if (size == 0)
360 return 0;
361
6122e4e4
ACM
362 session->fd = output;
363 return __perf_session__process_events(session, post_processing_offset,
364 size - post_processing_offset,
365 size, &build_id__mark_dso_hit_ops);
366}
367
f5970550
PZ
368static void atexit_header(void)
369{
c7929e47
TZ
370 if (!pipe_output) {
371 session->header.data_size += bytes_written;
f5970550 372
baa2f6ce
ACM
373 if (!no_buildid)
374 process_buildids();
a91e5431 375 perf_session__write_header(session, evsel_list, output, true);
39d17dac 376 perf_session__delete(session);
361c99a6 377 perf_evlist__delete(evsel_list);
d65a458b 378 symbol__exit();
c7929e47 379 }
f5970550
PZ
380}
381
8115d60c 382static void perf_event__synthesize_guest_os(struct machine *machine, void *data)
a1645ce1
ZY
383{
384 int err;
23346f21 385 struct perf_session *psession = data;
a1645ce1 386
23346f21 387 if (machine__is_host(machine))
a1645ce1
ZY
388 return;
389
390 /*
391 *As for guest kernel when processing subcommand record&report,
392 *we arrange module mmap prior to guest kernel mmap and trigger
393 *a preload dso because default guest module symbols are loaded
394 *from guest kallsyms instead of /lib/modules/XXX/XXX. This
395 *method is used to avoid symbol missing when the first addr is
396 *in module instead of in guest kernel.
397 */
8115d60c
ACM
398 err = perf_event__synthesize_modules(process_synthesized_event,
399 psession, machine);
a1645ce1
ZY
400 if (err < 0)
401 pr_err("Couldn't record guest kernel [%d]'s reference"
23346f21 402 " relocation symbol.\n", machine->pid);
a1645ce1 403
a1645ce1
ZY
404 /*
405 * We use _stext for guest kernel because guest kernel's /proc/kallsyms
406 * have no _text sometimes.
407 */
8115d60c
ACM
408 err = perf_event__synthesize_kernel_mmap(process_synthesized_event,
409 psession, machine, "_text");
a1645ce1 410 if (err < 0)
8115d60c
ACM
411 err = perf_event__synthesize_kernel_mmap(process_synthesized_event,
412 psession, machine,
413 "_stext");
a1645ce1
ZY
414 if (err < 0)
415 pr_err("Couldn't record guest kernel [%d]'s reference"
23346f21 416 " relocation symbol.\n", machine->pid);
a1645ce1
ZY
417}
418
98402807
FW
419static struct perf_event_header finished_round_event = {
420 .size = sizeof(struct perf_event_header),
421 .type = PERF_RECORD_FINISHED_ROUND,
422};
423
424static void mmap_read_all(void)
425{
0e2e63dd 426 int i;
98402807 427
aece948f 428 for (i = 0; i < evsel_list->nr_mmaps; i++) {
0a27d7f9
ACM
429 if (evsel_list->mmap[i].base)
430 mmap_read(&evsel_list->mmap[i]);
98402807
FW
431 }
432
433 if (perf_header__has_feat(&session->header, HEADER_TRACE_INFO))
434 write_output(&finished_round_event, sizeof(finished_round_event));
435}
436
d4db3f16 437static int __cmd_record(int argc, const char **argv)
16c8a109 438{
abaff32a 439 struct stat st;
abaff32a 440 int flags;
4dc0a04b 441 int err;
8b412664 442 unsigned long waking = 0;
856e9660 443 int child_ready_pipe[2], go_pipe[2];
46be604b 444 const bool forks = argc > 0;
856e9660 445 char buf;
23346f21 446 struct machine *machine;
de9ac07b
PZ
447
448 page_size = sysconf(_SC_PAGE_SIZE);
de9ac07b 449
f5970550
PZ
450 atexit(sig_atexit);
451 signal(SIGCHLD, sig_handler);
452 signal(SIGINT, sig_handler);
18483b81 453 signal(SIGUSR1, sig_handler);
f5970550 454
d4db3f16 455 if (forks && (pipe(child_ready_pipe) < 0 || pipe(go_pipe) < 0)) {
856e9660
PZ
456 perror("failed to create pipes");
457 exit(-1);
458 }
459
d7065adb
FBH
460 if (!output_name) {
461 if (!fstat(STDOUT_FILENO, &st) && S_ISFIFO(st.st_mode))
462 pipe_output = 1;
463 else
464 output_name = "perf.data";
465 }
466 if (output_name) {
467 if (!strcmp(output_name, "-"))
468 pipe_output = 1;
469 else if (!stat(output_name, &st) && st.st_size) {
470 if (write_mode == WRITE_FORCE) {
471 char oldname[PATH_MAX];
472 snprintf(oldname, sizeof(oldname), "%s.old",
473 output_name);
474 unlink(oldname);
475 rename(output_name, oldname);
476 }
477 } else if (write_mode == WRITE_APPEND) {
478 write_mode = WRITE_FORCE;
266e0e21 479 }
97124d5e
PZ
480 }
481
f887f301 482 flags = O_CREAT|O_RDWR;
7865e817 483 if (write_mode == WRITE_APPEND)
f5970550 484 file_new = 0;
abaff32a
IM
485 else
486 flags |= O_TRUNC;
487
529870e3
TZ
488 if (pipe_output)
489 output = STDOUT_FILENO;
490 else
491 output = open(output_name, flags, S_IRUSR | S_IWUSR);
de9ac07b
PZ
492 if (output < 0) {
493 perror("failed to create output file");
494 exit(-1);
495 }
496
7865e817 497 session = perf_session__new(output_name, O_WRONLY,
21ef97f0 498 write_mode == WRITE_FORCE, false, NULL);
94c744b6 499 if (session == NULL) {
a9a70bbc
ACM
500 pr_err("Not enough memory for reading perf file header\n");
501 return -1;
502 }
503
baa2f6ce
ACM
504 if (!no_buildid)
505 perf_header__set_feat(&session->header, HEADER_BUILD_ID);
506
4dc0a04b 507 if (!file_new) {
a91e5431 508 err = perf_session__read_header(session, output);
4dc0a04b 509 if (err < 0)
39d17dac 510 goto out_delete_session;
4dc0a04b
ACM
511 }
512
361c99a6 513 if (have_tracepoints(&evsel_list->entries))
94c744b6 514 perf_header__set_feat(&session->header, HEADER_TRACE_INFO);
03456a15 515
800cd25c
FW
516 /* 512 kiB: default amount of unprivileged mlocked memory */
517 if (mmap_pages == UINT_MAX)
518 mmap_pages = (512 * 1024) / page_size;
519
d4db3f16 520 if (forks) {
46be604b 521 child_pid = fork();
2fb750e8 522 if (child_pid < 0) {
856e9660
PZ
523 perror("failed to fork");
524 exit(-1);
525 }
7c6a1c65 526
46be604b 527 if (!child_pid) {
529870e3
TZ
528 if (pipe_output)
529 dup2(2, 1);
856e9660
PZ
530 close(child_ready_pipe[0]);
531 close(go_pipe[1]);
532 fcntl(go_pipe[0], F_SETFD, FD_CLOEXEC);
533
534 /*
535 * Do a dummy execvp to get the PLT entry resolved,
536 * so we avoid the resolver overhead on the real
537 * execvp call.
538 */
539 execvp("", (char **)argv);
540
541 /*
542 * Tell the parent we're ready to go
543 */
544 close(child_ready_pipe[1]);
545
546 /*
547 * Wait until the parent tells us to go.
548 */
549 if (read(go_pipe[0], &buf, 1) == -1)
550 perror("unable to read pipe");
551
552 execvp(argv[0], (char **)argv);
553
554 perror(argv[0]);
18483b81 555 kill(getppid(), SIGUSR1);
856e9660 556 exit(-1);
0a5ac846 557 }
856e9660 558
d6d901c2 559 if (!system_wide && target_tid == -1 && target_pid == -1)
7e2ed097 560 evsel_list->threads->map[0] = child_pid;
d6d901c2 561
856e9660
PZ
562 close(child_ready_pipe[1]);
563 close(go_pipe[0]);
564 /*
565 * wait for child to settle
566 */
567 if (read(child_ready_pipe[0], &buf, 1) == -1) {
568 perror("unable to read pipe");
569 exit(-1);
570 }
571 close(child_ready_pipe[0]);
572 }
573
dd7927f4 574 open_counters(evsel_list);
de9ac07b 575
712a4b60
ACM
576 /*
577 * perf_session__delete(session) will be called at atexit_header()
578 */
579 atexit(atexit_header);
580
529870e3
TZ
581 if (pipe_output) {
582 err = perf_header__write_pipe(output);
583 if (err < 0)
584 return err;
585 } else if (file_new) {
a91e5431
ACM
586 err = perf_session__write_header(session, evsel_list,
587 output, false);
d5eed904
ACM
588 if (err < 0)
589 return err;
56b03f3c
ACM
590 }
591
6122e4e4
ACM
592 post_processing_offset = lseek(output, 0, SEEK_CUR);
593
2c46dbb5 594 if (pipe_output) {
a91e5431
ACM
595 err = perf_session__synthesize_attrs(session,
596 process_synthesized_event);
2c46dbb5
TZ
597 if (err < 0) {
598 pr_err("Couldn't synthesize attrs.\n");
599 return err;
600 }
cd19a035 601
8115d60c
ACM
602 err = perf_event__synthesize_event_types(process_synthesized_event,
603 session);
cd19a035
TZ
604 if (err < 0) {
605 pr_err("Couldn't synthesize event_types.\n");
606 return err;
607 }
9215545e 608
361c99a6 609 if (have_tracepoints(&evsel_list->entries)) {
63e0c771
TZ
610 /*
611 * FIXME err <= 0 here actually means that
612 * there were no tracepoints so its not really
613 * an error, just that we don't need to
614 * synthesize anything. We really have to
615 * return this more properly and also
616 * propagate errors that now are calling die()
617 */
8115d60c
ACM
618 err = perf_event__synthesize_tracing_data(output, evsel_list,
619 process_synthesized_event,
620 session);
63e0c771
TZ
621 if (err <= 0) {
622 pr_err("Couldn't record tracing data.\n");
623 return err;
624 }
2c9faa06 625 advance_output(err);
63e0c771 626 }
2c46dbb5
TZ
627 }
628
23346f21
ACM
629 machine = perf_session__find_host_machine(session);
630 if (!machine) {
a1645ce1
ZY
631 pr_err("Couldn't find native kernel information.\n");
632 return -1;
633 }
634
8115d60c
ACM
635 err = perf_event__synthesize_kernel_mmap(process_synthesized_event,
636 session, machine, "_text");
70162138 637 if (err < 0)
8115d60c
ACM
638 err = perf_event__synthesize_kernel_mmap(process_synthesized_event,
639 session, machine, "_stext");
c1a3a4b9
ACM
640 if (err < 0)
641 pr_err("Couldn't record kernel reference relocation symbol\n"
642 "Symbol resolution may be skewed if relocation was used (e.g. kexec).\n"
643 "Check /proc/kallsyms permission or run as root.\n");
b7cece76 644
8115d60c
ACM
645 err = perf_event__synthesize_modules(process_synthesized_event,
646 session, machine);
c1a3a4b9
ACM
647 if (err < 0)
648 pr_err("Couldn't record kernel module information.\n"
649 "Symbol resolution may be skewed if relocation was used (e.g. kexec).\n"
650 "Check /proc/modules permission or run as root.\n");
651
a1645ce1 652 if (perf_guest)
8115d60c
ACM
653 perf_session__process_machines(session,
654 perf_event__synthesize_guest_os);
7c6a1c65 655
cf103a14 656 if (!system_wide)
7c940c18
ACM
657 perf_event__synthesize_thread_map(evsel_list->threads,
658 process_synthesized_event,
659 session);
234fbbf5 660 else
8115d60c
ACM
661 perf_event__synthesize_threads(process_synthesized_event,
662 session);
7c6a1c65 663
de9ac07b
PZ
664 if (realtime_prio) {
665 struct sched_param param;
666
667 param.sched_priority = realtime_prio;
668 if (sched_setscheduler(0, SCHED_FIFO, &param)) {
6beba7ad 669 pr_err("Could not set realtime priority.\n");
de9ac07b
PZ
670 exit(-1);
671 }
672 }
673
856e9660
PZ
674 /*
675 * Let the child rip
676 */
d4db3f16
ACM
677 if (forks)
678 close(go_pipe[1]);
856e9660 679
649c48a9 680 for (;;) {
2debbc83 681 int hits = samples;
de9ac07b 682
98402807 683 mmap_read_all();
de9ac07b 684
649c48a9
PZ
685 if (hits == samples) {
686 if (done)
687 break;
5c581041 688 err = poll(evsel_list->pollfd, evsel_list->nr_fds, -1);
8b412664
PZ
689 waking++;
690 }
691
4152ab37
ACM
692 if (done)
693 perf_evlist__disable(evsel_list);
de9ac07b
PZ
694 }
695
18483b81 696 if (quiet || signr == SIGUSR1)
b44308f5
ACM
697 return 0;
698
8b412664
PZ
699 fprintf(stderr, "[ perf record: Woken up %ld times to write data ]\n", waking);
700
021e9f47
IM
701 /*
702 * Approximate RIP event size: 24 bytes.
703 */
704 fprintf(stderr,
9486aa38 705 "[ perf record: Captured and wrote %.3f MB %s (~%" PRIu64 " samples) ]\n",
021e9f47
IM
706 (double)bytes_written / 1024.0 / 1024.0,
707 output_name,
708 bytes_written / 24);
addc2785 709
de9ac07b 710 return 0;
39d17dac
ACM
711
712out_delete_session:
713 perf_session__delete(session);
714 return err;
de9ac07b 715}
0e9b20b8 716
0e9b20b8 717static const char * const record_usage[] = {
9e096753
MG
718 "perf record [<options>] [<command>]",
719 "perf record [<options>] -- <command> [<options>]",
0e9b20b8
IM
720 NULL
721};
722
7865e817
FW
723static bool force, append_file;
724
bca647aa 725const struct option record_options[] = {
361c99a6 726 OPT_CALLBACK('e', "event", &evsel_list, "event",
86847b62 727 "event selector. use 'perf list' to list available events",
f120f9d5 728 parse_events_option),
361c99a6 729 OPT_CALLBACK(0, "filter", &evsel_list, "filter",
c171b552 730 "event filter", parse_filter),
0e9b20b8 731 OPT_INTEGER('p', "pid", &target_pid,
d6d901c2
ZY
732 "record events on existing process id"),
733 OPT_INTEGER('t', "tid", &target_tid,
734 "record events on existing thread id"),
0e9b20b8
IM
735 OPT_INTEGER('r', "realtime", &realtime_prio,
736 "collect data with this RT SCHED_FIFO priority"),
acac03fa
KS
737 OPT_BOOLEAN('D', "no-delay", &nodelay,
738 "collect data without buffering"),
daac07b2
FW
739 OPT_BOOLEAN('R', "raw-samples", &raw_samples,
740 "collect raw sample records from all opened counters"),
0e9b20b8
IM
741 OPT_BOOLEAN('a', "all-cpus", &system_wide,
742 "system-wide collection from all CPUs"),
abaff32a
IM
743 OPT_BOOLEAN('A', "append", &append_file,
744 "append to the output file to do incremental profiling"),
c45c6ea2
SE
745 OPT_STRING('C', "cpu", &cpu_list, "cpu",
746 "list of cpus to monitor"),
97124d5e 747 OPT_BOOLEAN('f', "force", &force,
7865e817 748 "overwrite existing data file (deprecated)"),
3de29cab 749 OPT_U64('c', "count", &user_interval, "event period to sample"),
abaff32a
IM
750 OPT_STRING('o', "output", &output_name, "file",
751 "output file name"),
2e6cdf99
SE
752 OPT_BOOLEAN('i', "no-inherit", &no_inherit,
753 "child tasks do not inherit counters"),
1967936d
ACM
754 OPT_UINTEGER('F', "freq", &user_freq, "profile at this frequency"),
755 OPT_UINTEGER('m', "mmap-pages", &mmap_pages, "number of mmap data pages"),
3efa1cc9
IM
756 OPT_BOOLEAN('g', "call-graph", &call_graph,
757 "do call-graph (stack chain/backtrace) recording"),
c0555642 758 OPT_INCR('v', "verbose", &verbose,
3da297a6 759 "be more verbose (show counter open errors, etc)"),
b44308f5 760 OPT_BOOLEAN('q', "quiet", &quiet, "don't print any message"),
649c48a9
PZ
761 OPT_BOOLEAN('s', "stat", &inherit_stat,
762 "per thread counts"),
4bba828d
AB
763 OPT_BOOLEAN('d', "data", &sample_address,
764 "Sample addresses"),
9c90a61c 765 OPT_BOOLEAN('T', "timestamp", &sample_time, "Sample timestamps"),
649c48a9
PZ
766 OPT_BOOLEAN('n', "no-samples", &no_samples,
767 "don't sample"),
baa2f6ce 768 OPT_BOOLEAN('N', "no-buildid-cache", &no_buildid_cache,
a1ac1d3c 769 "do not update the buildid cache"),
baa2f6ce
ACM
770 OPT_BOOLEAN('B', "no-buildid", &no_buildid,
771 "do not collect buildids in perf.data"),
023695d9
SE
772 OPT_CALLBACK('G', "cgroup", &evsel_list, "name",
773 "monitor event in cgroup name only",
774 parse_cgroups),
0e9b20b8
IM
775 OPT_END()
776};
777
f37a291c 778int cmd_record(int argc, const char **argv, const char *prefix __used)
0e9b20b8 779{
69aad6f1
ACM
780 int err = -ENOMEM;
781 struct perf_evsel *pos;
0e9b20b8 782
7e2ed097 783 evsel_list = perf_evlist__new(NULL, NULL);
361c99a6
ACM
784 if (evsel_list == NULL)
785 return -ENOMEM;
786
bca647aa 787 argc = parse_options(argc, argv, record_options, record_usage,
655000e7 788 PARSE_OPT_STOP_AT_NON_OPTION);
d6d901c2 789 if (!argc && target_pid == -1 && target_tid == -1 &&
c45c6ea2 790 !system_wide && !cpu_list)
bca647aa 791 usage_with_options(record_usage, record_options);
0e9b20b8 792
7865e817
FW
793 if (force && append_file) {
794 fprintf(stderr, "Can't overwrite and append at the same time."
795 " You need to choose between -f and -A");
bca647aa 796 usage_with_options(record_usage, record_options);
7865e817
FW
797 } else if (append_file) {
798 write_mode = WRITE_APPEND;
799 } else {
800 write_mode = WRITE_FORCE;
801 }
802
023695d9
SE
803 if (nr_cgroups && !system_wide) {
804 fprintf(stderr, "cgroup monitoring only available in"
805 " system-wide mode\n");
806 usage_with_options(record_usage, record_options);
807 }
808
655000e7 809 symbol__init();
baa2f6ce 810
ec80fde7 811 if (symbol_conf.kptr_restrict)
646aaea6
ACM
812 pr_warning(
813"WARNING: Kernel address maps (/proc/{kallsyms,modules}) are restricted,\n"
814"check /proc/sys/kernel/kptr_restrict.\n\n"
815"Samples in kernel functions may not be resolved if a suitable vmlinux\n"
816"file is not found in the buildid cache or in the vmlinux path.\n\n"
817"Samples in kernel modules won't be resolved at all.\n\n"
818"If some relocation was applied (e.g. kexec) symbols may be misresolved\n"
819"even with a suitable vmlinux or kallsyms file.\n\n");
ec80fde7 820
baa2f6ce 821 if (no_buildid_cache || no_buildid)
a1ac1d3c 822 disable_buildid_cache();
655000e7 823
361c99a6
ACM
824 if (evsel_list->nr_entries == 0 &&
825 perf_evlist__add_default(evsel_list) < 0) {
69aad6f1
ACM
826 pr_err("Not enough memory for event selector list\n");
827 goto out_symbol_exit;
bbd36e5e 828 }
0e9b20b8 829
5c98d466 830 if (target_pid != -1)
d6d901c2 831 target_tid = target_pid;
d6d901c2 832
7e2ed097
ACM
833 if (perf_evlist__create_maps(evsel_list, target_pid,
834 target_tid, cpu_list) < 0)
dd7927f4 835 usage_with_options(record_usage, record_options);
69aad6f1 836
361c99a6 837 list_for_each_entry(pos, &evsel_list->entries, node) {
7e2ed097
ACM
838 if (perf_evsel__alloc_fd(pos, evsel_list->cpus->nr,
839 evsel_list->threads->nr) < 0)
69aad6f1 840 goto out_free_fd;
ad7f4e3f
ACM
841 if (perf_header__push_event(pos->attr.config, event_name(pos)))
842 goto out_free_fd;
d6d901c2 843 }
5c581041 844
7e2ed097 845 if (perf_evlist__alloc_pollfd(evsel_list) < 0)
39d17dac 846 goto out_free_fd;
d6d901c2 847
3de29cab 848 if (user_interval != ULLONG_MAX)
f9212819
FW
849 default_interval = user_interval;
850 if (user_freq != UINT_MAX)
851 freq = user_freq;
852
7e4ff9e3
MG
853 /*
854 * User specified count overrides default frequency.
855 */
856 if (default_interval)
857 freq = 0;
858 else if (freq) {
859 default_interval = freq;
860 } else {
861 fprintf(stderr, "frequency and count are zero, aborting\n");
39d17dac 862 err = -EINVAL;
5c581041 863 goto out_free_fd;
7e4ff9e3
MG
864 }
865
39d17dac 866 err = __cmd_record(argc, argv);
39d17dac 867out_free_fd:
7e2ed097 868 perf_evlist__delete_maps(evsel_list);
d65a458b
ACM
869out_symbol_exit:
870 symbol__exit();
39d17dac 871 return err;
0e9b20b8 872}