1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * builtin-record.c 4 * 5 * Builtin record command: Record the profile of a workload 6 * (or a CPU, or a PID) into the perf.data output file - for 7 * later analysis via perf report. 8 */ 9 #include "builtin.h" 10 11 #include "perf.h" 12 13 #include "util/build-id.h" 14 #include "util/util.h" 15 #include <subcmd/parse-options.h> 16 #include "util/parse-events.h" 17 #include "util/config.h" 18 19 #include "util/callchain.h" 20 #include "util/cgroup.h" 21 #include "util/header.h" 22 #include "util/event.h" 23 #include "util/evlist.h" 24 #include "util/evsel.h" 25 #include "util/debug.h" 26 #include "util/drv_configs.h" 27 #include "util/session.h" 28 #include "util/tool.h" 29 #include "util/symbol.h" 30 #include "util/cpumap.h" 31 #include "util/thread_map.h" 32 #include "util/data.h" 33 #include "util/perf_regs.h" 34 #include "util/auxtrace.h" 35 #include "util/tsc.h" 36 #include "util/parse-branch-options.h" 37 #include "util/parse-regs-options.h" 38 #include "util/llvm-utils.h" 39 #include "util/bpf-loader.h" 40 #include "util/trigger.h" 41 #include "util/perf-hooks.h" 42 #include "util/time-utils.h" 43 #include "util/units.h" 44 #include "asm/bug.h" 45 46 #include <errno.h> 47 #include <inttypes.h> 48 #include <locale.h> 49 #include <poll.h> 50 #include <unistd.h> 51 #include <sched.h> 52 #include <signal.h> 53 #include <sys/mman.h> 54 #include <sys/wait.h> 55 #include <linux/time64.h> 56 57 struct switch_output { 58 bool enabled; 59 bool signal; 60 unsigned long size; 61 unsigned long time; 62 const char *str; 63 bool set; 64 }; 65 66 struct record { 67 struct perf_tool tool; 68 struct record_opts opts; 69 u64 bytes_written; 70 struct perf_data data; 71 struct auxtrace_record *itr; 72 struct perf_evlist *evlist; 73 struct perf_session *session; 74 int realtime_prio; 75 bool no_buildid; 76 bool no_buildid_set; 77 bool no_buildid_cache; 78 bool no_buildid_cache_set; 79 bool buildid_all; 80 bool timestamp_filename; 81 bool timestamp_boundary; 82 struct switch_output switch_output; 83 unsigned long long samples; 84 }; 85 86 static volatile int auxtrace_record__snapshot_started; 87 static DEFINE_TRIGGER(auxtrace_snapshot_trigger); 88 static DEFINE_TRIGGER(switch_output_trigger); 89 90 static bool switch_output_signal(struct record *rec) 91 { 92 return rec->switch_output.signal && 93 trigger_is_ready(&switch_output_trigger); 94 } 95 96 static bool switch_output_size(struct record *rec) 97 { 98 return rec->switch_output.size && 99 trigger_is_ready(&switch_output_trigger) && 100 (rec->bytes_written >= rec->switch_output.size); 101 } 102 103 static bool switch_output_time(struct record *rec) 104 { 105 return rec->switch_output.time && 106 trigger_is_ready(&switch_output_trigger); 107 } 108 109 static int record__write(struct record *rec, void *bf, size_t size) 110 { 111 if (perf_data__write(rec->session->data, bf, size) < 0) { 112 pr_err("failed to write perf data, error: %m\n"); 113 return -1; 114 } 115 116 rec->bytes_written += size; 117 118 if (switch_output_size(rec)) 119 trigger_hit(&switch_output_trigger); 120 121 return 0; 122 } 123 124 static int process_synthesized_event(struct perf_tool *tool, 125 union perf_event *event, 126 struct perf_sample *sample __maybe_unused, 127 struct machine *machine __maybe_unused) 128 { 129 struct record *rec = container_of(tool, struct record, tool); 130 return record__write(rec, event, event->header.size); 131 } 132 133 static int record__pushfn(void *to, void *bf, size_t size) 134 { 135 struct record *rec = to; 136 137 rec->samples++; 138 return record__write(rec, bf, size); 139 } 140 141 static volatile int done; 142 static volatile int signr = -1; 143 static volatile int child_finished; 144 145 static void sig_handler(int sig) 146 { 147 if (sig == SIGCHLD) 148 child_finished = 1; 149 else 150 signr = sig; 151 152 done = 1; 153 } 154 155 static void sigsegv_handler(int sig) 156 { 157 perf_hooks__recover(); 158 sighandler_dump_stack(sig); 159 } 160 161 static void record__sig_exit(void) 162 { 163 if (signr == -1) 164 return; 165 166 signal(signr, SIG_DFL); 167 raise(signr); 168 } 169 170 #ifdef HAVE_AUXTRACE_SUPPORT 171 172 static int record__process_auxtrace(struct perf_tool *tool, 173 union perf_event *event, void *data1, 174 size_t len1, void *data2, size_t len2) 175 { 176 struct record *rec = container_of(tool, struct record, tool); 177 struct perf_data *data = &rec->data; 178 size_t padding; 179 u8 pad[8] = {0}; 180 181 if (!perf_data__is_pipe(data)) { 182 off_t file_offset; 183 int fd = perf_data__fd(data); 184 int err; 185 186 file_offset = lseek(fd, 0, SEEK_CUR); 187 if (file_offset == -1) 188 return -1; 189 err = auxtrace_index__auxtrace_event(&rec->session->auxtrace_index, 190 event, file_offset); 191 if (err) 192 return err; 193 } 194 195 /* event.auxtrace.size includes padding, see __auxtrace_mmap__read() */ 196 padding = (len1 + len2) & 7; 197 if (padding) 198 padding = 8 - padding; 199 200 record__write(rec, event, event->header.size); 201 record__write(rec, data1, len1); 202 if (len2) 203 record__write(rec, data2, len2); 204 record__write(rec, &pad, padding); 205 206 return 0; 207 } 208 209 static int record__auxtrace_mmap_read(struct record *rec, 210 struct auxtrace_mmap *mm) 211 { 212 int ret; 213 214 ret = auxtrace_mmap__read(mm, rec->itr, &rec->tool, 215 record__process_auxtrace); 216 if (ret < 0) 217 return ret; 218 219 if (ret) 220 rec->samples++; 221 222 return 0; 223 } 224 225 static int record__auxtrace_mmap_read_snapshot(struct record *rec, 226 struct auxtrace_mmap *mm) 227 { 228 int ret; 229 230 ret = auxtrace_mmap__read_snapshot(mm, rec->itr, &rec->tool, 231 record__process_auxtrace, 232 rec->opts.auxtrace_snapshot_size); 233 if (ret < 0) 234 return ret; 235 236 if (ret) 237 rec->samples++; 238 239 return 0; 240 } 241 242 static int record__auxtrace_read_snapshot_all(struct record *rec) 243 { 244 int i; 245 int rc = 0; 246 247 for (i = 0; i < rec->evlist->nr_mmaps; i++) { 248 struct auxtrace_mmap *mm = 249 &rec->evlist->mmap[i].auxtrace_mmap; 250 251 if (!mm->base) 252 continue; 253 254 if (record__auxtrace_mmap_read_snapshot(rec, mm) != 0) { 255 rc = -1; 256 goto out; 257 } 258 } 259 out: 260 return rc; 261 } 262 263 static void record__read_auxtrace_snapshot(struct record *rec) 264 { 265 pr_debug("Recording AUX area tracing snapshot\n"); 266 if (record__auxtrace_read_snapshot_all(rec) < 0) { 267 trigger_error(&auxtrace_snapshot_trigger); 268 } else { 269 if (auxtrace_record__snapshot_finish(rec->itr)) 270 trigger_error(&auxtrace_snapshot_trigger); 271 else 272 trigger_ready(&auxtrace_snapshot_trigger); 273 } 274 } 275 276 static int record__auxtrace_init(struct record *rec) 277 { 278 int err; 279 280 if (!rec->itr) { 281 rec->itr = auxtrace_record__init(rec->evlist, &err); 282 if (err) 283 return err; 284 } 285 286 err = auxtrace_parse_snapshot_options(rec->itr, &rec->opts, 287 rec->opts.auxtrace_snapshot_opts); 288 if (err) 289 return err; 290 291 return auxtrace_parse_filters(rec->evlist); 292 } 293 294 #else 295 296 static inline 297 int record__auxtrace_mmap_read(struct record *rec __maybe_unused, 298 struct auxtrace_mmap *mm __maybe_unused) 299 { 300 return 0; 301 } 302 303 static inline 304 void record__read_auxtrace_snapshot(struct record *rec __maybe_unused) 305 { 306 } 307 308 static inline 309 int auxtrace_record__snapshot_start(struct auxtrace_record *itr __maybe_unused) 310 { 311 return 0; 312 } 313 314 static int record__auxtrace_init(struct record *rec __maybe_unused) 315 { 316 return 0; 317 } 318 319 #endif 320 321 static int record__mmap_evlist(struct record *rec, 322 struct perf_evlist *evlist) 323 { 324 struct record_opts *opts = &rec->opts; 325 char msg[512]; 326 327 if (perf_evlist__mmap_ex(evlist, opts->mmap_pages, 328 opts->auxtrace_mmap_pages, 329 opts->auxtrace_snapshot_mode) < 0) { 330 if (errno == EPERM) { 331 pr_err("Permission error mapping pages.\n" 332 "Consider increasing " 333 "/proc/sys/kernel/perf_event_mlock_kb,\n" 334 "or try again with a smaller value of -m/--mmap_pages.\n" 335 "(current value: %u,%u)\n", 336 opts->mmap_pages, opts->auxtrace_mmap_pages); 337 return -errno; 338 } else { 339 pr_err("failed to mmap with %d (%s)\n", errno, 340 str_error_r(errno, msg, sizeof(msg))); 341 if (errno) 342 return -errno; 343 else 344 return -EINVAL; 345 } 346 } 347 return 0; 348 } 349 350 static int record__mmap(struct record *rec) 351 { 352 return record__mmap_evlist(rec, rec->evlist); 353 } 354 355 static int record__open(struct record *rec) 356 { 357 char msg[BUFSIZ]; 358 struct perf_evsel *pos; 359 struct perf_evlist *evlist = rec->evlist; 360 struct perf_session *session = rec->session; 361 struct record_opts *opts = &rec->opts; 362 struct perf_evsel_config_term *err_term; 363 int rc = 0; 364 365 /* 366 * For initial_delay we need to add a dummy event so that we can track 367 * PERF_RECORD_MMAP while we wait for the initial delay to enable the 368 * real events, the ones asked by the user. 369 */ 370 if (opts->initial_delay) { 371 if (perf_evlist__add_dummy(evlist)) 372 return -ENOMEM; 373 374 pos = perf_evlist__first(evlist); 375 pos->tracking = 0; 376 pos = perf_evlist__last(evlist); 377 pos->tracking = 1; 378 pos->attr.enable_on_exec = 1; 379 } 380 381 perf_evlist__config(evlist, opts, &callchain_param); 382 383 evlist__for_each_entry(evlist, pos) { 384 try_again: 385 if (perf_evsel__open(pos, pos->cpus, pos->threads) < 0) { 386 if (perf_evsel__fallback(pos, errno, msg, sizeof(msg))) { 387 if (verbose > 0) 388 ui__warning("%s\n", msg); 389 goto try_again; 390 } 391 392 rc = -errno; 393 perf_evsel__open_strerror(pos, &opts->target, 394 errno, msg, sizeof(msg)); 395 ui__error("%s\n", msg); 396 goto out; 397 } 398 399 pos->supported = true; 400 } 401 402 if (perf_evlist__apply_filters(evlist, &pos)) { 403 pr_err("failed to set filter \"%s\" on event %s with %d (%s)\n", 404 pos->filter, perf_evsel__name(pos), errno, 405 str_error_r(errno, msg, sizeof(msg))); 406 rc = -1; 407 goto out; 408 } 409 410 if (perf_evlist__apply_drv_configs(evlist, &pos, &err_term)) { 411 pr_err("failed to set config \"%s\" on event %s with %d (%s)\n", 412 err_term->val.drv_cfg, perf_evsel__name(pos), errno, 413 str_error_r(errno, msg, sizeof(msg))); 414 rc = -1; 415 goto out; 416 } 417 418 rc = record__mmap(rec); 419 if (rc) 420 goto out; 421 422 session->evlist = evlist; 423 perf_session__set_id_hdr_size(session); 424 out: 425 return rc; 426 } 427 428 static int process_sample_event(struct perf_tool *tool, 429 union perf_event *event, 430 struct perf_sample *sample, 431 struct perf_evsel *evsel, 432 struct machine *machine) 433 { 434 struct record *rec = container_of(tool, struct record, tool); 435 436 if (rec->evlist->first_sample_time == 0) 437 rec->evlist->first_sample_time = sample->time; 438 439 rec->evlist->last_sample_time = sample->time; 440 441 if (rec->buildid_all) 442 return 0; 443 444 rec->samples++; 445 return build_id__mark_dso_hit(tool, event, sample, evsel, machine); 446 } 447 448 static int process_buildids(struct record *rec) 449 { 450 struct perf_data *data = &rec->data; 451 struct perf_session *session = rec->session; 452 453 if (data->size == 0) 454 return 0; 455 456 /* 457 * During this process, it'll load kernel map and replace the 458 * dso->long_name to a real pathname it found. In this case 459 * we prefer the vmlinux path like 460 * /lib/modules/3.16.4/build/vmlinux 461 * 462 * rather than build-id path (in debug directory). 463 * $HOME/.debug/.build-id/f0/6e17aa50adf4d00b88925e03775de107611551 464 */ 465 symbol_conf.ignore_vmlinux_buildid = true; 466 467 /* 468 * If --buildid-all is given, it marks all DSO regardless of hits, 469 * so no need to process samples. But if timestamp_boundary is enabled, 470 * it still needs to walk on all samples to get the timestamps of 471 * first/last samples. 472 */ 473 if (rec->buildid_all && !rec->timestamp_boundary) 474 rec->tool.sample = NULL; 475 476 return perf_session__process_events(session); 477 } 478 479 static void perf_event__synthesize_guest_os(struct machine *machine, void *data) 480 { 481 int err; 482 struct perf_tool *tool = data; 483 /* 484 *As for guest kernel when processing subcommand record&report, 485 *we arrange module mmap prior to guest kernel mmap and trigger 486 *a preload dso because default guest module symbols are loaded 487 *from guest kallsyms instead of /lib/modules/XXX/XXX. This 488 *method is used to avoid symbol missing when the first addr is 489 *in module instead of in guest kernel. 490 */ 491 err = perf_event__synthesize_modules(tool, process_synthesized_event, 492 machine); 493 if (err < 0) 494 pr_err("Couldn't record guest kernel [%d]'s reference" 495 " relocation symbol.\n", machine->pid); 496 497 /* 498 * We use _stext for guest kernel because guest kernel's /proc/kallsyms 499 * have no _text sometimes. 500 */ 501 err = perf_event__synthesize_kernel_mmap(tool, process_synthesized_event, 502 machine); 503 if (err < 0) 504 pr_err("Couldn't record guest kernel [%d]'s reference" 505 " relocation symbol.\n", machine->pid); 506 } 507 508 static struct perf_event_header finished_round_event = { 509 .size = sizeof(struct perf_event_header), 510 .type = PERF_RECORD_FINISHED_ROUND, 511 }; 512 513 static int record__mmap_read_evlist(struct record *rec, struct perf_evlist *evlist, 514 bool overwrite) 515 { 516 u64 bytes_written = rec->bytes_written; 517 int i; 518 int rc = 0; 519 struct perf_mmap *maps; 520 521 if (!evlist) 522 return 0; 523 524 maps = overwrite ? evlist->overwrite_mmap : evlist->mmap; 525 if (!maps) 526 return 0; 527 528 if (overwrite && evlist->bkw_mmap_state != BKW_MMAP_DATA_PENDING) 529 return 0; 530 531 for (i = 0; i < evlist->nr_mmaps; i++) { 532 struct auxtrace_mmap *mm = &maps[i].auxtrace_mmap; 533 534 if (maps[i].base) { 535 if (perf_mmap__push(&maps[i], rec, record__pushfn) != 0) { 536 rc = -1; 537 goto out; 538 } 539 } 540 541 if (mm->base && !rec->opts.auxtrace_snapshot_mode && 542 record__auxtrace_mmap_read(rec, mm) != 0) { 543 rc = -1; 544 goto out; 545 } 546 } 547 548 /* 549 * Mark the round finished in case we wrote 550 * at least one event. 551 */ 552 if (bytes_written != rec->bytes_written) 553 rc = record__write(rec, &finished_round_event, sizeof(finished_round_event)); 554 555 if (overwrite) 556 perf_evlist__toggle_bkw_mmap(evlist, BKW_MMAP_EMPTY); 557 out: 558 return rc; 559 } 560 561 static int record__mmap_read_all(struct record *rec) 562 { 563 int err; 564 565 err = record__mmap_read_evlist(rec, rec->evlist, false); 566 if (err) 567 return err; 568 569 return record__mmap_read_evlist(rec, rec->evlist, true); 570 } 571 572 static void record__init_features(struct record *rec) 573 { 574 struct perf_session *session = rec->session; 575 int feat; 576 577 for (feat = HEADER_FIRST_FEATURE; feat < HEADER_LAST_FEATURE; feat++) 578 perf_header__set_feat(&session->header, feat); 579 580 if (rec->no_buildid) 581 perf_header__clear_feat(&session->header, HEADER_BUILD_ID); 582 583 if (!have_tracepoints(&rec->evlist->entries)) 584 perf_header__clear_feat(&session->header, HEADER_TRACING_DATA); 585 586 if (!rec->opts.branch_stack) 587 perf_header__clear_feat(&session->header, HEADER_BRANCH_STACK); 588 589 if (!rec->opts.full_auxtrace) 590 perf_header__clear_feat(&session->header, HEADER_AUXTRACE); 591 592 perf_header__clear_feat(&session->header, HEADER_STAT); 593 } 594 595 static void 596 record__finish_output(struct record *rec) 597 { 598 struct perf_data *data = &rec->data; 599 int fd = perf_data__fd(data); 600 601 if (data->is_pipe) 602 return; 603 604 rec->session->header.data_size += rec->bytes_written; 605 data->size = lseek(perf_data__fd(data), 0, SEEK_CUR); 606 607 if (!rec->no_buildid) { 608 process_buildids(rec); 609 610 if (rec->buildid_all) 611 dsos__hit_all(rec->session); 612 } 613 perf_session__write_header(rec->session, rec->evlist, fd, true); 614 615 return; 616 } 617 618 static int record__synthesize_workload(struct record *rec, bool tail) 619 { 620 int err; 621 struct thread_map *thread_map; 622 623 if (rec->opts.tail_synthesize != tail) 624 return 0; 625 626 thread_map = thread_map__new_by_tid(rec->evlist->workload.pid); 627 if (thread_map == NULL) 628 return -1; 629 630 err = perf_event__synthesize_thread_map(&rec->tool, thread_map, 631 process_synthesized_event, 632 &rec->session->machines.host, 633 rec->opts.sample_address, 634 rec->opts.proc_map_timeout); 635 thread_map__put(thread_map); 636 return err; 637 } 638 639 static int record__synthesize(struct record *rec, bool tail); 640 641 static int 642 record__switch_output(struct record *rec, bool at_exit) 643 { 644 struct perf_data *data = &rec->data; 645 int fd, err; 646 647 /* Same Size: "2015122520103046"*/ 648 char timestamp[] = "InvalidTimestamp"; 649 650 record__synthesize(rec, true); 651 if (target__none(&rec->opts.target)) 652 record__synthesize_workload(rec, true); 653 654 rec->samples = 0; 655 record__finish_output(rec); 656 err = fetch_current_timestamp(timestamp, sizeof(timestamp)); 657 if (err) { 658 pr_err("Failed to get current timestamp\n"); 659 return -EINVAL; 660 } 661 662 fd = perf_data__switch(data, timestamp, 663 rec->session->header.data_offset, 664 at_exit); 665 if (fd >= 0 && !at_exit) { 666 rec->bytes_written = 0; 667 rec->session->header.data_size = 0; 668 } 669 670 if (!quiet) 671 fprintf(stderr, "[ perf record: Dump %s.%s ]\n", 672 data->file.path, timestamp); 673 674 /* Output tracking events */ 675 if (!at_exit) { 676 record__synthesize(rec, false); 677 678 /* 679 * In 'perf record --switch-output' without -a, 680 * record__synthesize() in record__switch_output() won't 681 * generate tracking events because there's no thread_map 682 * in evlist. Which causes newly created perf.data doesn't 683 * contain map and comm information. 684 * Create a fake thread_map and directly call 685 * perf_event__synthesize_thread_map() for those events. 686 */ 687 if (target__none(&rec->opts.target)) 688 record__synthesize_workload(rec, false); 689 } 690 return fd; 691 } 692 693 static volatile int workload_exec_errno; 694 695 /* 696 * perf_evlist__prepare_workload will send a SIGUSR1 697 * if the fork fails, since we asked by setting its 698 * want_signal to true. 699 */ 700 static void workload_exec_failed_signal(int signo __maybe_unused, 701 siginfo_t *info, 702 void *ucontext __maybe_unused) 703 { 704 workload_exec_errno = info->si_value.sival_int; 705 done = 1; 706 child_finished = 1; 707 } 708 709 static void snapshot_sig_handler(int sig); 710 static void alarm_sig_handler(int sig); 711 712 int __weak 713 perf_event__synth_time_conv(const struct perf_event_mmap_page *pc __maybe_unused, 714 struct perf_tool *tool __maybe_unused, 715 perf_event__handler_t process __maybe_unused, 716 struct machine *machine __maybe_unused) 717 { 718 return 0; 719 } 720 721 static const struct perf_event_mmap_page * 722 perf_evlist__pick_pc(struct perf_evlist *evlist) 723 { 724 if (evlist) { 725 if (evlist->mmap && evlist->mmap[0].base) 726 return evlist->mmap[0].base; 727 if (evlist->overwrite_mmap && evlist->overwrite_mmap[0].base) 728 return evlist->overwrite_mmap[0].base; 729 } 730 return NULL; 731 } 732 733 static const struct perf_event_mmap_page *record__pick_pc(struct record *rec) 734 { 735 const struct perf_event_mmap_page *pc; 736 737 pc = perf_evlist__pick_pc(rec->evlist); 738 if (pc) 739 return pc; 740 return NULL; 741 } 742 743 static int record__synthesize(struct record *rec, bool tail) 744 { 745 struct perf_session *session = rec->session; 746 struct machine *machine = &session->machines.host; 747 struct perf_data *data = &rec->data; 748 struct record_opts *opts = &rec->opts; 749 struct perf_tool *tool = &rec->tool; 750 int fd = perf_data__fd(data); 751 int err = 0; 752 753 if (rec->opts.tail_synthesize != tail) 754 return 0; 755 756 if (data->is_pipe) { 757 /* 758 * We need to synthesize events first, because some 759 * features works on top of them (on report side). 760 */ 761 err = perf_event__synthesize_attrs(tool, session, 762 process_synthesized_event); 763 if (err < 0) { 764 pr_err("Couldn't synthesize attrs.\n"); 765 goto out; 766 } 767 768 err = perf_event__synthesize_features(tool, session, rec->evlist, 769 process_synthesized_event); 770 if (err < 0) { 771 pr_err("Couldn't synthesize features.\n"); 772 return err; 773 } 774 775 if (have_tracepoints(&rec->evlist->entries)) { 776 /* 777 * FIXME err <= 0 here actually means that 778 * there were no tracepoints so its not really 779 * an error, just that we don't need to 780 * synthesize anything. We really have to 781 * return this more properly and also 782 * propagate errors that now are calling die() 783 */ 784 err = perf_event__synthesize_tracing_data(tool, fd, rec->evlist, 785 process_synthesized_event); 786 if (err <= 0) { 787 pr_err("Couldn't record tracing data.\n"); 788 goto out; 789 } 790 rec->bytes_written += err; 791 } 792 } 793 794 err = perf_event__synth_time_conv(record__pick_pc(rec), tool, 795 process_synthesized_event, machine); 796 if (err) 797 goto out; 798 799 if (rec->opts.full_auxtrace) { 800 err = perf_event__synthesize_auxtrace_info(rec->itr, tool, 801 session, process_synthesized_event); 802 if (err) 803 goto out; 804 } 805 806 if (!perf_evlist__exclude_kernel(rec->evlist)) { 807 err = perf_event__synthesize_kernel_mmap(tool, process_synthesized_event, 808 machine); 809 WARN_ONCE(err < 0, "Couldn't record kernel reference relocation symbol\n" 810 "Symbol resolution may be skewed if relocation was used (e.g. kexec).\n" 811 "Check /proc/kallsyms permission or run as root.\n"); 812 813 err = perf_event__synthesize_modules(tool, process_synthesized_event, 814 machine); 815 WARN_ONCE(err < 0, "Couldn't record kernel module information.\n" 816 "Symbol resolution may be skewed if relocation was used (e.g. kexec).\n" 817 "Check /proc/modules permission or run as root.\n"); 818 } 819 820 if (perf_guest) { 821 machines__process_guests(&session->machines, 822 perf_event__synthesize_guest_os, tool); 823 } 824 825 err = perf_event__synthesize_extra_attr(&rec->tool, 826 rec->evlist, 827 process_synthesized_event, 828 data->is_pipe); 829 if (err) 830 goto out; 831 832 err = perf_event__synthesize_thread_map2(&rec->tool, rec->evlist->threads, 833 process_synthesized_event, 834 NULL); 835 if (err < 0) { 836 pr_err("Couldn't synthesize thread map.\n"); 837 return err; 838 } 839 840 err = perf_event__synthesize_cpu_map(&rec->tool, rec->evlist->cpus, 841 process_synthesized_event, NULL); 842 if (err < 0) { 843 pr_err("Couldn't synthesize cpu map.\n"); 844 return err; 845 } 846 847 err = __machine__synthesize_threads(machine, tool, &opts->target, rec->evlist->threads, 848 process_synthesized_event, opts->sample_address, 849 opts->proc_map_timeout, 1); 850 out: 851 return err; 852 } 853 854 static int __cmd_record(struct record *rec, int argc, const char **argv) 855 { 856 int err; 857 int status = 0; 858 unsigned long waking = 0; 859 const bool forks = argc > 0; 860 struct perf_tool *tool = &rec->tool; 861 struct record_opts *opts = &rec->opts; 862 struct perf_data *data = &rec->data; 863 struct perf_session *session; 864 bool disabled = false, draining = false; 865 int fd; 866 867 atexit(record__sig_exit); 868 signal(SIGCHLD, sig_handler); 869 signal(SIGINT, sig_handler); 870 signal(SIGTERM, sig_handler); 871 signal(SIGSEGV, sigsegv_handler); 872 873 if (rec->opts.record_namespaces) 874 tool->namespace_events = true; 875 876 if (rec->opts.auxtrace_snapshot_mode || rec->switch_output.enabled) { 877 signal(SIGUSR2, snapshot_sig_handler); 878 if (rec->opts.auxtrace_snapshot_mode) 879 trigger_on(&auxtrace_snapshot_trigger); 880 if (rec->switch_output.enabled) 881 trigger_on(&switch_output_trigger); 882 } else { 883 signal(SIGUSR2, SIG_IGN); 884 } 885 886 session = perf_session__new(data, false, tool); 887 if (session == NULL) { 888 pr_err("Perf session creation failed.\n"); 889 return -1; 890 } 891 892 fd = perf_data__fd(data); 893 rec->session = session; 894 895 record__init_features(rec); 896 897 if (forks) { 898 err = perf_evlist__prepare_workload(rec->evlist, &opts->target, 899 argv, data->is_pipe, 900 workload_exec_failed_signal); 901 if (err < 0) { 902 pr_err("Couldn't run the workload!\n"); 903 status = err; 904 goto out_delete_session; 905 } 906 } 907 908 /* 909 * If we have just single event and are sending data 910 * through pipe, we need to force the ids allocation, 911 * because we synthesize event name through the pipe 912 * and need the id for that. 913 */ 914 if (data->is_pipe && rec->evlist->nr_entries == 1) 915 rec->opts.sample_id = true; 916 917 if (record__open(rec) != 0) { 918 err = -1; 919 goto out_child; 920 } 921 922 err = bpf__apply_obj_config(); 923 if (err) { 924 char errbuf[BUFSIZ]; 925 926 bpf__strerror_apply_obj_config(err, errbuf, sizeof(errbuf)); 927 pr_err("ERROR: Apply config to BPF failed: %s\n", 928 errbuf); 929 goto out_child; 930 } 931 932 /* 933 * Normally perf_session__new would do this, but it doesn't have the 934 * evlist. 935 */ 936 if (rec->tool.ordered_events && !perf_evlist__sample_id_all(rec->evlist)) { 937 pr_warning("WARNING: No sample_id_all support, falling back to unordered processing\n"); 938 rec->tool.ordered_events = false; 939 } 940 941 if (!rec->evlist->nr_groups) 942 perf_header__clear_feat(&session->header, HEADER_GROUP_DESC); 943 944 if (data->is_pipe) { 945 err = perf_header__write_pipe(fd); 946 if (err < 0) 947 goto out_child; 948 } else { 949 err = perf_session__write_header(session, rec->evlist, fd, false); 950 if (err < 0) 951 goto out_child; 952 } 953 954 if (!rec->no_buildid 955 && !perf_header__has_feat(&session->header, HEADER_BUILD_ID)) { 956 pr_err("Couldn't generate buildids. " 957 "Use --no-buildid to profile anyway.\n"); 958 err = -1; 959 goto out_child; 960 } 961 962 err = record__synthesize(rec, false); 963 if (err < 0) 964 goto out_child; 965 966 if (rec->realtime_prio) { 967 struct sched_param param; 968 969 param.sched_priority = rec->realtime_prio; 970 if (sched_setscheduler(0, SCHED_FIFO, ¶m)) { 971 pr_err("Could not set realtime priority.\n"); 972 err = -1; 973 goto out_child; 974 } 975 } 976 977 /* 978 * When perf is starting the traced process, all the events 979 * (apart from group members) have enable_on_exec=1 set, 980 * so don't spoil it by prematurely enabling them. 981 */ 982 if (!target__none(&opts->target) && !opts->initial_delay) 983 perf_evlist__enable(rec->evlist); 984 985 /* 986 * Let the child rip 987 */ 988 if (forks) { 989 struct machine *machine = &session->machines.host; 990 union perf_event *event; 991 pid_t tgid; 992 993 event = malloc(sizeof(event->comm) + machine->id_hdr_size); 994 if (event == NULL) { 995 err = -ENOMEM; 996 goto out_child; 997 } 998 999 /* 1000 * Some H/W events are generated before COMM event 1001 * which is emitted during exec(), so perf script 1002 * cannot see a correct process name for those events. 1003 * Synthesize COMM event to prevent it. 1004 */ 1005 tgid = perf_event__synthesize_comm(tool, event, 1006 rec->evlist->workload.pid, 1007 process_synthesized_event, 1008 machine); 1009 free(event); 1010 1011 if (tgid == -1) 1012 goto out_child; 1013 1014 event = malloc(sizeof(event->namespaces) + 1015 (NR_NAMESPACES * sizeof(struct perf_ns_link_info)) + 1016 machine->id_hdr_size); 1017 if (event == NULL) { 1018 err = -ENOMEM; 1019 goto out_child; 1020 } 1021 1022 /* 1023 * Synthesize NAMESPACES event for the command specified. 1024 */ 1025 perf_event__synthesize_namespaces(tool, event, 1026 rec->evlist->workload.pid, 1027 tgid, process_synthesized_event, 1028 machine); 1029 free(event); 1030 1031 perf_evlist__start_workload(rec->evlist); 1032 } 1033 1034 if (opts->initial_delay) { 1035 usleep(opts->initial_delay * USEC_PER_MSEC); 1036 perf_evlist__enable(rec->evlist); 1037 } 1038 1039 trigger_ready(&auxtrace_snapshot_trigger); 1040 trigger_ready(&switch_output_trigger); 1041 perf_hooks__invoke_record_start(); 1042 for (;;) { 1043 unsigned long long hits = rec->samples; 1044 1045 /* 1046 * rec->evlist->bkw_mmap_state is possible to be 1047 * BKW_MMAP_EMPTY here: when done == true and 1048 * hits != rec->samples in previous round. 1049 * 1050 * perf_evlist__toggle_bkw_mmap ensure we never 1051 * convert BKW_MMAP_EMPTY to BKW_MMAP_DATA_PENDING. 1052 */ 1053 if (trigger_is_hit(&switch_output_trigger) || done || draining) 1054 perf_evlist__toggle_bkw_mmap(rec->evlist, BKW_MMAP_DATA_PENDING); 1055 1056 if (record__mmap_read_all(rec) < 0) { 1057 trigger_error(&auxtrace_snapshot_trigger); 1058 trigger_error(&switch_output_trigger); 1059 err = -1; 1060 goto out_child; 1061 } 1062 1063 if (auxtrace_record__snapshot_started) { 1064 auxtrace_record__snapshot_started = 0; 1065 if (!trigger_is_error(&auxtrace_snapshot_trigger)) 1066 record__read_auxtrace_snapshot(rec); 1067 if (trigger_is_error(&auxtrace_snapshot_trigger)) { 1068 pr_err("AUX area tracing snapshot failed\n"); 1069 err = -1; 1070 goto out_child; 1071 } 1072 } 1073 1074 if (trigger_is_hit(&switch_output_trigger)) { 1075 /* 1076 * If switch_output_trigger is hit, the data in 1077 * overwritable ring buffer should have been collected, 1078 * so bkw_mmap_state should be set to BKW_MMAP_EMPTY. 1079 * 1080 * If SIGUSR2 raise after or during record__mmap_read_all(), 1081 * record__mmap_read_all() didn't collect data from 1082 * overwritable ring buffer. Read again. 1083 */ 1084 if (rec->evlist->bkw_mmap_state == BKW_MMAP_RUNNING) 1085 continue; 1086 trigger_ready(&switch_output_trigger); 1087 1088 /* 1089 * Reenable events in overwrite ring buffer after 1090 * record__mmap_read_all(): we should have collected 1091 * data from it. 1092 */ 1093 perf_evlist__toggle_bkw_mmap(rec->evlist, BKW_MMAP_RUNNING); 1094 1095 if (!quiet) 1096 fprintf(stderr, "[ perf record: dump data: Woken up %ld times ]\n", 1097 waking); 1098 waking = 0; 1099 fd = record__switch_output(rec, false); 1100 if (fd < 0) { 1101 pr_err("Failed to switch to new file\n"); 1102 trigger_error(&switch_output_trigger); 1103 err = fd; 1104 goto out_child; 1105 } 1106 1107 /* re-arm the alarm */ 1108 if (rec->switch_output.time) 1109 alarm(rec->switch_output.time); 1110 } 1111 1112 if (hits == rec->samples) { 1113 if (done || draining) 1114 break; 1115 err = perf_evlist__poll(rec->evlist, -1); 1116 /* 1117 * Propagate error, only if there's any. Ignore positive 1118 * number of returned events and interrupt error. 1119 */ 1120 if (err > 0 || (err < 0 && errno == EINTR)) 1121 err = 0; 1122 waking++; 1123 1124 if (perf_evlist__filter_pollfd(rec->evlist, POLLERR | POLLHUP) == 0) 1125 draining = true; 1126 } 1127 1128 /* 1129 * When perf is starting the traced process, at the end events 1130 * die with the process and we wait for that. Thus no need to 1131 * disable events in this case. 1132 */ 1133 if (done && !disabled && !target__none(&opts->target)) { 1134 trigger_off(&auxtrace_snapshot_trigger); 1135 perf_evlist__disable(rec->evlist); 1136 disabled = true; 1137 } 1138 } 1139 trigger_off(&auxtrace_snapshot_trigger); 1140 trigger_off(&switch_output_trigger); 1141 1142 if (forks && workload_exec_errno) { 1143 char msg[STRERR_BUFSIZE]; 1144 const char *emsg = str_error_r(workload_exec_errno, msg, sizeof(msg)); 1145 pr_err("Workload failed: %s\n", emsg); 1146 err = -1; 1147 goto out_child; 1148 } 1149 1150 if (!quiet) 1151 fprintf(stderr, "[ perf record: Woken up %ld times to write data ]\n", waking); 1152 1153 if (target__none(&rec->opts.target)) 1154 record__synthesize_workload(rec, true); 1155 1156 out_child: 1157 if (forks) { 1158 int exit_status; 1159 1160 if (!child_finished) 1161 kill(rec->evlist->workload.pid, SIGTERM); 1162 1163 wait(&exit_status); 1164 1165 if (err < 0) 1166 status = err; 1167 else if (WIFEXITED(exit_status)) 1168 status = WEXITSTATUS(exit_status); 1169 else if (WIFSIGNALED(exit_status)) 1170 signr = WTERMSIG(exit_status); 1171 } else 1172 status = err; 1173 1174 record__synthesize(rec, true); 1175 /* this will be recalculated during process_buildids() */ 1176 rec->samples = 0; 1177 1178 if (!err) { 1179 if (!rec->timestamp_filename) { 1180 record__finish_output(rec); 1181 } else { 1182 fd = record__switch_output(rec, true); 1183 if (fd < 0) { 1184 status = fd; 1185 goto out_delete_session; 1186 } 1187 } 1188 } 1189 1190 perf_hooks__invoke_record_end(); 1191 1192 if (!err && !quiet) { 1193 char samples[128]; 1194 const char *postfix = rec->timestamp_filename ? 1195 ".<timestamp>" : ""; 1196 1197 if (rec->samples && !rec->opts.full_auxtrace) 1198 scnprintf(samples, sizeof(samples), 1199 " (%" PRIu64 " samples)", rec->samples); 1200 else 1201 samples[0] = '\0'; 1202 1203 fprintf(stderr, "[ perf record: Captured and wrote %.3f MB %s%s%s ]\n", 1204 perf_data__size(data) / 1024.0 / 1024.0, 1205 data->file.path, postfix, samples); 1206 } 1207 1208 out_delete_session: 1209 perf_session__delete(session); 1210 return status; 1211 } 1212 1213 static void callchain_debug(struct callchain_param *callchain) 1214 { 1215 static const char *str[CALLCHAIN_MAX] = { "NONE", "FP", "DWARF", "LBR" }; 1216 1217 pr_debug("callchain: type %s\n", str[callchain->record_mode]); 1218 1219 if (callchain->record_mode == CALLCHAIN_DWARF) 1220 pr_debug("callchain: stack dump size %d\n", 1221 callchain->dump_size); 1222 } 1223 1224 int record_opts__parse_callchain(struct record_opts *record, 1225 struct callchain_param *callchain, 1226 const char *arg, bool unset) 1227 { 1228 int ret; 1229 callchain->enabled = !unset; 1230 1231 /* --no-call-graph */ 1232 if (unset) { 1233 callchain->record_mode = CALLCHAIN_NONE; 1234 pr_debug("callchain: disabled\n"); 1235 return 0; 1236 } 1237 1238 ret = parse_callchain_record_opt(arg, callchain); 1239 if (!ret) { 1240 /* Enable data address sampling for DWARF unwind. */ 1241 if (callchain->record_mode == CALLCHAIN_DWARF) 1242 record->sample_address = true; 1243 callchain_debug(callchain); 1244 } 1245 1246 return ret; 1247 } 1248 1249 int record_parse_callchain_opt(const struct option *opt, 1250 const char *arg, 1251 int unset) 1252 { 1253 return record_opts__parse_callchain(opt->value, &callchain_param, arg, unset); 1254 } 1255 1256 int record_callchain_opt(const struct option *opt, 1257 const char *arg __maybe_unused, 1258 int unset __maybe_unused) 1259 { 1260 struct callchain_param *callchain = opt->value; 1261 1262 callchain->enabled = true; 1263 1264 if (callchain->record_mode == CALLCHAIN_NONE) 1265 callchain->record_mode = CALLCHAIN_FP; 1266 1267 callchain_debug(callchain); 1268 return 0; 1269 } 1270 1271 static int perf_record_config(const char *var, const char *value, void *cb) 1272 { 1273 struct record *rec = cb; 1274 1275 if (!strcmp(var, "record.build-id")) { 1276 if (!strcmp(value, "cache")) 1277 rec->no_buildid_cache = false; 1278 else if (!strcmp(value, "no-cache")) 1279 rec->no_buildid_cache = true; 1280 else if (!strcmp(value, "skip")) 1281 rec->no_buildid = true; 1282 else 1283 return -1; 1284 return 0; 1285 } 1286 if (!strcmp(var, "record.call-graph")) { 1287 var = "call-graph.record-mode"; 1288 return perf_default_config(var, value, cb); 1289 } 1290 1291 return 0; 1292 } 1293 1294 struct clockid_map { 1295 const char *name; 1296 int clockid; 1297 }; 1298 1299 #define CLOCKID_MAP(n, c) \ 1300 { .name = n, .clockid = (c), } 1301 1302 #define CLOCKID_END { .name = NULL, } 1303 1304 1305 /* 1306 * Add the missing ones, we need to build on many distros... 1307 */ 1308 #ifndef CLOCK_MONOTONIC_RAW 1309 #define CLOCK_MONOTONIC_RAW 4 1310 #endif 1311 #ifndef CLOCK_BOOTTIME 1312 #define CLOCK_BOOTTIME 7 1313 #endif 1314 #ifndef CLOCK_TAI 1315 #define CLOCK_TAI 11 1316 #endif 1317 1318 static const struct clockid_map clockids[] = { 1319 /* available for all events, NMI safe */ 1320 CLOCKID_MAP("monotonic", CLOCK_MONOTONIC), 1321 CLOCKID_MAP("monotonic_raw", CLOCK_MONOTONIC_RAW), 1322 1323 /* available for some events */ 1324 CLOCKID_MAP("realtime", CLOCK_REALTIME), 1325 CLOCKID_MAP("boottime", CLOCK_BOOTTIME), 1326 CLOCKID_MAP("tai", CLOCK_TAI), 1327 1328 /* available for the lazy */ 1329 CLOCKID_MAP("mono", CLOCK_MONOTONIC), 1330 CLOCKID_MAP("raw", CLOCK_MONOTONIC_RAW), 1331 CLOCKID_MAP("real", CLOCK_REALTIME), 1332 CLOCKID_MAP("boot", CLOCK_BOOTTIME), 1333 1334 CLOCKID_END, 1335 }; 1336 1337 static int parse_clockid(const struct option *opt, const char *str, int unset) 1338 { 1339 struct record_opts *opts = (struct record_opts *)opt->value; 1340 const struct clockid_map *cm; 1341 const char *ostr = str; 1342 1343 if (unset) { 1344 opts->use_clockid = 0; 1345 return 0; 1346 } 1347 1348 /* no arg passed */ 1349 if (!str) 1350 return 0; 1351 1352 /* no setting it twice */ 1353 if (opts->use_clockid) 1354 return -1; 1355 1356 opts->use_clockid = true; 1357 1358 /* if its a number, we're done */ 1359 if (sscanf(str, "%d", &opts->clockid) == 1) 1360 return 0; 1361 1362 /* allow a "CLOCK_" prefix to the name */ 1363 if (!strncasecmp(str, "CLOCK_", 6)) 1364 str += 6; 1365 1366 for (cm = clockids; cm->name; cm++) { 1367 if (!strcasecmp(str, cm->name)) { 1368 opts->clockid = cm->clockid; 1369 return 0; 1370 } 1371 } 1372 1373 opts->use_clockid = false; 1374 ui__warning("unknown clockid %s, check man page\n", ostr); 1375 return -1; 1376 } 1377 1378 static int record__parse_mmap_pages(const struct option *opt, 1379 const char *str, 1380 int unset __maybe_unused) 1381 { 1382 struct record_opts *opts = opt->value; 1383 char *s, *p; 1384 unsigned int mmap_pages; 1385 int ret; 1386 1387 if (!str) 1388 return -EINVAL; 1389 1390 s = strdup(str); 1391 if (!s) 1392 return -ENOMEM; 1393 1394 p = strchr(s, ','); 1395 if (p) 1396 *p = '\0'; 1397 1398 if (*s) { 1399 ret = __perf_evlist__parse_mmap_pages(&mmap_pages, s); 1400 if (ret) 1401 goto out_free; 1402 opts->mmap_pages = mmap_pages; 1403 } 1404 1405 if (!p) { 1406 ret = 0; 1407 goto out_free; 1408 } 1409 1410 ret = __perf_evlist__parse_mmap_pages(&mmap_pages, p + 1); 1411 if (ret) 1412 goto out_free; 1413 1414 opts->auxtrace_mmap_pages = mmap_pages; 1415 1416 out_free: 1417 free(s); 1418 return ret; 1419 } 1420 1421 static void switch_output_size_warn(struct record *rec) 1422 { 1423 u64 wakeup_size = perf_evlist__mmap_size(rec->opts.mmap_pages); 1424 struct switch_output *s = &rec->switch_output; 1425 1426 wakeup_size /= 2; 1427 1428 if (s->size < wakeup_size) { 1429 char buf[100]; 1430 1431 unit_number__scnprintf(buf, sizeof(buf), wakeup_size); 1432 pr_warning("WARNING: switch-output data size lower than " 1433 "wakeup kernel buffer size (%s) " 1434 "expect bigger perf.data sizes\n", buf); 1435 } 1436 } 1437 1438 static int switch_output_setup(struct record *rec) 1439 { 1440 struct switch_output *s = &rec->switch_output; 1441 static struct parse_tag tags_size[] = { 1442 { .tag = 'B', .mult = 1 }, 1443 { .tag = 'K', .mult = 1 << 10 }, 1444 { .tag = 'M', .mult = 1 << 20 }, 1445 { .tag = 'G', .mult = 1 << 30 }, 1446 { .tag = 0 }, 1447 }; 1448 static struct parse_tag tags_time[] = { 1449 { .tag = 's', .mult = 1 }, 1450 { .tag = 'm', .mult = 60 }, 1451 { .tag = 'h', .mult = 60*60 }, 1452 { .tag = 'd', .mult = 60*60*24 }, 1453 { .tag = 0 }, 1454 }; 1455 unsigned long val; 1456 1457 if (!s->set) 1458 return 0; 1459 1460 if (!strcmp(s->str, "signal")) { 1461 s->signal = true; 1462 pr_debug("switch-output with SIGUSR2 signal\n"); 1463 goto enabled; 1464 } 1465 1466 val = parse_tag_value(s->str, tags_size); 1467 if (val != (unsigned long) -1) { 1468 s->size = val; 1469 pr_debug("switch-output with %s size threshold\n", s->str); 1470 goto enabled; 1471 } 1472 1473 val = parse_tag_value(s->str, tags_time); 1474 if (val != (unsigned long) -1) { 1475 s->time = val; 1476 pr_debug("switch-output with %s time threshold (%lu seconds)\n", 1477 s->str, s->time); 1478 goto enabled; 1479 } 1480 1481 return -1; 1482 1483 enabled: 1484 rec->timestamp_filename = true; 1485 s->enabled = true; 1486 1487 if (s->size && !rec->opts.no_buffering) 1488 switch_output_size_warn(rec); 1489 1490 return 0; 1491 } 1492 1493 static const char * const __record_usage[] = { 1494 "perf record [<options>] [<command>]", 1495 "perf record [<options>] -- <command> [<options>]", 1496 NULL 1497 }; 1498 const char * const *record_usage = __record_usage; 1499 1500 /* 1501 * XXX Ideally would be local to cmd_record() and passed to a record__new 1502 * because we need to have access to it in record__exit, that is called 1503 * after cmd_record() exits, but since record_options need to be accessible to 1504 * builtin-script, leave it here. 1505 * 1506 * At least we don't ouch it in all the other functions here directly. 1507 * 1508 * Just say no to tons of global variables, sigh. 1509 */ 1510 static struct record record = { 1511 .opts = { 1512 .sample_time = true, 1513 .mmap_pages = UINT_MAX, 1514 .user_freq = UINT_MAX, 1515 .user_interval = ULLONG_MAX, 1516 .freq = 4000, 1517 .target = { 1518 .uses_mmap = true, 1519 .default_per_cpu = true, 1520 }, 1521 .proc_map_timeout = 500, 1522 }, 1523 .tool = { 1524 .sample = process_sample_event, 1525 .fork = perf_event__process_fork, 1526 .exit = perf_event__process_exit, 1527 .comm = perf_event__process_comm, 1528 .namespaces = perf_event__process_namespaces, 1529 .mmap = perf_event__process_mmap, 1530 .mmap2 = perf_event__process_mmap2, 1531 .ordered_events = true, 1532 }, 1533 }; 1534 1535 const char record_callchain_help[] = CALLCHAIN_RECORD_HELP 1536 "\n\t\t\t\tDefault: fp"; 1537 1538 static bool dry_run; 1539 1540 /* 1541 * XXX Will stay a global variable till we fix builtin-script.c to stop messing 1542 * with it and switch to use the library functions in perf_evlist that came 1543 * from builtin-record.c, i.e. use record_opts, 1544 * perf_evlist__prepare_workload, etc instead of fork+exec'in 'perf record', 1545 * using pipes, etc. 1546 */ 1547 static struct option __record_options[] = { 1548 OPT_CALLBACK('e', "event", &record.evlist, "event", 1549 "event selector. use 'perf list' to list available events", 1550 parse_events_option), 1551 OPT_CALLBACK(0, "filter", &record.evlist, "filter", 1552 "event filter", parse_filter), 1553 OPT_CALLBACK_NOOPT(0, "exclude-perf", &record.evlist, 1554 NULL, "don't record events from perf itself", 1555 exclude_perf), 1556 OPT_STRING('p', "pid", &record.opts.target.pid, "pid", 1557 "record events on existing process id"), 1558 OPT_STRING('t', "tid", &record.opts.target.tid, "tid", 1559 "record events on existing thread id"), 1560 OPT_INTEGER('r', "realtime", &record.realtime_prio, 1561 "collect data with this RT SCHED_FIFO priority"), 1562 OPT_BOOLEAN(0, "no-buffering", &record.opts.no_buffering, 1563 "collect data without buffering"), 1564 OPT_BOOLEAN('R', "raw-samples", &record.opts.raw_samples, 1565 "collect raw sample records from all opened counters"), 1566 OPT_BOOLEAN('a', "all-cpus", &record.opts.target.system_wide, 1567 "system-wide collection from all CPUs"), 1568 OPT_STRING('C', "cpu", &record.opts.target.cpu_list, "cpu", 1569 "list of cpus to monitor"), 1570 OPT_U64('c', "count", &record.opts.user_interval, "event period to sample"), 1571 OPT_STRING('o', "output", &record.data.file.path, "file", 1572 "output file name"), 1573 OPT_BOOLEAN_SET('i', "no-inherit", &record.opts.no_inherit, 1574 &record.opts.no_inherit_set, 1575 "child tasks do not inherit counters"), 1576 OPT_BOOLEAN(0, "tail-synthesize", &record.opts.tail_synthesize, 1577 "synthesize non-sample events at the end of output"), 1578 OPT_BOOLEAN(0, "overwrite", &record.opts.overwrite, "use overwrite mode"), 1579 OPT_BOOLEAN(0, "strict-freq", &record.opts.strict_freq, 1580 "Fail if the specified frequency can't be used"), 1581 OPT_CALLBACK('F', "freq", &record.opts, "freq or 'max'", 1582 "profile at this frequency", 1583 record__parse_freq), 1584 OPT_CALLBACK('m', "mmap-pages", &record.opts, "pages[,pages]", 1585 "number of mmap data pages and AUX area tracing mmap pages", 1586 record__parse_mmap_pages), 1587 OPT_BOOLEAN(0, "group", &record.opts.group, 1588 "put the counters into a counter group"), 1589 OPT_CALLBACK_NOOPT('g', NULL, &callchain_param, 1590 NULL, "enables call-graph recording" , 1591 &record_callchain_opt), 1592 OPT_CALLBACK(0, "call-graph", &record.opts, 1593 "record_mode[,record_size]", record_callchain_help, 1594 &record_parse_callchain_opt), 1595 OPT_INCR('v', "verbose", &verbose, 1596 "be more verbose (show counter open errors, etc)"), 1597 OPT_BOOLEAN('q', "quiet", &quiet, "don't print any message"), 1598 OPT_BOOLEAN('s', "stat", &record.opts.inherit_stat, 1599 "per thread counts"), 1600 OPT_BOOLEAN('d', "data", &record.opts.sample_address, "Record the sample addresses"), 1601 OPT_BOOLEAN(0, "phys-data", &record.opts.sample_phys_addr, 1602 "Record the sample physical addresses"), 1603 OPT_BOOLEAN(0, "sample-cpu", &record.opts.sample_cpu, "Record the sample cpu"), 1604 OPT_BOOLEAN_SET('T', "timestamp", &record.opts.sample_time, 1605 &record.opts.sample_time_set, 1606 "Record the sample timestamps"), 1607 OPT_BOOLEAN_SET('P', "period", &record.opts.period, &record.opts.period_set, 1608 "Record the sample period"), 1609 OPT_BOOLEAN('n', "no-samples", &record.opts.no_samples, 1610 "don't sample"), 1611 OPT_BOOLEAN_SET('N', "no-buildid-cache", &record.no_buildid_cache, 1612 &record.no_buildid_cache_set, 1613 "do not update the buildid cache"), 1614 OPT_BOOLEAN_SET('B', "no-buildid", &record.no_buildid, 1615 &record.no_buildid_set, 1616 "do not collect buildids in perf.data"), 1617 OPT_CALLBACK('G', "cgroup", &record.evlist, "name", 1618 "monitor event in cgroup name only", 1619 parse_cgroups), 1620 OPT_UINTEGER('D', "delay", &record.opts.initial_delay, 1621 "ms to wait before starting measurement after program start"), 1622 OPT_STRING('u', "uid", &record.opts.target.uid_str, "user", 1623 "user to profile"), 1624 1625 OPT_CALLBACK_NOOPT('b', "branch-any", &record.opts.branch_stack, 1626 "branch any", "sample any taken branches", 1627 parse_branch_stack), 1628 1629 OPT_CALLBACK('j', "branch-filter", &record.opts.branch_stack, 1630 "branch filter mask", "branch stack filter modes", 1631 parse_branch_stack), 1632 OPT_BOOLEAN('W', "weight", &record.opts.sample_weight, 1633 "sample by weight (on special events only)"), 1634 OPT_BOOLEAN(0, "transaction", &record.opts.sample_transaction, 1635 "sample transaction flags (special events only)"), 1636 OPT_BOOLEAN(0, "per-thread", &record.opts.target.per_thread, 1637 "use per-thread mmaps"), 1638 OPT_CALLBACK_OPTARG('I', "intr-regs", &record.opts.sample_intr_regs, NULL, "any register", 1639 "sample selected machine registers on interrupt," 1640 " use -I ? to list register names", parse_regs), 1641 OPT_CALLBACK_OPTARG(0, "user-regs", &record.opts.sample_user_regs, NULL, "any register", 1642 "sample selected machine registers on interrupt," 1643 " use -I ? to list register names", parse_regs), 1644 OPT_BOOLEAN(0, "running-time", &record.opts.running_time, 1645 "Record running/enabled time of read (:S) events"), 1646 OPT_CALLBACK('k', "clockid", &record.opts, 1647 "clockid", "clockid to use for events, see clock_gettime()", 1648 parse_clockid), 1649 OPT_STRING_OPTARG('S', "snapshot", &record.opts.auxtrace_snapshot_opts, 1650 "opts", "AUX area tracing Snapshot Mode", ""), 1651 OPT_UINTEGER(0, "proc-map-timeout", &record.opts.proc_map_timeout, 1652 "per thread proc mmap processing timeout in ms"), 1653 OPT_BOOLEAN(0, "namespaces", &record.opts.record_namespaces, 1654 "Record namespaces events"), 1655 OPT_BOOLEAN(0, "switch-events", &record.opts.record_switch_events, 1656 "Record context switch events"), 1657 OPT_BOOLEAN_FLAG(0, "all-kernel", &record.opts.all_kernel, 1658 "Configure all used events to run in kernel space.", 1659 PARSE_OPT_EXCLUSIVE), 1660 OPT_BOOLEAN_FLAG(0, "all-user", &record.opts.all_user, 1661 "Configure all used events to run in user space.", 1662 PARSE_OPT_EXCLUSIVE), 1663 OPT_STRING(0, "clang-path", &llvm_param.clang_path, "clang path", 1664 "clang binary to use for compiling BPF scriptlets"), 1665 OPT_STRING(0, "clang-opt", &llvm_param.clang_opt, "clang options", 1666 "options passed to clang when compiling BPF scriptlets"), 1667 OPT_STRING(0, "vmlinux", &symbol_conf.vmlinux_name, 1668 "file", "vmlinux pathname"), 1669 OPT_BOOLEAN(0, "buildid-all", &record.buildid_all, 1670 "Record build-id of all DSOs regardless of hits"), 1671 OPT_BOOLEAN(0, "timestamp-filename", &record.timestamp_filename, 1672 "append timestamp to output filename"), 1673 OPT_BOOLEAN(0, "timestamp-boundary", &record.timestamp_boundary, 1674 "Record timestamp boundary (time of first/last samples)"), 1675 OPT_STRING_OPTARG_SET(0, "switch-output", &record.switch_output.str, 1676 &record.switch_output.set, "signal,size,time", 1677 "Switch output when receive SIGUSR2 or cross size,time threshold", 1678 "signal"), 1679 OPT_BOOLEAN(0, "dry-run", &dry_run, 1680 "Parse options then exit"), 1681 OPT_END() 1682 }; 1683 1684 struct option *record_options = __record_options; 1685 1686 int cmd_record(int argc, const char **argv) 1687 { 1688 int err; 1689 struct record *rec = &record; 1690 char errbuf[BUFSIZ]; 1691 1692 setlocale(LC_ALL, ""); 1693 1694 #ifndef HAVE_LIBBPF_SUPPORT 1695 # define set_nobuild(s, l, c) set_option_nobuild(record_options, s, l, "NO_LIBBPF=1", c) 1696 set_nobuild('\0', "clang-path", true); 1697 set_nobuild('\0', "clang-opt", true); 1698 # undef set_nobuild 1699 #endif 1700 1701 #ifndef HAVE_BPF_PROLOGUE 1702 # if !defined (HAVE_DWARF_SUPPORT) 1703 # define REASON "NO_DWARF=1" 1704 # elif !defined (HAVE_LIBBPF_SUPPORT) 1705 # define REASON "NO_LIBBPF=1" 1706 # else 1707 # define REASON "this architecture doesn't support BPF prologue" 1708 # endif 1709 # define set_nobuild(s, l, c) set_option_nobuild(record_options, s, l, REASON, c) 1710 set_nobuild('\0', "vmlinux", true); 1711 # undef set_nobuild 1712 # undef REASON 1713 #endif 1714 1715 rec->evlist = perf_evlist__new(); 1716 if (rec->evlist == NULL) 1717 return -ENOMEM; 1718 1719 err = perf_config(perf_record_config, rec); 1720 if (err) 1721 return err; 1722 1723 argc = parse_options(argc, argv, record_options, record_usage, 1724 PARSE_OPT_STOP_AT_NON_OPTION); 1725 if (quiet) 1726 perf_quiet_option(); 1727 1728 /* Make system wide (-a) the default target. */ 1729 if (!argc && target__none(&rec->opts.target)) 1730 rec->opts.target.system_wide = true; 1731 1732 if (nr_cgroups && !rec->opts.target.system_wide) { 1733 usage_with_options_msg(record_usage, record_options, 1734 "cgroup monitoring only available in system-wide mode"); 1735 1736 } 1737 if (rec->opts.record_switch_events && 1738 !perf_can_record_switch_events()) { 1739 ui__error("kernel does not support recording context switch events\n"); 1740 parse_options_usage(record_usage, record_options, "switch-events", 0); 1741 return -EINVAL; 1742 } 1743 1744 if (switch_output_setup(rec)) { 1745 parse_options_usage(record_usage, record_options, "switch-output", 0); 1746 return -EINVAL; 1747 } 1748 1749 if (rec->switch_output.time) { 1750 signal(SIGALRM, alarm_sig_handler); 1751 alarm(rec->switch_output.time); 1752 } 1753 1754 /* 1755 * Allow aliases to facilitate the lookup of symbols for address 1756 * filters. Refer to auxtrace_parse_filters(). 1757 */ 1758 symbol_conf.allow_aliases = true; 1759 1760 symbol__init(NULL); 1761 1762 err = record__auxtrace_init(rec); 1763 if (err) 1764 goto out; 1765 1766 if (dry_run) 1767 goto out; 1768 1769 err = bpf__setup_stdout(rec->evlist); 1770 if (err) { 1771 bpf__strerror_setup_stdout(rec->evlist, err, errbuf, sizeof(errbuf)); 1772 pr_err("ERROR: Setup BPF stdout failed: %s\n", 1773 errbuf); 1774 goto out; 1775 } 1776 1777 err = -ENOMEM; 1778 1779 if (symbol_conf.kptr_restrict && !perf_evlist__exclude_kernel(rec->evlist)) 1780 pr_warning( 1781 "WARNING: Kernel address maps (/proc/{kallsyms,modules}) are restricted,\n" 1782 "check /proc/sys/kernel/kptr_restrict.\n\n" 1783 "Samples in kernel functions may not be resolved if a suitable vmlinux\n" 1784 "file is not found in the buildid cache or in the vmlinux path.\n\n" 1785 "Samples in kernel modules won't be resolved at all.\n\n" 1786 "If some relocation was applied (e.g. kexec) symbols may be misresolved\n" 1787 "even with a suitable vmlinux or kallsyms file.\n\n"); 1788 1789 if (rec->no_buildid_cache || rec->no_buildid) { 1790 disable_buildid_cache(); 1791 } else if (rec->switch_output.enabled) { 1792 /* 1793 * In 'perf record --switch-output', disable buildid 1794 * generation by default to reduce data file switching 1795 * overhead. Still generate buildid if they are required 1796 * explicitly using 1797 * 1798 * perf record --switch-output --no-no-buildid \ 1799 * --no-no-buildid-cache 1800 * 1801 * Following code equals to: 1802 * 1803 * if ((rec->no_buildid || !rec->no_buildid_set) && 1804 * (rec->no_buildid_cache || !rec->no_buildid_cache_set)) 1805 * disable_buildid_cache(); 1806 */ 1807 bool disable = true; 1808 1809 if (rec->no_buildid_set && !rec->no_buildid) 1810 disable = false; 1811 if (rec->no_buildid_cache_set && !rec->no_buildid_cache) 1812 disable = false; 1813 if (disable) { 1814 rec->no_buildid = true; 1815 rec->no_buildid_cache = true; 1816 disable_buildid_cache(); 1817 } 1818 } 1819 1820 if (record.opts.overwrite) 1821 record.opts.tail_synthesize = true; 1822 1823 if (rec->evlist->nr_entries == 0 && 1824 __perf_evlist__add_default(rec->evlist, !record.opts.no_samples) < 0) { 1825 pr_err("Not enough memory for event selector list\n"); 1826 goto out; 1827 } 1828 1829 if (rec->opts.target.tid && !rec->opts.no_inherit_set) 1830 rec->opts.no_inherit = true; 1831 1832 err = target__validate(&rec->opts.target); 1833 if (err) { 1834 target__strerror(&rec->opts.target, err, errbuf, BUFSIZ); 1835 ui__warning("%s\n", errbuf); 1836 } 1837 1838 err = target__parse_uid(&rec->opts.target); 1839 if (err) { 1840 int saved_errno = errno; 1841 1842 target__strerror(&rec->opts.target, err, errbuf, BUFSIZ); 1843 ui__error("%s", errbuf); 1844 1845 err = -saved_errno; 1846 goto out; 1847 } 1848 1849 /* Enable ignoring missing threads when -u/-p option is defined. */ 1850 rec->opts.ignore_missing_thread = rec->opts.target.uid != UINT_MAX || rec->opts.target.pid; 1851 1852 err = -ENOMEM; 1853 if (perf_evlist__create_maps(rec->evlist, &rec->opts.target) < 0) 1854 usage_with_options(record_usage, record_options); 1855 1856 err = auxtrace_record__options(rec->itr, rec->evlist, &rec->opts); 1857 if (err) 1858 goto out; 1859 1860 /* 1861 * We take all buildids when the file contains 1862 * AUX area tracing data because we do not decode the 1863 * trace because it would take too long. 1864 */ 1865 if (rec->opts.full_auxtrace) 1866 rec->buildid_all = true; 1867 1868 if (record_opts__config(&rec->opts)) { 1869 err = -EINVAL; 1870 goto out; 1871 } 1872 1873 err = __cmd_record(&record, argc, argv); 1874 out: 1875 perf_evlist__delete(rec->evlist); 1876 symbol__exit(); 1877 auxtrace_record__free(rec->itr); 1878 return err; 1879 } 1880 1881 static void snapshot_sig_handler(int sig __maybe_unused) 1882 { 1883 struct record *rec = &record; 1884 1885 if (trigger_is_ready(&auxtrace_snapshot_trigger)) { 1886 trigger_hit(&auxtrace_snapshot_trigger); 1887 auxtrace_record__snapshot_started = 1; 1888 if (auxtrace_record__snapshot_start(record.itr)) 1889 trigger_error(&auxtrace_snapshot_trigger); 1890 } 1891 1892 if (switch_output_signal(rec)) 1893 trigger_hit(&switch_output_trigger); 1894 } 1895 1896 static void alarm_sig_handler(int sig __maybe_unused) 1897 { 1898 struct record *rec = &record; 1899 1900 if (switch_output_time(rec)) 1901 trigger_hit(&switch_output_trigger); 1902 } 1903