perf probe: Do not use dwfl_module_addrsym if dwarf_diename finds symbol name
[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 */
16f762a2 8#include "builtin.h"
bf9e1876
IM
9
10#include "perf.h"
11
6122e4e4 12#include "util/build-id.h"
6eda5838 13#include "util/util.h"
0e9b20b8 14#include "util/parse-options.h"
8ad8db37 15#include "util/parse-events.h"
6eda5838 16
7c6a1c65 17#include "util/header.h"
66e274f3 18#include "util/event.h"
361c99a6 19#include "util/evlist.h"
69aad6f1 20#include "util/evsel.h"
8f28827a 21#include "util/debug.h"
94c744b6 22#include "util/session.h"
45694aa7 23#include "util/tool.h"
8d06367f 24#include "util/symbol.h"
a12b51c4 25#include "util/cpumap.h"
fd78260b 26#include "util/thread_map.h"
f5fc1412 27#include "util/data.h"
7c6a1c65 28
97124d5e 29#include <unistd.h>
de9ac07b 30#include <sched.h>
a41794cd 31#include <sys/mman.h>
de9ac07b 32
78da39fa 33
8c6f45a7 34struct record {
45694aa7 35 struct perf_tool tool;
b4006796 36 struct record_opts opts;
d20deb64 37 u64 bytes_written;
f5fc1412 38 struct perf_data_file file;
d20deb64
ACM
39 struct perf_evlist *evlist;
40 struct perf_session *session;
41 const char *progname;
d20deb64 42 int realtime_prio;
d20deb64
ACM
43 bool no_buildid;
44 bool no_buildid_cache;
d20deb64 45 long samples;
0f82ebc4 46};
a21ca2ca 47
8c6f45a7 48static int record__write(struct record *rec, void *bf, size_t size)
f5970550 49{
cf8b2e69 50 if (perf_data_file__write(rec->session->file, bf, size) < 0) {
50a9b868
JO
51 pr_err("failed to write perf data, error: %m\n");
52 return -1;
f5970550 53 }
8d3eca20 54
cf8b2e69 55 rec->bytes_written += size;
8d3eca20 56 return 0;
f5970550
PZ
57}
58
45694aa7 59static int process_synthesized_event(struct perf_tool *tool,
d20deb64 60 union perf_event *event,
1d037ca1
IT
61 struct perf_sample *sample __maybe_unused,
62 struct machine *machine __maybe_unused)
234fbbf5 63{
8c6f45a7
ACM
64 struct record *rec = container_of(tool, struct record, tool);
65 return record__write(rec, event, event->header.size);
234fbbf5
ACM
66}
67
8c6f45a7 68static int record__mmap_read(struct record *rec, struct perf_mmap *md)
de9ac07b 69{
744bd8aa 70 unsigned int head = perf_mmap__read_head(md);
de9ac07b 71 unsigned int old = md->prev;
918512b4 72 unsigned char *data = md->base + page_size;
de9ac07b
PZ
73 unsigned long size;
74 void *buf;
8d3eca20 75 int rc = 0;
de9ac07b 76
dc82009a 77 if (old == head)
8d3eca20 78 return 0;
dc82009a 79
d20deb64 80 rec->samples++;
de9ac07b
PZ
81
82 size = head - old;
83
84 if ((old & md->mask) + size != (head & md->mask)) {
85 buf = &data[old & md->mask];
86 size = md->mask + 1 - (old & md->mask);
87 old += size;
021e9f47 88
8c6f45a7 89 if (record__write(rec, buf, size) < 0) {
8d3eca20
DA
90 rc = -1;
91 goto out;
92 }
de9ac07b
PZ
93 }
94
95 buf = &data[old & md->mask];
96 size = head - old;
97 old += size;
021e9f47 98
8c6f45a7 99 if (record__write(rec, buf, size) < 0) {
8d3eca20
DA
100 rc = -1;
101 goto out;
102 }
de9ac07b
PZ
103
104 md->prev = old;
115d2d89 105 perf_mmap__write_tail(md, old);
8d3eca20
DA
106
107out:
108 return rc;
de9ac07b
PZ
109}
110
111static volatile int done = 0;
f7b7c26e 112static volatile int signr = -1;
33e49ea7 113static volatile int child_finished = 0;
de9ac07b 114
16c8a109 115static void sig_handler(int sig)
de9ac07b 116{
33e49ea7
AK
117 if (sig == SIGCHLD)
118 child_finished = 1;
45604710
NK
119 else
120 signr = sig;
33e49ea7 121
16c8a109 122 done = 1;
f7b7c26e
PZ
123}
124
45604710 125static void record__sig_exit(void)
f7b7c26e 126{
45604710 127 if (signr == -1)
f7b7c26e
PZ
128 return;
129
130 signal(signr, SIG_DFL);
45604710 131 raise(signr);
de9ac07b
PZ
132}
133
8c6f45a7 134static int record__open(struct record *rec)
dd7927f4 135{
56e52e85 136 char msg[512];
6a4bb04c 137 struct perf_evsel *pos;
d20deb64
ACM
138 struct perf_evlist *evlist = rec->evlist;
139 struct perf_session *session = rec->session;
b4006796 140 struct record_opts *opts = &rec->opts;
8d3eca20 141 int rc = 0;
dd7927f4 142
f77a9518 143 perf_evlist__config(evlist, opts);
cac21425 144
0050f7aa 145 evlist__for_each(evlist, pos) {
dd7927f4 146try_again:
6a4bb04c 147 if (perf_evsel__open(pos, evlist->cpus, evlist->threads) < 0) {
56e52e85 148 if (perf_evsel__fallback(pos, errno, msg, sizeof(msg))) {
d6d901c2 149 if (verbose)
c0a54341 150 ui__warning("%s\n", msg);
d6d901c2
ZY
151 goto try_again;
152 }
ca6a4258 153
56e52e85
ACM
154 rc = -errno;
155 perf_evsel__open_strerror(pos, &opts->target,
156 errno, msg, sizeof(msg));
157 ui__error("%s\n", msg);
8d3eca20 158 goto out;
c171b552
LZ
159 }
160 }
a43d3f08 161
1491a632 162 if (perf_evlist__apply_filters(evlist)) {
0a102479 163 error("failed to set filter with %d (%s)\n", errno,
35550da3 164 strerror_r(errno, msg, sizeof(msg)));
8d3eca20
DA
165 rc = -1;
166 goto out;
0a102479
FW
167 }
168
18e60939 169 if (perf_evlist__mmap(evlist, opts->mmap_pages, false) < 0) {
8d3eca20
DA
170 if (errno == EPERM) {
171 pr_err("Permission error mapping pages.\n"
172 "Consider increasing "
173 "/proc/sys/kernel/perf_event_mlock_kb,\n"
174 "or try again with a smaller value of -m/--mmap_pages.\n"
53653d70 175 "(current value: %u)\n", opts->mmap_pages);
8d3eca20 176 rc = -errno;
8d3eca20 177 } else {
35550da3
MH
178 pr_err("failed to mmap with %d (%s)\n", errno,
179 strerror_r(errno, msg, sizeof(msg)));
8d3eca20
DA
180 rc = -errno;
181 }
182 goto out;
18e60939 183 }
0a27d7f9 184
563aecb2 185 session->evlist = evlist;
7b56cce2 186 perf_session__set_id_hdr_size(session);
8d3eca20
DA
187out:
188 return rc;
16c8a109
PZ
189}
190
8c6f45a7 191static int process_buildids(struct record *rec)
6122e4e4 192{
f5fc1412
JO
193 struct perf_data_file *file = &rec->file;
194 struct perf_session *session = rec->session;
7ab75cff 195 u64 start = session->header.data_offset;
6122e4e4 196
f5fc1412 197 u64 size = lseek(file->fd, 0, SEEK_CUR);
9f591fd7
ACM
198 if (size == 0)
199 return 0;
200
7ab75cff
DA
201 return __perf_session__process_events(session, start,
202 size - start,
6122e4e4
ACM
203 size, &build_id__mark_dso_hit_ops);
204}
205
8115d60c 206static void perf_event__synthesize_guest_os(struct machine *machine, void *data)
a1645ce1
ZY
207{
208 int err;
45694aa7 209 struct perf_tool *tool = data;
a1645ce1
ZY
210 /*
211 *As for guest kernel when processing subcommand record&report,
212 *we arrange module mmap prior to guest kernel mmap and trigger
213 *a preload dso because default guest module symbols are loaded
214 *from guest kallsyms instead of /lib/modules/XXX/XXX. This
215 *method is used to avoid symbol missing when the first addr is
216 *in module instead of in guest kernel.
217 */
45694aa7 218 err = perf_event__synthesize_modules(tool, process_synthesized_event,
743eb868 219 machine);
a1645ce1
ZY
220 if (err < 0)
221 pr_err("Couldn't record guest kernel [%d]'s reference"
23346f21 222 " relocation symbol.\n", machine->pid);
a1645ce1 223
a1645ce1
ZY
224 /*
225 * We use _stext for guest kernel because guest kernel's /proc/kallsyms
226 * have no _text sometimes.
227 */
45694aa7 228 err = perf_event__synthesize_kernel_mmap(tool, process_synthesized_event,
0ae617be 229 machine);
a1645ce1
ZY
230 if (err < 0)
231 pr_err("Couldn't record guest kernel [%d]'s reference"
23346f21 232 " relocation symbol.\n", machine->pid);
a1645ce1
ZY
233}
234
98402807
FW
235static struct perf_event_header finished_round_event = {
236 .size = sizeof(struct perf_event_header),
237 .type = PERF_RECORD_FINISHED_ROUND,
238};
239
8c6f45a7 240static int record__mmap_read_all(struct record *rec)
98402807 241{
dcabb507 242 u64 bytes_written = rec->bytes_written;
0e2e63dd 243 int i;
8d3eca20 244 int rc = 0;
98402807 245
d20deb64 246 for (i = 0; i < rec->evlist->nr_mmaps; i++) {
8d3eca20 247 if (rec->evlist->mmap[i].base) {
8c6f45a7 248 if (record__mmap_read(rec, &rec->evlist->mmap[i]) != 0) {
8d3eca20
DA
249 rc = -1;
250 goto out;
251 }
252 }
98402807
FW
253 }
254
dcabb507
JO
255 /*
256 * Mark the round finished in case we wrote
257 * at least one event.
258 */
259 if (bytes_written != rec->bytes_written)
260 rc = record__write(rec, &finished_round_event, sizeof(finished_round_event));
8d3eca20
DA
261
262out:
263 return rc;
98402807
FW
264}
265
8c6f45a7 266static void record__init_features(struct record *rec)
57706abc 267{
57706abc
DA
268 struct perf_session *session = rec->session;
269 int feat;
270
271 for (feat = HEADER_FIRST_FEATURE; feat < HEADER_LAST_FEATURE; feat++)
272 perf_header__set_feat(&session->header, feat);
273
274 if (rec->no_buildid)
275 perf_header__clear_feat(&session->header, HEADER_BUILD_ID);
276
3e2be2da 277 if (!have_tracepoints(&rec->evlist->entries))
57706abc
DA
278 perf_header__clear_feat(&session->header, HEADER_TRACING_DATA);
279
280 if (!rec->opts.branch_stack)
281 perf_header__clear_feat(&session->header, HEADER_BRANCH_STACK);
282}
283
f33cbe72
ACM
284static volatile int workload_exec_errno;
285
286/*
287 * perf_evlist__prepare_workload will send a SIGUSR1
288 * if the fork fails, since we asked by setting its
289 * want_signal to true.
290 */
45604710
NK
291static void workload_exec_failed_signal(int signo __maybe_unused,
292 siginfo_t *info,
f33cbe72
ACM
293 void *ucontext __maybe_unused)
294{
295 workload_exec_errno = info->si_value.sival_int;
296 done = 1;
f33cbe72
ACM
297 child_finished = 1;
298}
299
8c6f45a7 300static int __cmd_record(struct record *rec, int argc, const char **argv)
16c8a109 301{
57706abc 302 int err;
45604710 303 int status = 0;
8b412664 304 unsigned long waking = 0;
46be604b 305 const bool forks = argc > 0;
23346f21 306 struct machine *machine;
45694aa7 307 struct perf_tool *tool = &rec->tool;
b4006796 308 struct record_opts *opts = &rec->opts;
f5fc1412 309 struct perf_data_file *file = &rec->file;
d20deb64 310 struct perf_session *session;
2711926a 311 bool disabled = false;
de9ac07b 312
d20deb64 313 rec->progname = argv[0];
33e49ea7 314
45604710 315 atexit(record__sig_exit);
f5970550
PZ
316 signal(SIGCHLD, sig_handler);
317 signal(SIGINT, sig_handler);
804f7ac7 318 signal(SIGTERM, sig_handler);
f5970550 319
f5fc1412 320 session = perf_session__new(file, false, NULL);
94c744b6 321 if (session == NULL) {
ffa91880 322 pr_err("Perf session creation failed.\n");
a9a70bbc
ACM
323 return -1;
324 }
325
d20deb64
ACM
326 rec->session = session;
327
8c6f45a7 328 record__init_features(rec);
330aa675 329
d4db3f16 330 if (forks) {
3e2be2da 331 err = perf_evlist__prepare_workload(rec->evlist, &opts->target,
f5fc1412 332 argv, file->is_pipe,
735f7e0b 333 workload_exec_failed_signal);
35b9d88e
ACM
334 if (err < 0) {
335 pr_err("Couldn't run the workload!\n");
45604710 336 status = err;
35b9d88e 337 goto out_delete_session;
856e9660 338 }
856e9660
PZ
339 }
340
8c6f45a7 341 if (record__open(rec) != 0) {
8d3eca20 342 err = -1;
45604710 343 goto out_child;
8d3eca20 344 }
de9ac07b 345
3e2be2da 346 if (!rec->evlist->nr_groups)
a8bb559b
NK
347 perf_header__clear_feat(&session->header, HEADER_GROUP_DESC);
348
f5fc1412
JO
349 if (file->is_pipe) {
350 err = perf_header__write_pipe(file->fd);
529870e3 351 if (err < 0)
45604710 352 goto out_child;
563aecb2 353 } else {
3e2be2da 354 err = perf_session__write_header(session, rec->evlist,
f5fc1412 355 file->fd, false);
d5eed904 356 if (err < 0)
45604710 357 goto out_child;
56b03f3c
ACM
358 }
359
d3665498 360 if (!rec->no_buildid
e20960c0 361 && !perf_header__has_feat(&session->header, HEADER_BUILD_ID)) {
d3665498 362 pr_err("Couldn't generate buildids. "
e20960c0 363 "Use --no-buildid to profile anyway.\n");
8d3eca20 364 err = -1;
45604710 365 goto out_child;
e20960c0
RR
366 }
367
34ba5122 368 machine = &session->machines.host;
743eb868 369
f5fc1412 370 if (file->is_pipe) {
45694aa7 371 err = perf_event__synthesize_attrs(tool, session,
d20deb64 372 process_synthesized_event);
2c46dbb5
TZ
373 if (err < 0) {
374 pr_err("Couldn't synthesize attrs.\n");
45604710 375 goto out_child;
2c46dbb5 376 }
cd19a035 377
3e2be2da 378 if (have_tracepoints(&rec->evlist->entries)) {
63e0c771
TZ
379 /*
380 * FIXME err <= 0 here actually means that
381 * there were no tracepoints so its not really
382 * an error, just that we don't need to
383 * synthesize anything. We really have to
384 * return this more properly and also
385 * propagate errors that now are calling die()
386 */
3e2be2da 387 err = perf_event__synthesize_tracing_data(tool, file->fd, rec->evlist,
743eb868 388 process_synthesized_event);
63e0c771
TZ
389 if (err <= 0) {
390 pr_err("Couldn't record tracing data.\n");
45604710 391 goto out_child;
63e0c771 392 }
f34b9001 393 rec->bytes_written += err;
63e0c771 394 }
2c46dbb5
TZ
395 }
396
45694aa7 397 err = perf_event__synthesize_kernel_mmap(tool, process_synthesized_event,
0ae617be 398 machine);
c1a3a4b9
ACM
399 if (err < 0)
400 pr_err("Couldn't record kernel reference relocation symbol\n"
401 "Symbol resolution may be skewed if relocation was used (e.g. kexec).\n"
402 "Check /proc/kallsyms permission or run as root.\n");
b7cece76 403
45694aa7 404 err = perf_event__synthesize_modules(tool, process_synthesized_event,
743eb868 405 machine);
c1a3a4b9
ACM
406 if (err < 0)
407 pr_err("Couldn't record kernel module information.\n"
408 "Symbol resolution may be skewed if relocation was used (e.g. kexec).\n"
409 "Check /proc/modules permission or run as root.\n");
410
7e383de4 411 if (perf_guest) {
876650e6
ACM
412 machines__process_guests(&session->machines,
413 perf_event__synthesize_guest_os, tool);
7e383de4 414 }
7c6a1c65 415
3e2be2da 416 err = __machine__synthesize_threads(machine, tool, &opts->target, rec->evlist->threads,
a33fbd56 417 process_synthesized_event, opts->sample_address);
8d3eca20 418 if (err != 0)
45604710 419 goto out_child;
8d3eca20 420
d20deb64 421 if (rec->realtime_prio) {
de9ac07b
PZ
422 struct sched_param param;
423
d20deb64 424 param.sched_priority = rec->realtime_prio;
de9ac07b 425 if (sched_setscheduler(0, SCHED_FIFO, &param)) {
6beba7ad 426 pr_err("Could not set realtime priority.\n");
8d3eca20 427 err = -1;
45604710 428 goto out_child;
de9ac07b
PZ
429 }
430 }
431
774cb499
JO
432 /*
433 * When perf is starting the traced process, all the events
434 * (apart from group members) have enable_on_exec=1 set,
435 * so don't spoil it by prematurely enabling them.
436 */
6619a53e 437 if (!target__none(&opts->target) && !opts->initial_delay)
3e2be2da 438 perf_evlist__enable(rec->evlist);
764e16a3 439
856e9660
PZ
440 /*
441 * Let the child rip
442 */
735f7e0b 443 if (forks)
3e2be2da 444 perf_evlist__start_workload(rec->evlist);
856e9660 445
6619a53e
AK
446 if (opts->initial_delay) {
447 usleep(opts->initial_delay * 1000);
448 perf_evlist__enable(rec->evlist);
449 }
450
649c48a9 451 for (;;) {
d20deb64 452 int hits = rec->samples;
de9ac07b 453
8c6f45a7 454 if (record__mmap_read_all(rec) < 0) {
8d3eca20 455 err = -1;
45604710 456 goto out_child;
8d3eca20 457 }
de9ac07b 458
d20deb64 459 if (hits == rec->samples) {
649c48a9
PZ
460 if (done)
461 break;
3e2be2da 462 err = poll(rec->evlist->pollfd, rec->evlist->nr_fds, -1);
a515114f
JO
463 /*
464 * Propagate error, only if there's any. Ignore positive
465 * number of returned events and interrupt error.
466 */
467 if (err > 0 || (err < 0 && errno == EINTR))
45604710 468 err = 0;
8b412664
PZ
469 waking++;
470 }
471
774cb499
JO
472 /*
473 * When perf is starting the traced process, at the end events
474 * die with the process and we wait for that. Thus no need to
475 * disable events in this case.
476 */
602ad878 477 if (done && !disabled && !target__none(&opts->target)) {
3e2be2da 478 perf_evlist__disable(rec->evlist);
2711926a
JO
479 disabled = true;
480 }
de9ac07b
PZ
481 }
482
f33cbe72 483 if (forks && workload_exec_errno) {
35550da3 484 char msg[STRERR_BUFSIZE];
f33cbe72
ACM
485 const char *emsg = strerror_r(workload_exec_errno, msg, sizeof(msg));
486 pr_err("Workload failed: %s\n", emsg);
487 err = -1;
45604710 488 goto out_child;
f33cbe72
ACM
489 }
490
45604710
NK
491 if (!quiet) {
492 fprintf(stderr, "[ perf record: Woken up %ld times to write data ]\n", waking);
b44308f5 493
45604710
NK
494 /*
495 * Approximate RIP event size: 24 bytes.
496 */
497 fprintf(stderr,
498 "[ perf record: Captured and wrote %.3f MB %s (~%" PRIu64 " samples) ]\n",
499 (double)rec->bytes_written / 1024.0 / 1024.0,
500 file->path,
501 rec->bytes_written / 24);
502 }
8b412664 503
45604710
NK
504out_child:
505 if (forks) {
506 int exit_status;
addc2785 507
45604710
NK
508 if (!child_finished)
509 kill(rec->evlist->workload.pid, SIGTERM);
510
511 wait(&exit_status);
512
513 if (err < 0)
514 status = err;
515 else if (WIFEXITED(exit_status))
516 status = WEXITSTATUS(exit_status);
517 else if (WIFSIGNALED(exit_status))
518 signr = WTERMSIG(exit_status);
519 } else
520 status = err;
521
522 if (!err && !file->is_pipe) {
523 rec->session->header.data_size += rec->bytes_written;
524
525 if (!rec->no_buildid)
526 process_buildids(rec);
527 perf_session__write_header(rec->session, rec->evlist,
528 file->fd, true);
529 }
39d17dac
ACM
530
531out_delete_session:
532 perf_session__delete(session);
45604710 533 return status;
de9ac07b 534}
0e9b20b8 535
bdfebd84
RAV
536#define BRANCH_OPT(n, m) \
537 { .name = n, .mode = (m) }
538
539#define BRANCH_END { .name = NULL }
540
541struct branch_mode {
542 const char *name;
543 int mode;
544};
545
546static const struct branch_mode branch_modes[] = {
547 BRANCH_OPT("u", PERF_SAMPLE_BRANCH_USER),
548 BRANCH_OPT("k", PERF_SAMPLE_BRANCH_KERNEL),
549 BRANCH_OPT("hv", PERF_SAMPLE_BRANCH_HV),
550 BRANCH_OPT("any", PERF_SAMPLE_BRANCH_ANY),
551 BRANCH_OPT("any_call", PERF_SAMPLE_BRANCH_ANY_CALL),
552 BRANCH_OPT("any_ret", PERF_SAMPLE_BRANCH_ANY_RETURN),
553 BRANCH_OPT("ind_call", PERF_SAMPLE_BRANCH_IND_CALL),
0126d493
AK
554 BRANCH_OPT("abort_tx", PERF_SAMPLE_BRANCH_ABORT_TX),
555 BRANCH_OPT("in_tx", PERF_SAMPLE_BRANCH_IN_TX),
556 BRANCH_OPT("no_tx", PERF_SAMPLE_BRANCH_NO_TX),
0fffa5df 557 BRANCH_OPT("cond", PERF_SAMPLE_BRANCH_COND),
bdfebd84
RAV
558 BRANCH_END
559};
560
561static int
a5aabdac 562parse_branch_stack(const struct option *opt, const char *str, int unset)
bdfebd84
RAV
563{
564#define ONLY_PLM \
565 (PERF_SAMPLE_BRANCH_USER |\
566 PERF_SAMPLE_BRANCH_KERNEL |\
567 PERF_SAMPLE_BRANCH_HV)
568
569 uint64_t *mode = (uint64_t *)opt->value;
570 const struct branch_mode *br;
a5aabdac 571 char *s, *os = NULL, *p;
bdfebd84
RAV
572 int ret = -1;
573
a5aabdac
SE
574 if (unset)
575 return 0;
bdfebd84 576
a5aabdac
SE
577 /*
578 * cannot set it twice, -b + --branch-filter for instance
579 */
580 if (*mode)
bdfebd84
RAV
581 return -1;
582
a5aabdac
SE
583 /* str may be NULL in case no arg is passed to -b */
584 if (str) {
585 /* because str is read-only */
586 s = os = strdup(str);
587 if (!s)
588 return -1;
589
590 for (;;) {
591 p = strchr(s, ',');
592 if (p)
593 *p = '\0';
594
595 for (br = branch_modes; br->name; br++) {
596 if (!strcasecmp(s, br->name))
597 break;
598 }
599 if (!br->name) {
600 ui__warning("unknown branch filter %s,"
601 " check man page\n", s);
602 goto error;
603 }
bdfebd84 604
a5aabdac 605 *mode |= br->mode;
bdfebd84 606
a5aabdac
SE
607 if (!p)
608 break;
bdfebd84 609
a5aabdac
SE
610 s = p + 1;
611 }
bdfebd84
RAV
612 }
613 ret = 0;
614
a5aabdac 615 /* default to any branch */
bdfebd84 616 if ((*mode & ~ONLY_PLM) == 0) {
a5aabdac 617 *mode = PERF_SAMPLE_BRANCH_ANY;
bdfebd84
RAV
618 }
619error:
620 free(os);
621 return ret;
622}
623
9ff125d1 624#ifdef HAVE_DWARF_UNWIND_SUPPORT
26d33022
JO
625static int get_stack_size(char *str, unsigned long *_size)
626{
627 char *endptr;
628 unsigned long size;
629 unsigned long max_size = round_down(USHRT_MAX, sizeof(u64));
630
631 size = strtoul(str, &endptr, 0);
632
633 do {
634 if (*endptr)
635 break;
636
637 size = round_up(size, sizeof(u64));
638 if (!size || size > max_size)
639 break;
640
641 *_size = size;
642 return 0;
643
644 } while (0);
645
646 pr_err("callchain: Incorrect stack dump size (max %ld): %s\n",
647 max_size, str);
648 return -1;
649}
9ff125d1 650#endif /* HAVE_DWARF_UNWIND_SUPPORT */
26d33022 651
b4006796 652int record_parse_callchain(const char *arg, struct record_opts *opts)
26d33022 653{
26d33022
JO
654 char *tok, *name, *saveptr = NULL;
655 char *buf;
656 int ret = -1;
657
26d33022
JO
658 /* We need buffer that we know we can write to. */
659 buf = malloc(strlen(arg) + 1);
660 if (!buf)
661 return -ENOMEM;
662
663 strcpy(buf, arg);
664
665 tok = strtok_r((char *)buf, ",", &saveptr);
666 name = tok ? : (char *)buf;
667
668 do {
669 /* Framepointer style */
670 if (!strncmp(name, "fp", sizeof("fp"))) {
671 if (!strtok_r(NULL, ",", &saveptr)) {
c5ff78c3 672 opts->call_graph = CALLCHAIN_FP;
26d33022
JO
673 ret = 0;
674 } else
675 pr_err("callchain: No more arguments "
676 "needed for -g fp\n");
677 break;
678
9ff125d1 679#ifdef HAVE_DWARF_UNWIND_SUPPORT
26d33022
JO
680 /* Dwarf style */
681 } else if (!strncmp(name, "dwarf", sizeof("dwarf"))) {
61eaa3be
ACM
682 const unsigned long default_stack_dump_size = 8192;
683
26d33022 684 ret = 0;
c5ff78c3
ACM
685 opts->call_graph = CALLCHAIN_DWARF;
686 opts->stack_dump_size = default_stack_dump_size;
26d33022
JO
687
688 tok = strtok_r(NULL, ",", &saveptr);
689 if (tok) {
690 unsigned long size = 0;
691
692 ret = get_stack_size(tok, &size);
c5ff78c3 693 opts->stack_dump_size = size;
26d33022 694 }
9ff125d1 695#endif /* HAVE_DWARF_UNWIND_SUPPORT */
26d33022 696 } else {
09b0fd45 697 pr_err("callchain: Unknown --call-graph option "
26d33022
JO
698 "value: %s\n", arg);
699 break;
700 }
701
702 } while (0);
703
704 free(buf);
09b0fd45
JO
705 return ret;
706}
707
b4006796 708static void callchain_debug(struct record_opts *opts)
09b0fd45 709{
a601fdff
JO
710 static const char *str[CALLCHAIN_MAX] = { "NONE", "FP", "DWARF" };
711
712 pr_debug("callchain: type %s\n", str[opts->call_graph]);
26d33022 713
09b0fd45
JO
714 if (opts->call_graph == CALLCHAIN_DWARF)
715 pr_debug("callchain: stack dump size %d\n",
716 opts->stack_dump_size);
717}
718
719int record_parse_callchain_opt(const struct option *opt,
720 const char *arg,
721 int unset)
722{
b4006796 723 struct record_opts *opts = opt->value;
09b0fd45
JO
724 int ret;
725
eb853e80
JO
726 opts->call_graph_enabled = !unset;
727
09b0fd45
JO
728 /* --no-call-graph */
729 if (unset) {
730 opts->call_graph = CALLCHAIN_NONE;
731 pr_debug("callchain: disabled\n");
732 return 0;
733 }
734
735 ret = record_parse_callchain(arg, opts);
26d33022 736 if (!ret)
09b0fd45 737 callchain_debug(opts);
26d33022
JO
738
739 return ret;
740}
741
09b0fd45
JO
742int record_callchain_opt(const struct option *opt,
743 const char *arg __maybe_unused,
744 int unset __maybe_unused)
745{
b4006796 746 struct record_opts *opts = opt->value;
09b0fd45 747
eb853e80
JO
748 opts->call_graph_enabled = !unset;
749
09b0fd45
JO
750 if (opts->call_graph == CALLCHAIN_NONE)
751 opts->call_graph = CALLCHAIN_FP;
752
753 callchain_debug(opts);
754 return 0;
755}
756
eb853e80
JO
757static int perf_record_config(const char *var, const char *value, void *cb)
758{
759 struct record *rec = cb;
760
761 if (!strcmp(var, "record.call-graph"))
762 return record_parse_callchain(value, &rec->opts);
763
764 return perf_default_config(var, value, cb);
765}
766
0e9b20b8 767static const char * const record_usage[] = {
9e096753
MG
768 "perf record [<options>] [<command>]",
769 "perf record [<options>] -- <command> [<options>]",
0e9b20b8
IM
770 NULL
771};
772
d20deb64 773/*
8c6f45a7
ACM
774 * XXX Ideally would be local to cmd_record() and passed to a record__new
775 * because we need to have access to it in record__exit, that is called
d20deb64
ACM
776 * after cmd_record() exits, but since record_options need to be accessible to
777 * builtin-script, leave it here.
778 *
779 * At least we don't ouch it in all the other functions here directly.
780 *
781 * Just say no to tons of global variables, sigh.
782 */
8c6f45a7 783static struct record record = {
d20deb64 784 .opts = {
8affc2b8 785 .sample_time = true,
d20deb64
ACM
786 .mmap_pages = UINT_MAX,
787 .user_freq = UINT_MAX,
788 .user_interval = ULLONG_MAX,
447a6013 789 .freq = 4000,
d1cb9fce
NK
790 .target = {
791 .uses_mmap = true,
3aa5939d 792 .default_per_cpu = true,
d1cb9fce 793 },
d20deb64 794 },
d20deb64 795};
7865e817 796
09b0fd45 797#define CALLCHAIN_HELP "setup and enables call-graph (stack chain/backtrace) recording: "
61eaa3be 798
9ff125d1 799#ifdef HAVE_DWARF_UNWIND_SUPPORT
09b0fd45 800const char record_callchain_help[] = CALLCHAIN_HELP "fp dwarf";
61eaa3be 801#else
09b0fd45 802const char record_callchain_help[] = CALLCHAIN_HELP "fp";
61eaa3be
ACM
803#endif
804
d20deb64
ACM
805/*
806 * XXX Will stay a global variable till we fix builtin-script.c to stop messing
807 * with it and switch to use the library functions in perf_evlist that came
b4006796 808 * from builtin-record.c, i.e. use record_opts,
d20deb64
ACM
809 * perf_evlist__prepare_workload, etc instead of fork+exec'in 'perf record',
810 * using pipes, etc.
811 */
bca647aa 812const struct option record_options[] = {
d20deb64 813 OPT_CALLBACK('e', "event", &record.evlist, "event",
86847b62 814 "event selector. use 'perf list' to list available events",
f120f9d5 815 parse_events_option),
d20deb64 816 OPT_CALLBACK(0, "filter", &record.evlist, "filter",
c171b552 817 "event filter", parse_filter),
bea03405 818 OPT_STRING('p', "pid", &record.opts.target.pid, "pid",
d6d901c2 819 "record events on existing process id"),
bea03405 820 OPT_STRING('t', "tid", &record.opts.target.tid, "tid",
d6d901c2 821 "record events on existing thread id"),
d20deb64 822 OPT_INTEGER('r', "realtime", &record.realtime_prio,
0e9b20b8 823 "collect data with this RT SCHED_FIFO priority"),
509051ea 824 OPT_BOOLEAN(0, "no-buffering", &record.opts.no_buffering,
acac03fa 825 "collect data without buffering"),
d20deb64 826 OPT_BOOLEAN('R', "raw-samples", &record.opts.raw_samples,
daac07b2 827 "collect raw sample records from all opened counters"),
bea03405 828 OPT_BOOLEAN('a', "all-cpus", &record.opts.target.system_wide,
0e9b20b8 829 "system-wide collection from all CPUs"),
bea03405 830 OPT_STRING('C', "cpu", &record.opts.target.cpu_list, "cpu",
c45c6ea2 831 "list of cpus to monitor"),
d20deb64 832 OPT_U64('c', "count", &record.opts.user_interval, "event period to sample"),
f5fc1412 833 OPT_STRING('o', "output", &record.file.path, "file",
abaff32a 834 "output file name"),
69e7e5b0
AH
835 OPT_BOOLEAN_SET('i', "no-inherit", &record.opts.no_inherit,
836 &record.opts.no_inherit_set,
837 "child tasks do not inherit counters"),
d20deb64 838 OPT_UINTEGER('F', "freq", &record.opts.user_freq, "profile at this frequency"),
994a1f78
JO
839 OPT_CALLBACK('m', "mmap-pages", &record.opts.mmap_pages, "pages",
840 "number of mmap data pages",
841 perf_evlist__parse_mmap_pages),
d20deb64 842 OPT_BOOLEAN(0, "group", &record.opts.group,
43bece79 843 "put the counters into a counter group"),
09b0fd45
JO
844 OPT_CALLBACK_NOOPT('g', NULL, &record.opts,
845 NULL, "enables call-graph recording" ,
846 &record_callchain_opt),
847 OPT_CALLBACK(0, "call-graph", &record.opts,
848 "mode[,dump_size]", record_callchain_help,
849 &record_parse_callchain_opt),
c0555642 850 OPT_INCR('v', "verbose", &verbose,
3da297a6 851 "be more verbose (show counter open errors, etc)"),
b44308f5 852 OPT_BOOLEAN('q', "quiet", &quiet, "don't print any message"),
d20deb64 853 OPT_BOOLEAN('s', "stat", &record.opts.inherit_stat,
649c48a9 854 "per thread counts"),
d20deb64 855 OPT_BOOLEAN('d', "data", &record.opts.sample_address,
4bba828d 856 "Sample addresses"),
d20deb64 857 OPT_BOOLEAN('T', "timestamp", &record.opts.sample_time, "Sample timestamps"),
3e76ac78 858 OPT_BOOLEAN('P', "period", &record.opts.period, "Sample period"),
d20deb64 859 OPT_BOOLEAN('n', "no-samples", &record.opts.no_samples,
649c48a9 860 "don't sample"),
d20deb64 861 OPT_BOOLEAN('N', "no-buildid-cache", &record.no_buildid_cache,
a1ac1d3c 862 "do not update the buildid cache"),
d20deb64 863 OPT_BOOLEAN('B', "no-buildid", &record.no_buildid,
baa2f6ce 864 "do not collect buildids in perf.data"),
d20deb64 865 OPT_CALLBACK('G', "cgroup", &record.evlist, "name",
023695d9
SE
866 "monitor event in cgroup name only",
867 parse_cgroups),
a6205a35 868 OPT_UINTEGER('D', "delay", &record.opts.initial_delay,
6619a53e 869 "ms to wait before starting measurement after program start"),
bea03405
NK
870 OPT_STRING('u', "uid", &record.opts.target.uid_str, "user",
871 "user to profile"),
a5aabdac
SE
872
873 OPT_CALLBACK_NOOPT('b', "branch-any", &record.opts.branch_stack,
874 "branch any", "sample any taken branches",
875 parse_branch_stack),
876
877 OPT_CALLBACK('j', "branch-filter", &record.opts.branch_stack,
878 "branch filter mask", "branch stack filter modes",
bdfebd84 879 parse_branch_stack),
05484298
AK
880 OPT_BOOLEAN('W', "weight", &record.opts.sample_weight,
881 "sample by weight (on special events only)"),
475eeab9
AK
882 OPT_BOOLEAN(0, "transaction", &record.opts.sample_transaction,
883 "sample transaction flags (special events only)"),
3aa5939d
AH
884 OPT_BOOLEAN(0, "per-thread", &record.opts.target.per_thread,
885 "use per-thread mmaps"),
0e9b20b8
IM
886 OPT_END()
887};
888
1d037ca1 889int cmd_record(int argc, const char **argv, const char *prefix __maybe_unused)
0e9b20b8 890{
69aad6f1 891 int err = -ENOMEM;
8c6f45a7 892 struct record *rec = &record;
16ad2ffb 893 char errbuf[BUFSIZ];
0e9b20b8 894
3e2be2da
ACM
895 rec->evlist = perf_evlist__new();
896 if (rec->evlist == NULL)
361c99a6
ACM
897 return -ENOMEM;
898
eb853e80
JO
899 perf_config(perf_record_config, rec);
900
bca647aa 901 argc = parse_options(argc, argv, record_options, record_usage,
655000e7 902 PARSE_OPT_STOP_AT_NON_OPTION);
602ad878 903 if (!argc && target__none(&rec->opts.target))
bca647aa 904 usage_with_options(record_usage, record_options);
0e9b20b8 905
bea03405 906 if (nr_cgroups && !rec->opts.target.system_wide) {
3780f488
NK
907 ui__error("cgroup monitoring only available in"
908 " system-wide mode\n");
023695d9
SE
909 usage_with_options(record_usage, record_options);
910 }
911
0a7e6d1b 912 symbol__init(NULL);
baa2f6ce 913
ec80fde7 914 if (symbol_conf.kptr_restrict)
646aaea6
ACM
915 pr_warning(
916"WARNING: Kernel address maps (/proc/{kallsyms,modules}) are restricted,\n"
917"check /proc/sys/kernel/kptr_restrict.\n\n"
918"Samples in kernel functions may not be resolved if a suitable vmlinux\n"
919"file is not found in the buildid cache or in the vmlinux path.\n\n"
920"Samples in kernel modules won't be resolved at all.\n\n"
921"If some relocation was applied (e.g. kexec) symbols may be misresolved\n"
922"even with a suitable vmlinux or kallsyms file.\n\n");
ec80fde7 923
d20deb64 924 if (rec->no_buildid_cache || rec->no_buildid)
a1ac1d3c 925 disable_buildid_cache();
655000e7 926
3e2be2da
ACM
927 if (rec->evlist->nr_entries == 0 &&
928 perf_evlist__add_default(rec->evlist) < 0) {
69aad6f1
ACM
929 pr_err("Not enough memory for event selector list\n");
930 goto out_symbol_exit;
bbd36e5e 931 }
0e9b20b8 932
69e7e5b0
AH
933 if (rec->opts.target.tid && !rec->opts.no_inherit_set)
934 rec->opts.no_inherit = true;
935
602ad878 936 err = target__validate(&rec->opts.target);
16ad2ffb 937 if (err) {
602ad878 938 target__strerror(&rec->opts.target, err, errbuf, BUFSIZ);
16ad2ffb
NK
939 ui__warning("%s", errbuf);
940 }
941
602ad878 942 err = target__parse_uid(&rec->opts.target);
16ad2ffb
NK
943 if (err) {
944 int saved_errno = errno;
4bd0f2d2 945
602ad878 946 target__strerror(&rec->opts.target, err, errbuf, BUFSIZ);
3780f488 947 ui__error("%s", errbuf);
16ad2ffb
NK
948
949 err = -saved_errno;
8fa60e1f 950 goto out_symbol_exit;
16ad2ffb 951 }
0d37aa34 952
16ad2ffb 953 err = -ENOMEM;
3e2be2da 954 if (perf_evlist__create_maps(rec->evlist, &rec->opts.target) < 0)
dd7927f4 955 usage_with_options(record_usage, record_options);
69aad6f1 956
b4006796 957 if (record_opts__config(&rec->opts)) {
39d17dac 958 err = -EINVAL;
03ad9747 959 goto out_symbol_exit;
7e4ff9e3
MG
960 }
961
d20deb64 962 err = __cmd_record(&record, argc, argv);
d65a458b 963out_symbol_exit:
45604710 964 perf_evlist__delete(rec->evlist);
d65a458b 965 symbol__exit();
39d17dac 966 return err;
0e9b20b8 967}