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 "util/build-id.h" 12 #include <subcmd/parse-options.h> 13 #include "util/parse-events.h" 14 #include "util/config.h" 15 16 #include "util/callchain.h" 17 #include "util/cgroup.h" 18 #include "util/header.h" 19 #include "util/event.h" 20 #include "util/evlist.h" 21 #include "util/evsel.h" 22 #include "util/debug.h" 23 #include "util/mmap.h" 24 #include "util/target.h" 25 #include "util/session.h" 26 #include "util/tool.h" 27 #include "util/symbol.h" 28 #include "util/record.h" 29 #include "util/cpumap.h" 30 #include "util/thread_map.h" 31 #include "util/data.h" 32 #include "util/perf_regs.h" 33 #include "util/auxtrace.h" 34 #include "util/tsc.h" 35 #include "util/parse-branch-options.h" 36 #include "util/parse-regs-options.h" 37 #include "util/llvm-utils.h" 38 #include "util/bpf-loader.h" 39 #include "util/trigger.h" 40 #include "util/perf-hooks.h" 41 #include "util/cpu-set-sched.h" 42 #include "util/synthetic-events.h" 43 #include "util/time-utils.h" 44 #include "util/units.h" 45 #include "util/bpf-event.h" 46 #include "asm/bug.h" 47 #include "perf.h" 48 49 #include <errno.h> 50 #include <inttypes.h> 51 #include <locale.h> 52 #include <poll.h> 53 #include <unistd.h> 54 #include <sched.h> 55 #include <signal.h> 56 #include <sys/mman.h> 57 #include <sys/wait.h> 58 #include <sys/types.h> 59 #include <sys/stat.h> 60 #include <fcntl.h> 61 #include <linux/err.h> 62 #include <linux/string.h> 63 #include <linux/time64.h> 64 #include <linux/zalloc.h> 65 66 struct switch_output { 67 bool enabled; 68 bool signal; 69 unsigned long size; 70 unsigned long time; 71 const char *str; 72 bool set; 73 char **filenames; 74 int num_files; 75 int cur_file; 76 }; 77 78 struct record { 79 struct perf_tool tool; 80 struct record_opts opts; 81 u64 bytes_written; 82 struct perf_data data; 83 struct auxtrace_record *itr; 84 struct evlist *evlist; 85 struct perf_session *session; 86 int realtime_prio; 87 bool no_buildid; 88 bool no_buildid_set; 89 bool no_buildid_cache; 90 bool no_buildid_cache_set; 91 bool buildid_all; 92 bool timestamp_filename; 93 bool timestamp_boundary; 94 struct switch_output switch_output; 95 unsigned long long samples; 96 cpu_set_t affinity_mask; 97 unsigned long output_max_size; /* = 0: unlimited */ 98 }; 99 100 static volatile int done; 101 102 static volatile int auxtrace_record__snapshot_started; 103 static DEFINE_TRIGGER(auxtrace_snapshot_trigger); 104 static DEFINE_TRIGGER(switch_output_trigger); 105 106 static const char *affinity_tags[PERF_AFFINITY_MAX] = { 107 "SYS", "NODE", "CPU" 108 }; 109 110 static bool switch_output_signal(struct record *rec) 111 { 112 return rec->switch_output.signal && 113 trigger_is_ready(&switch_output_trigger); 114 } 115 116 static bool switch_output_size(struct record *rec) 117 { 118 return rec->switch_output.size && 119 trigger_is_ready(&switch_output_trigger) && 120 (rec->bytes_written >= rec->switch_output.size); 121 } 122 123 static bool switch_output_time(struct record *rec) 124 { 125 return rec->switch_output.time && 126 trigger_is_ready(&switch_output_trigger); 127 } 128 129 static bool record__output_max_size_exceeded(struct record *rec) 130 { 131 return rec->output_max_size && 132 (rec->bytes_written >= rec->output_max_size); 133 } 134 135 static int record__write(struct record *rec, struct mmap *map __maybe_unused, 136 void *bf, size_t size) 137 { 138 struct perf_data_file *file = &rec->session->data->file; 139 140 if (perf_data_file__write(file, bf, size) < 0) { 141 pr_err("failed to write perf data, error: %m\n"); 142 return -1; 143 } 144 145 rec->bytes_written += size; 146 147 if (record__output_max_size_exceeded(rec) && !done) { 148 fprintf(stderr, "[ perf record: perf size limit reached (%" PRIu64 " KB)," 149 " stopping session ]\n", 150 rec->bytes_written >> 10); 151 done = 1; 152 } 153 154 if (switch_output_size(rec)) 155 trigger_hit(&switch_output_trigger); 156 157 return 0; 158 } 159 160 static int record__aio_enabled(struct record *rec); 161 static int record__comp_enabled(struct record *rec); 162 static size_t zstd_compress(struct perf_session *session, void *dst, size_t dst_size, 163 void *src, size_t src_size); 164 165 #ifdef HAVE_AIO_SUPPORT 166 static int record__aio_write(struct aiocb *cblock, int trace_fd, 167 void *buf, size_t size, off_t off) 168 { 169 int rc; 170 171 cblock->aio_fildes = trace_fd; 172 cblock->aio_buf = buf; 173 cblock->aio_nbytes = size; 174 cblock->aio_offset = off; 175 cblock->aio_sigevent.sigev_notify = SIGEV_NONE; 176 177 do { 178 rc = aio_write(cblock); 179 if (rc == 0) { 180 break; 181 } else if (errno != EAGAIN) { 182 cblock->aio_fildes = -1; 183 pr_err("failed to queue perf data, error: %m\n"); 184 break; 185 } 186 } while (1); 187 188 return rc; 189 } 190 191 static int record__aio_complete(struct mmap *md, struct aiocb *cblock) 192 { 193 void *rem_buf; 194 off_t rem_off; 195 size_t rem_size; 196 int rc, aio_errno; 197 ssize_t aio_ret, written; 198 199 aio_errno = aio_error(cblock); 200 if (aio_errno == EINPROGRESS) 201 return 0; 202 203 written = aio_ret = aio_return(cblock); 204 if (aio_ret < 0) { 205 if (aio_errno != EINTR) 206 pr_err("failed to write perf data, error: %m\n"); 207 written = 0; 208 } 209 210 rem_size = cblock->aio_nbytes - written; 211 212 if (rem_size == 0) { 213 cblock->aio_fildes = -1; 214 /* 215 * md->refcount is incremented in record__aio_pushfn() for 216 * every aio write request started in record__aio_push() so 217 * decrement it because the request is now complete. 218 */ 219 perf_mmap__put(&md->core); 220 rc = 1; 221 } else { 222 /* 223 * aio write request may require restart with the 224 * reminder if the kernel didn't write whole 225 * chunk at once. 226 */ 227 rem_off = cblock->aio_offset + written; 228 rem_buf = (void *)(cblock->aio_buf + written); 229 record__aio_write(cblock, cblock->aio_fildes, 230 rem_buf, rem_size, rem_off); 231 rc = 0; 232 } 233 234 return rc; 235 } 236 237 static int record__aio_sync(struct mmap *md, bool sync_all) 238 { 239 struct aiocb **aiocb = md->aio.aiocb; 240 struct aiocb *cblocks = md->aio.cblocks; 241 struct timespec timeout = { 0, 1000 * 1000 * 1 }; /* 1ms */ 242 int i, do_suspend; 243 244 do { 245 do_suspend = 0; 246 for (i = 0; i < md->aio.nr_cblocks; ++i) { 247 if (cblocks[i].aio_fildes == -1 || record__aio_complete(md, &cblocks[i])) { 248 if (sync_all) 249 aiocb[i] = NULL; 250 else 251 return i; 252 } else { 253 /* 254 * Started aio write is not complete yet 255 * so it has to be waited before the 256 * next allocation. 257 */ 258 aiocb[i] = &cblocks[i]; 259 do_suspend = 1; 260 } 261 } 262 if (!do_suspend) 263 return -1; 264 265 while (aio_suspend((const struct aiocb **)aiocb, md->aio.nr_cblocks, &timeout)) { 266 if (!(errno == EAGAIN || errno == EINTR)) 267 pr_err("failed to sync perf data, error: %m\n"); 268 } 269 } while (1); 270 } 271 272 struct record_aio { 273 struct record *rec; 274 void *data; 275 size_t size; 276 }; 277 278 static int record__aio_pushfn(struct mmap *map, void *to, void *buf, size_t size) 279 { 280 struct record_aio *aio = to; 281 282 /* 283 * map->core.base data pointed by buf is copied into free map->aio.data[] buffer 284 * to release space in the kernel buffer as fast as possible, calling 285 * perf_mmap__consume() from perf_mmap__push() function. 286 * 287 * That lets the kernel to proceed with storing more profiling data into 288 * the kernel buffer earlier than other per-cpu kernel buffers are handled. 289 * 290 * Coping can be done in two steps in case the chunk of profiling data 291 * crosses the upper bound of the kernel buffer. In this case we first move 292 * part of data from map->start till the upper bound and then the reminder 293 * from the beginning of the kernel buffer till the end of the data chunk. 294 */ 295 296 if (record__comp_enabled(aio->rec)) { 297 size = zstd_compress(aio->rec->session, aio->data + aio->size, 298 mmap__mmap_len(map) - aio->size, 299 buf, size); 300 } else { 301 memcpy(aio->data + aio->size, buf, size); 302 } 303 304 if (!aio->size) { 305 /* 306 * Increment map->refcount to guard map->aio.data[] buffer 307 * from premature deallocation because map object can be 308 * released earlier than aio write request started on 309 * map->aio.data[] buffer is complete. 310 * 311 * perf_mmap__put() is done at record__aio_complete() 312 * after started aio request completion or at record__aio_push() 313 * if the request failed to start. 314 */ 315 perf_mmap__get(&map->core); 316 } 317 318 aio->size += size; 319 320 return size; 321 } 322 323 static int record__aio_push(struct record *rec, struct mmap *map, off_t *off) 324 { 325 int ret, idx; 326 int trace_fd = rec->session->data->file.fd; 327 struct record_aio aio = { .rec = rec, .size = 0 }; 328 329 /* 330 * Call record__aio_sync() to wait till map->aio.data[] buffer 331 * becomes available after previous aio write operation. 332 */ 333 334 idx = record__aio_sync(map, false); 335 aio.data = map->aio.data[idx]; 336 ret = perf_mmap__push(map, &aio, record__aio_pushfn); 337 if (ret != 0) /* ret > 0 - no data, ret < 0 - error */ 338 return ret; 339 340 rec->samples++; 341 ret = record__aio_write(&(map->aio.cblocks[idx]), trace_fd, aio.data, aio.size, *off); 342 if (!ret) { 343 *off += aio.size; 344 rec->bytes_written += aio.size; 345 if (switch_output_size(rec)) 346 trigger_hit(&switch_output_trigger); 347 } else { 348 /* 349 * Decrement map->refcount incremented in record__aio_pushfn() 350 * back if record__aio_write() operation failed to start, otherwise 351 * map->refcount is decremented in record__aio_complete() after 352 * aio write operation finishes successfully. 353 */ 354 perf_mmap__put(&map->core); 355 } 356 357 return ret; 358 } 359 360 static off_t record__aio_get_pos(int trace_fd) 361 { 362 return lseek(trace_fd, 0, SEEK_CUR); 363 } 364 365 static void record__aio_set_pos(int trace_fd, off_t pos) 366 { 367 lseek(trace_fd, pos, SEEK_SET); 368 } 369 370 static void record__aio_mmap_read_sync(struct record *rec) 371 { 372 int i; 373 struct evlist *evlist = rec->evlist; 374 struct mmap *maps = evlist->mmap; 375 376 if (!record__aio_enabled(rec)) 377 return; 378 379 for (i = 0; i < evlist->core.nr_mmaps; i++) { 380 struct mmap *map = &maps[i]; 381 382 if (map->core.base) 383 record__aio_sync(map, true); 384 } 385 } 386 387 static int nr_cblocks_default = 1; 388 static int nr_cblocks_max = 4; 389 390 static int record__aio_parse(const struct option *opt, 391 const char *str, 392 int unset) 393 { 394 struct record_opts *opts = (struct record_opts *)opt->value; 395 396 if (unset) { 397 opts->nr_cblocks = 0; 398 } else { 399 if (str) 400 opts->nr_cblocks = strtol(str, NULL, 0); 401 if (!opts->nr_cblocks) 402 opts->nr_cblocks = nr_cblocks_default; 403 } 404 405 return 0; 406 } 407 #else /* HAVE_AIO_SUPPORT */ 408 static int nr_cblocks_max = 0; 409 410 static int record__aio_push(struct record *rec __maybe_unused, struct mmap *map __maybe_unused, 411 off_t *off __maybe_unused) 412 { 413 return -1; 414 } 415 416 static off_t record__aio_get_pos(int trace_fd __maybe_unused) 417 { 418 return -1; 419 } 420 421 static void record__aio_set_pos(int trace_fd __maybe_unused, off_t pos __maybe_unused) 422 { 423 } 424 425 static void record__aio_mmap_read_sync(struct record *rec __maybe_unused) 426 { 427 } 428 #endif 429 430 static int record__aio_enabled(struct record *rec) 431 { 432 return rec->opts.nr_cblocks > 0; 433 } 434 435 #define MMAP_FLUSH_DEFAULT 1 436 static int record__mmap_flush_parse(const struct option *opt, 437 const char *str, 438 int unset) 439 { 440 int flush_max; 441 struct record_opts *opts = (struct record_opts *)opt->value; 442 static struct parse_tag tags[] = { 443 { .tag = 'B', .mult = 1 }, 444 { .tag = 'K', .mult = 1 << 10 }, 445 { .tag = 'M', .mult = 1 << 20 }, 446 { .tag = 'G', .mult = 1 << 30 }, 447 { .tag = 0 }, 448 }; 449 450 if (unset) 451 return 0; 452 453 if (str) { 454 opts->mmap_flush = parse_tag_value(str, tags); 455 if (opts->mmap_flush == (int)-1) 456 opts->mmap_flush = strtol(str, NULL, 0); 457 } 458 459 if (!opts->mmap_flush) 460 opts->mmap_flush = MMAP_FLUSH_DEFAULT; 461 462 flush_max = evlist__mmap_size(opts->mmap_pages); 463 flush_max /= 4; 464 if (opts->mmap_flush > flush_max) 465 opts->mmap_flush = flush_max; 466 467 return 0; 468 } 469 470 #ifdef HAVE_ZSTD_SUPPORT 471 static unsigned int comp_level_default = 1; 472 473 static int record__parse_comp_level(const struct option *opt, const char *str, int unset) 474 { 475 struct record_opts *opts = opt->value; 476 477 if (unset) { 478 opts->comp_level = 0; 479 } else { 480 if (str) 481 opts->comp_level = strtol(str, NULL, 0); 482 if (!opts->comp_level) 483 opts->comp_level = comp_level_default; 484 } 485 486 return 0; 487 } 488 #endif 489 static unsigned int comp_level_max = 22; 490 491 static int record__comp_enabled(struct record *rec) 492 { 493 return rec->opts.comp_level > 0; 494 } 495 496 static int process_synthesized_event(struct perf_tool *tool, 497 union perf_event *event, 498 struct perf_sample *sample __maybe_unused, 499 struct machine *machine __maybe_unused) 500 { 501 struct record *rec = container_of(tool, struct record, tool); 502 return record__write(rec, NULL, event, event->header.size); 503 } 504 505 static int record__pushfn(struct mmap *map, void *to, void *bf, size_t size) 506 { 507 struct record *rec = to; 508 509 if (record__comp_enabled(rec)) { 510 size = zstd_compress(rec->session, map->data, mmap__mmap_len(map), bf, size); 511 bf = map->data; 512 } 513 514 rec->samples++; 515 return record__write(rec, map, bf, size); 516 } 517 518 static volatile int signr = -1; 519 static volatile int child_finished; 520 521 static void sig_handler(int sig) 522 { 523 if (sig == SIGCHLD) 524 child_finished = 1; 525 else 526 signr = sig; 527 528 done = 1; 529 } 530 531 static void sigsegv_handler(int sig) 532 { 533 perf_hooks__recover(); 534 sighandler_dump_stack(sig); 535 } 536 537 static void record__sig_exit(void) 538 { 539 if (signr == -1) 540 return; 541 542 signal(signr, SIG_DFL); 543 raise(signr); 544 } 545 546 #ifdef HAVE_AUXTRACE_SUPPORT 547 548 static int record__process_auxtrace(struct perf_tool *tool, 549 struct mmap *map, 550 union perf_event *event, void *data1, 551 size_t len1, void *data2, size_t len2) 552 { 553 struct record *rec = container_of(tool, struct record, tool); 554 struct perf_data *data = &rec->data; 555 size_t padding; 556 u8 pad[8] = {0}; 557 558 if (!perf_data__is_pipe(data) && perf_data__is_single_file(data)) { 559 off_t file_offset; 560 int fd = perf_data__fd(data); 561 int err; 562 563 file_offset = lseek(fd, 0, SEEK_CUR); 564 if (file_offset == -1) 565 return -1; 566 err = auxtrace_index__auxtrace_event(&rec->session->auxtrace_index, 567 event, file_offset); 568 if (err) 569 return err; 570 } 571 572 /* event.auxtrace.size includes padding, see __auxtrace_mmap__read() */ 573 padding = (len1 + len2) & 7; 574 if (padding) 575 padding = 8 - padding; 576 577 record__write(rec, map, event, event->header.size); 578 record__write(rec, map, data1, len1); 579 if (len2) 580 record__write(rec, map, data2, len2); 581 record__write(rec, map, &pad, padding); 582 583 return 0; 584 } 585 586 static int record__auxtrace_mmap_read(struct record *rec, 587 struct mmap *map) 588 { 589 int ret; 590 591 ret = auxtrace_mmap__read(map, rec->itr, &rec->tool, 592 record__process_auxtrace); 593 if (ret < 0) 594 return ret; 595 596 if (ret) 597 rec->samples++; 598 599 return 0; 600 } 601 602 static int record__auxtrace_mmap_read_snapshot(struct record *rec, 603 struct mmap *map) 604 { 605 int ret; 606 607 ret = auxtrace_mmap__read_snapshot(map, rec->itr, &rec->tool, 608 record__process_auxtrace, 609 rec->opts.auxtrace_snapshot_size); 610 if (ret < 0) 611 return ret; 612 613 if (ret) 614 rec->samples++; 615 616 return 0; 617 } 618 619 static int record__auxtrace_read_snapshot_all(struct record *rec) 620 { 621 int i; 622 int rc = 0; 623 624 for (i = 0; i < rec->evlist->core.nr_mmaps; i++) { 625 struct mmap *map = &rec->evlist->mmap[i]; 626 627 if (!map->auxtrace_mmap.base) 628 continue; 629 630 if (record__auxtrace_mmap_read_snapshot(rec, map) != 0) { 631 rc = -1; 632 goto out; 633 } 634 } 635 out: 636 return rc; 637 } 638 639 static void record__read_auxtrace_snapshot(struct record *rec, bool on_exit) 640 { 641 pr_debug("Recording AUX area tracing snapshot\n"); 642 if (record__auxtrace_read_snapshot_all(rec) < 0) { 643 trigger_error(&auxtrace_snapshot_trigger); 644 } else { 645 if (auxtrace_record__snapshot_finish(rec->itr, on_exit)) 646 trigger_error(&auxtrace_snapshot_trigger); 647 else 648 trigger_ready(&auxtrace_snapshot_trigger); 649 } 650 } 651 652 static int record__auxtrace_snapshot_exit(struct record *rec) 653 { 654 if (trigger_is_error(&auxtrace_snapshot_trigger)) 655 return 0; 656 657 if (!auxtrace_record__snapshot_started && 658 auxtrace_record__snapshot_start(rec->itr)) 659 return -1; 660 661 record__read_auxtrace_snapshot(rec, true); 662 if (trigger_is_error(&auxtrace_snapshot_trigger)) 663 return -1; 664 665 return 0; 666 } 667 668 static int record__auxtrace_init(struct record *rec) 669 { 670 int err; 671 672 if (!rec->itr) { 673 rec->itr = auxtrace_record__init(rec->evlist, &err); 674 if (err) 675 return err; 676 } 677 678 err = auxtrace_parse_snapshot_options(rec->itr, &rec->opts, 679 rec->opts.auxtrace_snapshot_opts); 680 if (err) 681 return err; 682 683 err = auxtrace_parse_sample_options(rec->itr, rec->evlist, &rec->opts, 684 rec->opts.auxtrace_sample_opts); 685 if (err) 686 return err; 687 688 return auxtrace_parse_filters(rec->evlist); 689 } 690 691 #else 692 693 static inline 694 int record__auxtrace_mmap_read(struct record *rec __maybe_unused, 695 struct mmap *map __maybe_unused) 696 { 697 return 0; 698 } 699 700 static inline 701 void record__read_auxtrace_snapshot(struct record *rec __maybe_unused, 702 bool on_exit __maybe_unused) 703 { 704 } 705 706 static inline 707 int auxtrace_record__snapshot_start(struct auxtrace_record *itr __maybe_unused) 708 { 709 return 0; 710 } 711 712 static inline 713 int record__auxtrace_snapshot_exit(struct record *rec __maybe_unused) 714 { 715 return 0; 716 } 717 718 static int record__auxtrace_init(struct record *rec __maybe_unused) 719 { 720 return 0; 721 } 722 723 #endif 724 725 static bool record__kcore_readable(struct machine *machine) 726 { 727 char kcore[PATH_MAX]; 728 int fd; 729 730 scnprintf(kcore, sizeof(kcore), "%s/proc/kcore", machine->root_dir); 731 732 fd = open(kcore, O_RDONLY); 733 if (fd < 0) 734 return false; 735 736 close(fd); 737 738 return true; 739 } 740 741 static int record__kcore_copy(struct machine *machine, struct perf_data *data) 742 { 743 char from_dir[PATH_MAX]; 744 char kcore_dir[PATH_MAX]; 745 int ret; 746 747 snprintf(from_dir, sizeof(from_dir), "%s/proc", machine->root_dir); 748 749 ret = perf_data__make_kcore_dir(data, kcore_dir, sizeof(kcore_dir)); 750 if (ret) 751 return ret; 752 753 return kcore_copy(from_dir, kcore_dir); 754 } 755 756 static int record__mmap_evlist(struct record *rec, 757 struct evlist *evlist) 758 { 759 struct record_opts *opts = &rec->opts; 760 bool auxtrace_overwrite = opts->auxtrace_snapshot_mode || 761 opts->auxtrace_sample_mode; 762 char msg[512]; 763 764 if (opts->affinity != PERF_AFFINITY_SYS) 765 cpu__setup_cpunode_map(); 766 767 if (evlist__mmap_ex(evlist, opts->mmap_pages, 768 opts->auxtrace_mmap_pages, 769 auxtrace_overwrite, 770 opts->nr_cblocks, opts->affinity, 771 opts->mmap_flush, opts->comp_level) < 0) { 772 if (errno == EPERM) { 773 pr_err("Permission error mapping pages.\n" 774 "Consider increasing " 775 "/proc/sys/kernel/perf_event_mlock_kb,\n" 776 "or try again with a smaller value of -m/--mmap_pages.\n" 777 "(current value: %u,%u)\n", 778 opts->mmap_pages, opts->auxtrace_mmap_pages); 779 return -errno; 780 } else { 781 pr_err("failed to mmap with %d (%s)\n", errno, 782 str_error_r(errno, msg, sizeof(msg))); 783 if (errno) 784 return -errno; 785 else 786 return -EINVAL; 787 } 788 } 789 return 0; 790 } 791 792 static int record__mmap(struct record *rec) 793 { 794 return record__mmap_evlist(rec, rec->evlist); 795 } 796 797 static int record__open(struct record *rec) 798 { 799 char msg[BUFSIZ]; 800 struct evsel *pos; 801 struct evlist *evlist = rec->evlist; 802 struct perf_session *session = rec->session; 803 struct record_opts *opts = &rec->opts; 804 int rc = 0; 805 806 /* 807 * For initial_delay we need to add a dummy event so that we can track 808 * PERF_RECORD_MMAP while we wait for the initial delay to enable the 809 * real events, the ones asked by the user. 810 */ 811 if (opts->initial_delay) { 812 if (perf_evlist__add_dummy(evlist)) 813 return -ENOMEM; 814 815 pos = evlist__first(evlist); 816 pos->tracking = 0; 817 pos = evlist__last(evlist); 818 pos->tracking = 1; 819 pos->core.attr.enable_on_exec = 1; 820 } 821 822 perf_evlist__config(evlist, opts, &callchain_param); 823 824 evlist__for_each_entry(evlist, pos) { 825 try_again: 826 if (evsel__open(pos, pos->core.cpus, pos->core.threads) < 0) { 827 if (perf_evsel__fallback(pos, errno, msg, sizeof(msg))) { 828 if (verbose > 0) 829 ui__warning("%s\n", msg); 830 goto try_again; 831 } 832 if ((errno == EINVAL || errno == EBADF) && 833 pos->leader != pos && 834 pos->weak_group) { 835 pos = perf_evlist__reset_weak_group(evlist, pos, true); 836 goto try_again; 837 } 838 rc = -errno; 839 perf_evsel__open_strerror(pos, &opts->target, 840 errno, msg, sizeof(msg)); 841 ui__error("%s\n", msg); 842 goto out; 843 } 844 845 pos->supported = true; 846 } 847 848 if (symbol_conf.kptr_restrict && !perf_evlist__exclude_kernel(evlist)) { 849 pr_warning( 850 "WARNING: Kernel address maps (/proc/{kallsyms,modules}) are restricted,\n" 851 "check /proc/sys/kernel/kptr_restrict and /proc/sys/kernel/perf_event_paranoid.\n\n" 852 "Samples in kernel functions may not be resolved if a suitable vmlinux\n" 853 "file is not found in the buildid cache or in the vmlinux path.\n\n" 854 "Samples in kernel modules won't be resolved at all.\n\n" 855 "If some relocation was applied (e.g. kexec) symbols may be misresolved\n" 856 "even with a suitable vmlinux or kallsyms file.\n\n"); 857 } 858 859 if (perf_evlist__apply_filters(evlist, &pos)) { 860 pr_err("failed to set filter \"%s\" on event %s with %d (%s)\n", 861 pos->filter, perf_evsel__name(pos), errno, 862 str_error_r(errno, msg, sizeof(msg))); 863 rc = -1; 864 goto out; 865 } 866 867 rc = record__mmap(rec); 868 if (rc) 869 goto out; 870 871 session->evlist = evlist; 872 perf_session__set_id_hdr_size(session); 873 out: 874 return rc; 875 } 876 877 static int process_sample_event(struct perf_tool *tool, 878 union perf_event *event, 879 struct perf_sample *sample, 880 struct evsel *evsel, 881 struct machine *machine) 882 { 883 struct record *rec = container_of(tool, struct record, tool); 884 885 if (rec->evlist->first_sample_time == 0) 886 rec->evlist->first_sample_time = sample->time; 887 888 rec->evlist->last_sample_time = sample->time; 889 890 if (rec->buildid_all) 891 return 0; 892 893 rec->samples++; 894 return build_id__mark_dso_hit(tool, event, sample, evsel, machine); 895 } 896 897 static int process_buildids(struct record *rec) 898 { 899 struct perf_session *session = rec->session; 900 901 if (perf_data__size(&rec->data) == 0) 902 return 0; 903 904 /* 905 * During this process, it'll load kernel map and replace the 906 * dso->long_name to a real pathname it found. In this case 907 * we prefer the vmlinux path like 908 * /lib/modules/3.16.4/build/vmlinux 909 * 910 * rather than build-id path (in debug directory). 911 * $HOME/.debug/.build-id/f0/6e17aa50adf4d00b88925e03775de107611551 912 */ 913 symbol_conf.ignore_vmlinux_buildid = true; 914 915 /* 916 * If --buildid-all is given, it marks all DSO regardless of hits, 917 * so no need to process samples. But if timestamp_boundary is enabled, 918 * it still needs to walk on all samples to get the timestamps of 919 * first/last samples. 920 */ 921 if (rec->buildid_all && !rec->timestamp_boundary) 922 rec->tool.sample = NULL; 923 924 return perf_session__process_events(session); 925 } 926 927 static void perf_event__synthesize_guest_os(struct machine *machine, void *data) 928 { 929 int err; 930 struct perf_tool *tool = data; 931 /* 932 *As for guest kernel when processing subcommand record&report, 933 *we arrange module mmap prior to guest kernel mmap and trigger 934 *a preload dso because default guest module symbols are loaded 935 *from guest kallsyms instead of /lib/modules/XXX/XXX. This 936 *method is used to avoid symbol missing when the first addr is 937 *in module instead of in guest kernel. 938 */ 939 err = perf_event__synthesize_modules(tool, process_synthesized_event, 940 machine); 941 if (err < 0) 942 pr_err("Couldn't record guest kernel [%d]'s reference" 943 " relocation symbol.\n", machine->pid); 944 945 /* 946 * We use _stext for guest kernel because guest kernel's /proc/kallsyms 947 * have no _text sometimes. 948 */ 949 err = perf_event__synthesize_kernel_mmap(tool, process_synthesized_event, 950 machine); 951 if (err < 0) 952 pr_err("Couldn't record guest kernel [%d]'s reference" 953 " relocation symbol.\n", machine->pid); 954 } 955 956 static struct perf_event_header finished_round_event = { 957 .size = sizeof(struct perf_event_header), 958 .type = PERF_RECORD_FINISHED_ROUND, 959 }; 960 961 static void record__adjust_affinity(struct record *rec, struct mmap *map) 962 { 963 if (rec->opts.affinity != PERF_AFFINITY_SYS && 964 !CPU_EQUAL(&rec->affinity_mask, &map->affinity_mask)) { 965 CPU_ZERO(&rec->affinity_mask); 966 CPU_OR(&rec->affinity_mask, &rec->affinity_mask, &map->affinity_mask); 967 sched_setaffinity(0, sizeof(rec->affinity_mask), &rec->affinity_mask); 968 } 969 } 970 971 static size_t process_comp_header(void *record, size_t increment) 972 { 973 struct perf_record_compressed *event = record; 974 size_t size = sizeof(*event); 975 976 if (increment) { 977 event->header.size += increment; 978 return increment; 979 } 980 981 event->header.type = PERF_RECORD_COMPRESSED; 982 event->header.size = size; 983 984 return size; 985 } 986 987 static size_t zstd_compress(struct perf_session *session, void *dst, size_t dst_size, 988 void *src, size_t src_size) 989 { 990 size_t compressed; 991 size_t max_record_size = PERF_SAMPLE_MAX_SIZE - sizeof(struct perf_record_compressed) - 1; 992 993 compressed = zstd_compress_stream_to_records(&session->zstd_data, dst, dst_size, src, src_size, 994 max_record_size, process_comp_header); 995 996 session->bytes_transferred += src_size; 997 session->bytes_compressed += compressed; 998 999 return compressed; 1000 } 1001 1002 static int record__mmap_read_evlist(struct record *rec, struct evlist *evlist, 1003 bool overwrite, bool synch) 1004 { 1005 u64 bytes_written = rec->bytes_written; 1006 int i; 1007 int rc = 0; 1008 struct mmap *maps; 1009 int trace_fd = rec->data.file.fd; 1010 off_t off = 0; 1011 1012 if (!evlist) 1013 return 0; 1014 1015 maps = overwrite ? evlist->overwrite_mmap : evlist->mmap; 1016 if (!maps) 1017 return 0; 1018 1019 if (overwrite && evlist->bkw_mmap_state != BKW_MMAP_DATA_PENDING) 1020 return 0; 1021 1022 if (record__aio_enabled(rec)) 1023 off = record__aio_get_pos(trace_fd); 1024 1025 for (i = 0; i < evlist->core.nr_mmaps; i++) { 1026 u64 flush = 0; 1027 struct mmap *map = &maps[i]; 1028 1029 if (map->core.base) { 1030 record__adjust_affinity(rec, map); 1031 if (synch) { 1032 flush = map->core.flush; 1033 map->core.flush = 1; 1034 } 1035 if (!record__aio_enabled(rec)) { 1036 if (perf_mmap__push(map, rec, record__pushfn) < 0) { 1037 if (synch) 1038 map->core.flush = flush; 1039 rc = -1; 1040 goto out; 1041 } 1042 } else { 1043 if (record__aio_push(rec, map, &off) < 0) { 1044 record__aio_set_pos(trace_fd, off); 1045 if (synch) 1046 map->core.flush = flush; 1047 rc = -1; 1048 goto out; 1049 } 1050 } 1051 if (synch) 1052 map->core.flush = flush; 1053 } 1054 1055 if (map->auxtrace_mmap.base && !rec->opts.auxtrace_snapshot_mode && 1056 !rec->opts.auxtrace_sample_mode && 1057 record__auxtrace_mmap_read(rec, map) != 0) { 1058 rc = -1; 1059 goto out; 1060 } 1061 } 1062 1063 if (record__aio_enabled(rec)) 1064 record__aio_set_pos(trace_fd, off); 1065 1066 /* 1067 * Mark the round finished in case we wrote 1068 * at least one event. 1069 */ 1070 if (bytes_written != rec->bytes_written) 1071 rc = record__write(rec, NULL, &finished_round_event, sizeof(finished_round_event)); 1072 1073 if (overwrite) 1074 perf_evlist__toggle_bkw_mmap(evlist, BKW_MMAP_EMPTY); 1075 out: 1076 return rc; 1077 } 1078 1079 static int record__mmap_read_all(struct record *rec, bool synch) 1080 { 1081 int err; 1082 1083 err = record__mmap_read_evlist(rec, rec->evlist, false, synch); 1084 if (err) 1085 return err; 1086 1087 return record__mmap_read_evlist(rec, rec->evlist, true, synch); 1088 } 1089 1090 static void record__init_features(struct record *rec) 1091 { 1092 struct perf_session *session = rec->session; 1093 int feat; 1094 1095 for (feat = HEADER_FIRST_FEATURE; feat < HEADER_LAST_FEATURE; feat++) 1096 perf_header__set_feat(&session->header, feat); 1097 1098 if (rec->no_buildid) 1099 perf_header__clear_feat(&session->header, HEADER_BUILD_ID); 1100 1101 if (!have_tracepoints(&rec->evlist->core.entries)) 1102 perf_header__clear_feat(&session->header, HEADER_TRACING_DATA); 1103 1104 if (!rec->opts.branch_stack) 1105 perf_header__clear_feat(&session->header, HEADER_BRANCH_STACK); 1106 1107 if (!rec->opts.full_auxtrace) 1108 perf_header__clear_feat(&session->header, HEADER_AUXTRACE); 1109 1110 if (!(rec->opts.use_clockid && rec->opts.clockid_res_ns)) 1111 perf_header__clear_feat(&session->header, HEADER_CLOCKID); 1112 1113 perf_header__clear_feat(&session->header, HEADER_DIR_FORMAT); 1114 if (!record__comp_enabled(rec)) 1115 perf_header__clear_feat(&session->header, HEADER_COMPRESSED); 1116 1117 perf_header__clear_feat(&session->header, HEADER_STAT); 1118 } 1119 1120 static void 1121 record__finish_output(struct record *rec) 1122 { 1123 struct perf_data *data = &rec->data; 1124 int fd = perf_data__fd(data); 1125 1126 if (data->is_pipe) 1127 return; 1128 1129 rec->session->header.data_size += rec->bytes_written; 1130 data->file.size = lseek(perf_data__fd(data), 0, SEEK_CUR); 1131 1132 if (!rec->no_buildid) { 1133 process_buildids(rec); 1134 1135 if (rec->buildid_all) 1136 dsos__hit_all(rec->session); 1137 } 1138 perf_session__write_header(rec->session, rec->evlist, fd, true); 1139 1140 return; 1141 } 1142 1143 static int record__synthesize_workload(struct record *rec, bool tail) 1144 { 1145 int err; 1146 struct perf_thread_map *thread_map; 1147 1148 if (rec->opts.tail_synthesize != tail) 1149 return 0; 1150 1151 thread_map = thread_map__new_by_tid(rec->evlist->workload.pid); 1152 if (thread_map == NULL) 1153 return -1; 1154 1155 err = perf_event__synthesize_thread_map(&rec->tool, thread_map, 1156 process_synthesized_event, 1157 &rec->session->machines.host, 1158 rec->opts.sample_address); 1159 perf_thread_map__put(thread_map); 1160 return err; 1161 } 1162 1163 static int record__synthesize(struct record *rec, bool tail); 1164 1165 static int 1166 record__switch_output(struct record *rec, bool at_exit) 1167 { 1168 struct perf_data *data = &rec->data; 1169 int fd, err; 1170 char *new_filename; 1171 1172 /* Same Size: "2015122520103046"*/ 1173 char timestamp[] = "InvalidTimestamp"; 1174 1175 record__aio_mmap_read_sync(rec); 1176 1177 record__synthesize(rec, true); 1178 if (target__none(&rec->opts.target)) 1179 record__synthesize_workload(rec, true); 1180 1181 rec->samples = 0; 1182 record__finish_output(rec); 1183 err = fetch_current_timestamp(timestamp, sizeof(timestamp)); 1184 if (err) { 1185 pr_err("Failed to get current timestamp\n"); 1186 return -EINVAL; 1187 } 1188 1189 fd = perf_data__switch(data, timestamp, 1190 rec->session->header.data_offset, 1191 at_exit, &new_filename); 1192 if (fd >= 0 && !at_exit) { 1193 rec->bytes_written = 0; 1194 rec->session->header.data_size = 0; 1195 } 1196 1197 if (!quiet) 1198 fprintf(stderr, "[ perf record: Dump %s.%s ]\n", 1199 data->path, timestamp); 1200 1201 if (rec->switch_output.num_files) { 1202 int n = rec->switch_output.cur_file + 1; 1203 1204 if (n >= rec->switch_output.num_files) 1205 n = 0; 1206 rec->switch_output.cur_file = n; 1207 if (rec->switch_output.filenames[n]) { 1208 remove(rec->switch_output.filenames[n]); 1209 zfree(&rec->switch_output.filenames[n]); 1210 } 1211 rec->switch_output.filenames[n] = new_filename; 1212 } else { 1213 free(new_filename); 1214 } 1215 1216 /* Output tracking events */ 1217 if (!at_exit) { 1218 record__synthesize(rec, false); 1219 1220 /* 1221 * In 'perf record --switch-output' without -a, 1222 * record__synthesize() in record__switch_output() won't 1223 * generate tracking events because there's no thread_map 1224 * in evlist. Which causes newly created perf.data doesn't 1225 * contain map and comm information. 1226 * Create a fake thread_map and directly call 1227 * perf_event__synthesize_thread_map() for those events. 1228 */ 1229 if (target__none(&rec->opts.target)) 1230 record__synthesize_workload(rec, false); 1231 } 1232 return fd; 1233 } 1234 1235 static volatile int workload_exec_errno; 1236 1237 /* 1238 * perf_evlist__prepare_workload will send a SIGUSR1 1239 * if the fork fails, since we asked by setting its 1240 * want_signal to true. 1241 */ 1242 static void workload_exec_failed_signal(int signo __maybe_unused, 1243 siginfo_t *info, 1244 void *ucontext __maybe_unused) 1245 { 1246 workload_exec_errno = info->si_value.sival_int; 1247 done = 1; 1248 child_finished = 1; 1249 } 1250 1251 static void snapshot_sig_handler(int sig); 1252 static void alarm_sig_handler(int sig); 1253 1254 static const struct perf_event_mmap_page * 1255 perf_evlist__pick_pc(struct evlist *evlist) 1256 { 1257 if (evlist) { 1258 if (evlist->mmap && evlist->mmap[0].core.base) 1259 return evlist->mmap[0].core.base; 1260 if (evlist->overwrite_mmap && evlist->overwrite_mmap[0].core.base) 1261 return evlist->overwrite_mmap[0].core.base; 1262 } 1263 return NULL; 1264 } 1265 1266 static const struct perf_event_mmap_page *record__pick_pc(struct record *rec) 1267 { 1268 const struct perf_event_mmap_page *pc; 1269 1270 pc = perf_evlist__pick_pc(rec->evlist); 1271 if (pc) 1272 return pc; 1273 return NULL; 1274 } 1275 1276 static int record__synthesize(struct record *rec, bool tail) 1277 { 1278 struct perf_session *session = rec->session; 1279 struct machine *machine = &session->machines.host; 1280 struct perf_data *data = &rec->data; 1281 struct record_opts *opts = &rec->opts; 1282 struct perf_tool *tool = &rec->tool; 1283 int fd = perf_data__fd(data); 1284 int err = 0; 1285 1286 if (rec->opts.tail_synthesize != tail) 1287 return 0; 1288 1289 if (data->is_pipe) { 1290 /* 1291 * We need to synthesize events first, because some 1292 * features works on top of them (on report side). 1293 */ 1294 err = perf_event__synthesize_attrs(tool, rec->evlist, 1295 process_synthesized_event); 1296 if (err < 0) { 1297 pr_err("Couldn't synthesize attrs.\n"); 1298 goto out; 1299 } 1300 1301 err = perf_event__synthesize_features(tool, session, rec->evlist, 1302 process_synthesized_event); 1303 if (err < 0) { 1304 pr_err("Couldn't synthesize features.\n"); 1305 return err; 1306 } 1307 1308 if (have_tracepoints(&rec->evlist->core.entries)) { 1309 /* 1310 * FIXME err <= 0 here actually means that 1311 * there were no tracepoints so its not really 1312 * an error, just that we don't need to 1313 * synthesize anything. We really have to 1314 * return this more properly and also 1315 * propagate errors that now are calling die() 1316 */ 1317 err = perf_event__synthesize_tracing_data(tool, fd, rec->evlist, 1318 process_synthesized_event); 1319 if (err <= 0) { 1320 pr_err("Couldn't record tracing data.\n"); 1321 goto out; 1322 } 1323 rec->bytes_written += err; 1324 } 1325 } 1326 1327 err = perf_event__synth_time_conv(record__pick_pc(rec), tool, 1328 process_synthesized_event, machine); 1329 if (err) 1330 goto out; 1331 1332 /* Synthesize id_index before auxtrace_info */ 1333 if (rec->opts.auxtrace_sample_mode) { 1334 err = perf_event__synthesize_id_index(tool, 1335 process_synthesized_event, 1336 session->evlist, machine); 1337 if (err) 1338 goto out; 1339 } 1340 1341 if (rec->opts.full_auxtrace) { 1342 err = perf_event__synthesize_auxtrace_info(rec->itr, tool, 1343 session, process_synthesized_event); 1344 if (err) 1345 goto out; 1346 } 1347 1348 if (!perf_evlist__exclude_kernel(rec->evlist)) { 1349 err = perf_event__synthesize_kernel_mmap(tool, process_synthesized_event, 1350 machine); 1351 WARN_ONCE(err < 0, "Couldn't record kernel reference relocation symbol\n" 1352 "Symbol resolution may be skewed if relocation was used (e.g. kexec).\n" 1353 "Check /proc/kallsyms permission or run as root.\n"); 1354 1355 err = perf_event__synthesize_modules(tool, process_synthesized_event, 1356 machine); 1357 WARN_ONCE(err < 0, "Couldn't record kernel module information.\n" 1358 "Symbol resolution may be skewed if relocation was used (e.g. kexec).\n" 1359 "Check /proc/modules permission or run as root.\n"); 1360 } 1361 1362 if (perf_guest) { 1363 machines__process_guests(&session->machines, 1364 perf_event__synthesize_guest_os, tool); 1365 } 1366 1367 err = perf_event__synthesize_extra_attr(&rec->tool, 1368 rec->evlist, 1369 process_synthesized_event, 1370 data->is_pipe); 1371 if (err) 1372 goto out; 1373 1374 err = perf_event__synthesize_thread_map2(&rec->tool, rec->evlist->core.threads, 1375 process_synthesized_event, 1376 NULL); 1377 if (err < 0) { 1378 pr_err("Couldn't synthesize thread map.\n"); 1379 return err; 1380 } 1381 1382 err = perf_event__synthesize_cpu_map(&rec->tool, rec->evlist->core.cpus, 1383 process_synthesized_event, NULL); 1384 if (err < 0) { 1385 pr_err("Couldn't synthesize cpu map.\n"); 1386 return err; 1387 } 1388 1389 err = perf_event__synthesize_bpf_events(session, process_synthesized_event, 1390 machine, opts); 1391 if (err < 0) 1392 pr_warning("Couldn't synthesize bpf events.\n"); 1393 1394 err = __machine__synthesize_threads(machine, tool, &opts->target, rec->evlist->core.threads, 1395 process_synthesized_event, opts->sample_address, 1396 1); 1397 out: 1398 return err; 1399 } 1400 1401 static int __cmd_record(struct record *rec, int argc, const char **argv) 1402 { 1403 int err; 1404 int status = 0; 1405 unsigned long waking = 0; 1406 const bool forks = argc > 0; 1407 struct perf_tool *tool = &rec->tool; 1408 struct record_opts *opts = &rec->opts; 1409 struct perf_data *data = &rec->data; 1410 struct perf_session *session; 1411 bool disabled = false, draining = false; 1412 struct evlist *sb_evlist = NULL; 1413 int fd; 1414 float ratio = 0; 1415 1416 atexit(record__sig_exit); 1417 signal(SIGCHLD, sig_handler); 1418 signal(SIGINT, sig_handler); 1419 signal(SIGTERM, sig_handler); 1420 signal(SIGSEGV, sigsegv_handler); 1421 1422 if (rec->opts.record_namespaces) 1423 tool->namespace_events = true; 1424 1425 if (rec->opts.auxtrace_snapshot_mode || rec->switch_output.enabled) { 1426 signal(SIGUSR2, snapshot_sig_handler); 1427 if (rec->opts.auxtrace_snapshot_mode) 1428 trigger_on(&auxtrace_snapshot_trigger); 1429 if (rec->switch_output.enabled) 1430 trigger_on(&switch_output_trigger); 1431 } else { 1432 signal(SIGUSR2, SIG_IGN); 1433 } 1434 1435 session = perf_session__new(data, false, tool); 1436 if (IS_ERR(session)) { 1437 pr_err("Perf session creation failed.\n"); 1438 return PTR_ERR(session); 1439 } 1440 1441 fd = perf_data__fd(data); 1442 rec->session = session; 1443 1444 if (zstd_init(&session->zstd_data, rec->opts.comp_level) < 0) { 1445 pr_err("Compression initialization failed.\n"); 1446 return -1; 1447 } 1448 1449 session->header.env.comp_type = PERF_COMP_ZSTD; 1450 session->header.env.comp_level = rec->opts.comp_level; 1451 1452 if (rec->opts.kcore && 1453 !record__kcore_readable(&session->machines.host)) { 1454 pr_err("ERROR: kcore is not readable.\n"); 1455 return -1; 1456 } 1457 1458 record__init_features(rec); 1459 1460 if (rec->opts.use_clockid && rec->opts.clockid_res_ns) 1461 session->header.env.clockid_res_ns = rec->opts.clockid_res_ns; 1462 1463 if (forks) { 1464 err = perf_evlist__prepare_workload(rec->evlist, &opts->target, 1465 argv, data->is_pipe, 1466 workload_exec_failed_signal); 1467 if (err < 0) { 1468 pr_err("Couldn't run the workload!\n"); 1469 status = err; 1470 goto out_delete_session; 1471 } 1472 } 1473 1474 /* 1475 * If we have just single event and are sending data 1476 * through pipe, we need to force the ids allocation, 1477 * because we synthesize event name through the pipe 1478 * and need the id for that. 1479 */ 1480 if (data->is_pipe && rec->evlist->core.nr_entries == 1) 1481 rec->opts.sample_id = true; 1482 1483 if (record__open(rec) != 0) { 1484 err = -1; 1485 goto out_child; 1486 } 1487 session->header.env.comp_mmap_len = session->evlist->core.mmap_len; 1488 1489 if (rec->opts.kcore) { 1490 err = record__kcore_copy(&session->machines.host, data); 1491 if (err) { 1492 pr_err("ERROR: Failed to copy kcore\n"); 1493 goto out_child; 1494 } 1495 } 1496 1497 err = bpf__apply_obj_config(); 1498 if (err) { 1499 char errbuf[BUFSIZ]; 1500 1501 bpf__strerror_apply_obj_config(err, errbuf, sizeof(errbuf)); 1502 pr_err("ERROR: Apply config to BPF failed: %s\n", 1503 errbuf); 1504 goto out_child; 1505 } 1506 1507 /* 1508 * Normally perf_session__new would do this, but it doesn't have the 1509 * evlist. 1510 */ 1511 if (rec->tool.ordered_events && !perf_evlist__sample_id_all(rec->evlist)) { 1512 pr_warning("WARNING: No sample_id_all support, falling back to unordered processing\n"); 1513 rec->tool.ordered_events = false; 1514 } 1515 1516 if (!rec->evlist->nr_groups) 1517 perf_header__clear_feat(&session->header, HEADER_GROUP_DESC); 1518 1519 if (data->is_pipe) { 1520 err = perf_header__write_pipe(fd); 1521 if (err < 0) 1522 goto out_child; 1523 } else { 1524 err = perf_session__write_header(session, rec->evlist, fd, false); 1525 if (err < 0) 1526 goto out_child; 1527 } 1528 1529 if (!rec->no_buildid 1530 && !perf_header__has_feat(&session->header, HEADER_BUILD_ID)) { 1531 pr_err("Couldn't generate buildids. " 1532 "Use --no-buildid to profile anyway.\n"); 1533 err = -1; 1534 goto out_child; 1535 } 1536 1537 if (!opts->no_bpf_event) 1538 bpf_event__add_sb_event(&sb_evlist, &session->header.env); 1539 1540 if (perf_evlist__start_sb_thread(sb_evlist, &rec->opts.target)) { 1541 pr_debug("Couldn't start the BPF side band thread:\nBPF programs starting from now on won't be annotatable\n"); 1542 opts->no_bpf_event = true; 1543 } 1544 1545 err = record__synthesize(rec, false); 1546 if (err < 0) 1547 goto out_child; 1548 1549 if (rec->realtime_prio) { 1550 struct sched_param param; 1551 1552 param.sched_priority = rec->realtime_prio; 1553 if (sched_setscheduler(0, SCHED_FIFO, ¶m)) { 1554 pr_err("Could not set realtime priority.\n"); 1555 err = -1; 1556 goto out_child; 1557 } 1558 } 1559 1560 /* 1561 * When perf is starting the traced process, all the events 1562 * (apart from group members) have enable_on_exec=1 set, 1563 * so don't spoil it by prematurely enabling them. 1564 */ 1565 if (!target__none(&opts->target) && !opts->initial_delay) 1566 evlist__enable(rec->evlist); 1567 1568 /* 1569 * Let the child rip 1570 */ 1571 if (forks) { 1572 struct machine *machine = &session->machines.host; 1573 union perf_event *event; 1574 pid_t tgid; 1575 1576 event = malloc(sizeof(event->comm) + machine->id_hdr_size); 1577 if (event == NULL) { 1578 err = -ENOMEM; 1579 goto out_child; 1580 } 1581 1582 /* 1583 * Some H/W events are generated before COMM event 1584 * which is emitted during exec(), so perf script 1585 * cannot see a correct process name for those events. 1586 * Synthesize COMM event to prevent it. 1587 */ 1588 tgid = perf_event__synthesize_comm(tool, event, 1589 rec->evlist->workload.pid, 1590 process_synthesized_event, 1591 machine); 1592 free(event); 1593 1594 if (tgid == -1) 1595 goto out_child; 1596 1597 event = malloc(sizeof(event->namespaces) + 1598 (NR_NAMESPACES * sizeof(struct perf_ns_link_info)) + 1599 machine->id_hdr_size); 1600 if (event == NULL) { 1601 err = -ENOMEM; 1602 goto out_child; 1603 } 1604 1605 /* 1606 * Synthesize NAMESPACES event for the command specified. 1607 */ 1608 perf_event__synthesize_namespaces(tool, event, 1609 rec->evlist->workload.pid, 1610 tgid, process_synthesized_event, 1611 machine); 1612 free(event); 1613 1614 perf_evlist__start_workload(rec->evlist); 1615 } 1616 1617 if (opts->initial_delay) { 1618 usleep(opts->initial_delay * USEC_PER_MSEC); 1619 evlist__enable(rec->evlist); 1620 } 1621 1622 trigger_ready(&auxtrace_snapshot_trigger); 1623 trigger_ready(&switch_output_trigger); 1624 perf_hooks__invoke_record_start(); 1625 for (;;) { 1626 unsigned long long hits = rec->samples; 1627 1628 /* 1629 * rec->evlist->bkw_mmap_state is possible to be 1630 * BKW_MMAP_EMPTY here: when done == true and 1631 * hits != rec->samples in previous round. 1632 * 1633 * perf_evlist__toggle_bkw_mmap ensure we never 1634 * convert BKW_MMAP_EMPTY to BKW_MMAP_DATA_PENDING. 1635 */ 1636 if (trigger_is_hit(&switch_output_trigger) || done || draining) 1637 perf_evlist__toggle_bkw_mmap(rec->evlist, BKW_MMAP_DATA_PENDING); 1638 1639 if (record__mmap_read_all(rec, false) < 0) { 1640 trigger_error(&auxtrace_snapshot_trigger); 1641 trigger_error(&switch_output_trigger); 1642 err = -1; 1643 goto out_child; 1644 } 1645 1646 if (auxtrace_record__snapshot_started) { 1647 auxtrace_record__snapshot_started = 0; 1648 if (!trigger_is_error(&auxtrace_snapshot_trigger)) 1649 record__read_auxtrace_snapshot(rec, false); 1650 if (trigger_is_error(&auxtrace_snapshot_trigger)) { 1651 pr_err("AUX area tracing snapshot failed\n"); 1652 err = -1; 1653 goto out_child; 1654 } 1655 } 1656 1657 if (trigger_is_hit(&switch_output_trigger)) { 1658 /* 1659 * If switch_output_trigger is hit, the data in 1660 * overwritable ring buffer should have been collected, 1661 * so bkw_mmap_state should be set to BKW_MMAP_EMPTY. 1662 * 1663 * If SIGUSR2 raise after or during record__mmap_read_all(), 1664 * record__mmap_read_all() didn't collect data from 1665 * overwritable ring buffer. Read again. 1666 */ 1667 if (rec->evlist->bkw_mmap_state == BKW_MMAP_RUNNING) 1668 continue; 1669 trigger_ready(&switch_output_trigger); 1670 1671 /* 1672 * Reenable events in overwrite ring buffer after 1673 * record__mmap_read_all(): we should have collected 1674 * data from it. 1675 */ 1676 perf_evlist__toggle_bkw_mmap(rec->evlist, BKW_MMAP_RUNNING); 1677 1678 if (!quiet) 1679 fprintf(stderr, "[ perf record: dump data: Woken up %ld times ]\n", 1680 waking); 1681 waking = 0; 1682 fd = record__switch_output(rec, false); 1683 if (fd < 0) { 1684 pr_err("Failed to switch to new file\n"); 1685 trigger_error(&switch_output_trigger); 1686 err = fd; 1687 goto out_child; 1688 } 1689 1690 /* re-arm the alarm */ 1691 if (rec->switch_output.time) 1692 alarm(rec->switch_output.time); 1693 } 1694 1695 if (hits == rec->samples) { 1696 if (done || draining) 1697 break; 1698 err = evlist__poll(rec->evlist, -1); 1699 /* 1700 * Propagate error, only if there's any. Ignore positive 1701 * number of returned events and interrupt error. 1702 */ 1703 if (err > 0 || (err < 0 && errno == EINTR)) 1704 err = 0; 1705 waking++; 1706 1707 if (evlist__filter_pollfd(rec->evlist, POLLERR | POLLHUP) == 0) 1708 draining = true; 1709 } 1710 1711 /* 1712 * When perf is starting the traced process, at the end events 1713 * die with the process and we wait for that. Thus no need to 1714 * disable events in this case. 1715 */ 1716 if (done && !disabled && !target__none(&opts->target)) { 1717 trigger_off(&auxtrace_snapshot_trigger); 1718 evlist__disable(rec->evlist); 1719 disabled = true; 1720 } 1721 } 1722 1723 trigger_off(&auxtrace_snapshot_trigger); 1724 trigger_off(&switch_output_trigger); 1725 1726 if (opts->auxtrace_snapshot_on_exit) 1727 record__auxtrace_snapshot_exit(rec); 1728 1729 if (forks && workload_exec_errno) { 1730 char msg[STRERR_BUFSIZE]; 1731 const char *emsg = str_error_r(workload_exec_errno, msg, sizeof(msg)); 1732 pr_err("Workload failed: %s\n", emsg); 1733 err = -1; 1734 goto out_child; 1735 } 1736 1737 if (!quiet) 1738 fprintf(stderr, "[ perf record: Woken up %ld times to write data ]\n", waking); 1739 1740 if (target__none(&rec->opts.target)) 1741 record__synthesize_workload(rec, true); 1742 1743 out_child: 1744 record__mmap_read_all(rec, true); 1745 record__aio_mmap_read_sync(rec); 1746 1747 if (rec->session->bytes_transferred && rec->session->bytes_compressed) { 1748 ratio = (float)rec->session->bytes_transferred/(float)rec->session->bytes_compressed; 1749 session->header.env.comp_ratio = ratio + 0.5; 1750 } 1751 1752 if (forks) { 1753 int exit_status; 1754 1755 if (!child_finished) 1756 kill(rec->evlist->workload.pid, SIGTERM); 1757 1758 wait(&exit_status); 1759 1760 if (err < 0) 1761 status = err; 1762 else if (WIFEXITED(exit_status)) 1763 status = WEXITSTATUS(exit_status); 1764 else if (WIFSIGNALED(exit_status)) 1765 signr = WTERMSIG(exit_status); 1766 } else 1767 status = err; 1768 1769 record__synthesize(rec, true); 1770 /* this will be recalculated during process_buildids() */ 1771 rec->samples = 0; 1772 1773 if (!err) { 1774 if (!rec->timestamp_filename) { 1775 record__finish_output(rec); 1776 } else { 1777 fd = record__switch_output(rec, true); 1778 if (fd < 0) { 1779 status = fd; 1780 goto out_delete_session; 1781 } 1782 } 1783 } 1784 1785 perf_hooks__invoke_record_end(); 1786 1787 if (!err && !quiet) { 1788 char samples[128]; 1789 const char *postfix = rec->timestamp_filename ? 1790 ".<timestamp>" : ""; 1791 1792 if (rec->samples && !rec->opts.full_auxtrace) 1793 scnprintf(samples, sizeof(samples), 1794 " (%" PRIu64 " samples)", rec->samples); 1795 else 1796 samples[0] = '\0'; 1797 1798 fprintf(stderr, "[ perf record: Captured and wrote %.3f MB %s%s%s", 1799 perf_data__size(data) / 1024.0 / 1024.0, 1800 data->path, postfix, samples); 1801 if (ratio) { 1802 fprintf(stderr, ", compressed (original %.3f MB, ratio is %.3f)", 1803 rec->session->bytes_transferred / 1024.0 / 1024.0, 1804 ratio); 1805 } 1806 fprintf(stderr, " ]\n"); 1807 } 1808 1809 out_delete_session: 1810 zstd_fini(&session->zstd_data); 1811 perf_session__delete(session); 1812 1813 if (!opts->no_bpf_event) 1814 perf_evlist__stop_sb_thread(sb_evlist); 1815 return status; 1816 } 1817 1818 static void callchain_debug(struct callchain_param *callchain) 1819 { 1820 static const char *str[CALLCHAIN_MAX] = { "NONE", "FP", "DWARF", "LBR" }; 1821 1822 pr_debug("callchain: type %s\n", str[callchain->record_mode]); 1823 1824 if (callchain->record_mode == CALLCHAIN_DWARF) 1825 pr_debug("callchain: stack dump size %d\n", 1826 callchain->dump_size); 1827 } 1828 1829 int record_opts__parse_callchain(struct record_opts *record, 1830 struct callchain_param *callchain, 1831 const char *arg, bool unset) 1832 { 1833 int ret; 1834 callchain->enabled = !unset; 1835 1836 /* --no-call-graph */ 1837 if (unset) { 1838 callchain->record_mode = CALLCHAIN_NONE; 1839 pr_debug("callchain: disabled\n"); 1840 return 0; 1841 } 1842 1843 ret = parse_callchain_record_opt(arg, callchain); 1844 if (!ret) { 1845 /* Enable data address sampling for DWARF unwind. */ 1846 if (callchain->record_mode == CALLCHAIN_DWARF) 1847 record->sample_address = true; 1848 callchain_debug(callchain); 1849 } 1850 1851 return ret; 1852 } 1853 1854 int record_parse_callchain_opt(const struct option *opt, 1855 const char *arg, 1856 int unset) 1857 { 1858 return record_opts__parse_callchain(opt->value, &callchain_param, arg, unset); 1859 } 1860 1861 int record_callchain_opt(const struct option *opt, 1862 const char *arg __maybe_unused, 1863 int unset __maybe_unused) 1864 { 1865 struct callchain_param *callchain = opt->value; 1866 1867 callchain->enabled = true; 1868 1869 if (callchain->record_mode == CALLCHAIN_NONE) 1870 callchain->record_mode = CALLCHAIN_FP; 1871 1872 callchain_debug(callchain); 1873 return 0; 1874 } 1875 1876 static int perf_record_config(const char *var, const char *value, void *cb) 1877 { 1878 struct record *rec = cb; 1879 1880 if (!strcmp(var, "record.build-id")) { 1881 if (!strcmp(value, "cache")) 1882 rec->no_buildid_cache = false; 1883 else if (!strcmp(value, "no-cache")) 1884 rec->no_buildid_cache = true; 1885 else if (!strcmp(value, "skip")) 1886 rec->no_buildid = true; 1887 else 1888 return -1; 1889 return 0; 1890 } 1891 if (!strcmp(var, "record.call-graph")) { 1892 var = "call-graph.record-mode"; 1893 return perf_default_config(var, value, cb); 1894 } 1895 #ifdef HAVE_AIO_SUPPORT 1896 if (!strcmp(var, "record.aio")) { 1897 rec->opts.nr_cblocks = strtol(value, NULL, 0); 1898 if (!rec->opts.nr_cblocks) 1899 rec->opts.nr_cblocks = nr_cblocks_default; 1900 } 1901 #endif 1902 1903 return 0; 1904 } 1905 1906 struct clockid_map { 1907 const char *name; 1908 int clockid; 1909 }; 1910 1911 #define CLOCKID_MAP(n, c) \ 1912 { .name = n, .clockid = (c), } 1913 1914 #define CLOCKID_END { .name = NULL, } 1915 1916 1917 /* 1918 * Add the missing ones, we need to build on many distros... 1919 */ 1920 #ifndef CLOCK_MONOTONIC_RAW 1921 #define CLOCK_MONOTONIC_RAW 4 1922 #endif 1923 #ifndef CLOCK_BOOTTIME 1924 #define CLOCK_BOOTTIME 7 1925 #endif 1926 #ifndef CLOCK_TAI 1927 #define CLOCK_TAI 11 1928 #endif 1929 1930 static const struct clockid_map clockids[] = { 1931 /* available for all events, NMI safe */ 1932 CLOCKID_MAP("monotonic", CLOCK_MONOTONIC), 1933 CLOCKID_MAP("monotonic_raw", CLOCK_MONOTONIC_RAW), 1934 1935 /* available for some events */ 1936 CLOCKID_MAP("realtime", CLOCK_REALTIME), 1937 CLOCKID_MAP("boottime", CLOCK_BOOTTIME), 1938 CLOCKID_MAP("tai", CLOCK_TAI), 1939 1940 /* available for the lazy */ 1941 CLOCKID_MAP("mono", CLOCK_MONOTONIC), 1942 CLOCKID_MAP("raw", CLOCK_MONOTONIC_RAW), 1943 CLOCKID_MAP("real", CLOCK_REALTIME), 1944 CLOCKID_MAP("boot", CLOCK_BOOTTIME), 1945 1946 CLOCKID_END, 1947 }; 1948 1949 static int get_clockid_res(clockid_t clk_id, u64 *res_ns) 1950 { 1951 struct timespec res; 1952 1953 *res_ns = 0; 1954 if (!clock_getres(clk_id, &res)) 1955 *res_ns = res.tv_nsec + res.tv_sec * NSEC_PER_SEC; 1956 else 1957 pr_warning("WARNING: Failed to determine specified clock resolution.\n"); 1958 1959 return 0; 1960 } 1961 1962 static int parse_clockid(const struct option *opt, const char *str, int unset) 1963 { 1964 struct record_opts *opts = (struct record_opts *)opt->value; 1965 const struct clockid_map *cm; 1966 const char *ostr = str; 1967 1968 if (unset) { 1969 opts->use_clockid = 0; 1970 return 0; 1971 } 1972 1973 /* no arg passed */ 1974 if (!str) 1975 return 0; 1976 1977 /* no setting it twice */ 1978 if (opts->use_clockid) 1979 return -1; 1980 1981 opts->use_clockid = true; 1982 1983 /* if its a number, we're done */ 1984 if (sscanf(str, "%d", &opts->clockid) == 1) 1985 return get_clockid_res(opts->clockid, &opts->clockid_res_ns); 1986 1987 /* allow a "CLOCK_" prefix to the name */ 1988 if (!strncasecmp(str, "CLOCK_", 6)) 1989 str += 6; 1990 1991 for (cm = clockids; cm->name; cm++) { 1992 if (!strcasecmp(str, cm->name)) { 1993 opts->clockid = cm->clockid; 1994 return get_clockid_res(opts->clockid, 1995 &opts->clockid_res_ns); 1996 } 1997 } 1998 1999 opts->use_clockid = false; 2000 ui__warning("unknown clockid %s, check man page\n", ostr); 2001 return -1; 2002 } 2003 2004 static int record__parse_affinity(const struct option *opt, const char *str, int unset) 2005 { 2006 struct record_opts *opts = (struct record_opts *)opt->value; 2007 2008 if (unset || !str) 2009 return 0; 2010 2011 if (!strcasecmp(str, "node")) 2012 opts->affinity = PERF_AFFINITY_NODE; 2013 else if (!strcasecmp(str, "cpu")) 2014 opts->affinity = PERF_AFFINITY_CPU; 2015 2016 return 0; 2017 } 2018 2019 static int parse_output_max_size(const struct option *opt, 2020 const char *str, int unset) 2021 { 2022 unsigned long *s = (unsigned long *)opt->value; 2023 static struct parse_tag tags_size[] = { 2024 { .tag = 'B', .mult = 1 }, 2025 { .tag = 'K', .mult = 1 << 10 }, 2026 { .tag = 'M', .mult = 1 << 20 }, 2027 { .tag = 'G', .mult = 1 << 30 }, 2028 { .tag = 0 }, 2029 }; 2030 unsigned long val; 2031 2032 if (unset) { 2033 *s = 0; 2034 return 0; 2035 } 2036 2037 val = parse_tag_value(str, tags_size); 2038 if (val != (unsigned long) -1) { 2039 *s = val; 2040 return 0; 2041 } 2042 2043 return -1; 2044 } 2045 2046 static int record__parse_mmap_pages(const struct option *opt, 2047 const char *str, 2048 int unset __maybe_unused) 2049 { 2050 struct record_opts *opts = opt->value; 2051 char *s, *p; 2052 unsigned int mmap_pages; 2053 int ret; 2054 2055 if (!str) 2056 return -EINVAL; 2057 2058 s = strdup(str); 2059 if (!s) 2060 return -ENOMEM; 2061 2062 p = strchr(s, ','); 2063 if (p) 2064 *p = '\0'; 2065 2066 if (*s) { 2067 ret = __perf_evlist__parse_mmap_pages(&mmap_pages, s); 2068 if (ret) 2069 goto out_free; 2070 opts->mmap_pages = mmap_pages; 2071 } 2072 2073 if (!p) { 2074 ret = 0; 2075 goto out_free; 2076 } 2077 2078 ret = __perf_evlist__parse_mmap_pages(&mmap_pages, p + 1); 2079 if (ret) 2080 goto out_free; 2081 2082 opts->auxtrace_mmap_pages = mmap_pages; 2083 2084 out_free: 2085 free(s); 2086 return ret; 2087 } 2088 2089 static void switch_output_size_warn(struct record *rec) 2090 { 2091 u64 wakeup_size = evlist__mmap_size(rec->opts.mmap_pages); 2092 struct switch_output *s = &rec->switch_output; 2093 2094 wakeup_size /= 2; 2095 2096 if (s->size < wakeup_size) { 2097 char buf[100]; 2098 2099 unit_number__scnprintf(buf, sizeof(buf), wakeup_size); 2100 pr_warning("WARNING: switch-output data size lower than " 2101 "wakeup kernel buffer size (%s) " 2102 "expect bigger perf.data sizes\n", buf); 2103 } 2104 } 2105 2106 static int switch_output_setup(struct record *rec) 2107 { 2108 struct switch_output *s = &rec->switch_output; 2109 static struct parse_tag tags_size[] = { 2110 { .tag = 'B', .mult = 1 }, 2111 { .tag = 'K', .mult = 1 << 10 }, 2112 { .tag = 'M', .mult = 1 << 20 }, 2113 { .tag = 'G', .mult = 1 << 30 }, 2114 { .tag = 0 }, 2115 }; 2116 static struct parse_tag tags_time[] = { 2117 { .tag = 's', .mult = 1 }, 2118 { .tag = 'm', .mult = 60 }, 2119 { .tag = 'h', .mult = 60*60 }, 2120 { .tag = 'd', .mult = 60*60*24 }, 2121 { .tag = 0 }, 2122 }; 2123 unsigned long val; 2124 2125 if (!s->set) 2126 return 0; 2127 2128 if (!strcmp(s->str, "signal")) { 2129 s->signal = true; 2130 pr_debug("switch-output with SIGUSR2 signal\n"); 2131 goto enabled; 2132 } 2133 2134 val = parse_tag_value(s->str, tags_size); 2135 if (val != (unsigned long) -1) { 2136 s->size = val; 2137 pr_debug("switch-output with %s size threshold\n", s->str); 2138 goto enabled; 2139 } 2140 2141 val = parse_tag_value(s->str, tags_time); 2142 if (val != (unsigned long) -1) { 2143 s->time = val; 2144 pr_debug("switch-output with %s time threshold (%lu seconds)\n", 2145 s->str, s->time); 2146 goto enabled; 2147 } 2148 2149 return -1; 2150 2151 enabled: 2152 rec->timestamp_filename = true; 2153 s->enabled = true; 2154 2155 if (s->size && !rec->opts.no_buffering) 2156 switch_output_size_warn(rec); 2157 2158 return 0; 2159 } 2160 2161 static const char * const __record_usage[] = { 2162 "perf record [<options>] [<command>]", 2163 "perf record [<options>] -- <command> [<options>]", 2164 NULL 2165 }; 2166 const char * const *record_usage = __record_usage; 2167 2168 static int build_id__process_mmap(struct perf_tool *tool, union perf_event *event, 2169 struct perf_sample *sample, struct machine *machine) 2170 { 2171 /* 2172 * We already have the kernel maps, put in place via perf_session__create_kernel_maps() 2173 * no need to add them twice. 2174 */ 2175 if (!(event->header.misc & PERF_RECORD_MISC_USER)) 2176 return 0; 2177 return perf_event__process_mmap(tool, event, sample, machine); 2178 } 2179 2180 static int build_id__process_mmap2(struct perf_tool *tool, union perf_event *event, 2181 struct perf_sample *sample, struct machine *machine) 2182 { 2183 /* 2184 * We already have the kernel maps, put in place via perf_session__create_kernel_maps() 2185 * no need to add them twice. 2186 */ 2187 if (!(event->header.misc & PERF_RECORD_MISC_USER)) 2188 return 0; 2189 2190 return perf_event__process_mmap2(tool, event, sample, machine); 2191 } 2192 2193 /* 2194 * XXX Ideally would be local to cmd_record() and passed to a record__new 2195 * because we need to have access to it in record__exit, that is called 2196 * after cmd_record() exits, but since record_options need to be accessible to 2197 * builtin-script, leave it here. 2198 * 2199 * At least we don't ouch it in all the other functions here directly. 2200 * 2201 * Just say no to tons of global variables, sigh. 2202 */ 2203 static struct record record = { 2204 .opts = { 2205 .sample_time = true, 2206 .mmap_pages = UINT_MAX, 2207 .user_freq = UINT_MAX, 2208 .user_interval = ULLONG_MAX, 2209 .freq = 4000, 2210 .target = { 2211 .uses_mmap = true, 2212 .default_per_cpu = true, 2213 }, 2214 .mmap_flush = MMAP_FLUSH_DEFAULT, 2215 }, 2216 .tool = { 2217 .sample = process_sample_event, 2218 .fork = perf_event__process_fork, 2219 .exit = perf_event__process_exit, 2220 .comm = perf_event__process_comm, 2221 .namespaces = perf_event__process_namespaces, 2222 .mmap = build_id__process_mmap, 2223 .mmap2 = build_id__process_mmap2, 2224 .ordered_events = true, 2225 }, 2226 }; 2227 2228 const char record_callchain_help[] = CALLCHAIN_RECORD_HELP 2229 "\n\t\t\t\tDefault: fp"; 2230 2231 static bool dry_run; 2232 2233 /* 2234 * XXX Will stay a global variable till we fix builtin-script.c to stop messing 2235 * with it and switch to use the library functions in perf_evlist that came 2236 * from builtin-record.c, i.e. use record_opts, 2237 * perf_evlist__prepare_workload, etc instead of fork+exec'in 'perf record', 2238 * using pipes, etc. 2239 */ 2240 static struct option __record_options[] = { 2241 OPT_CALLBACK('e', "event", &record.evlist, "event", 2242 "event selector. use 'perf list' to list available events", 2243 parse_events_option), 2244 OPT_CALLBACK(0, "filter", &record.evlist, "filter", 2245 "event filter", parse_filter), 2246 OPT_CALLBACK_NOOPT(0, "exclude-perf", &record.evlist, 2247 NULL, "don't record events from perf itself", 2248 exclude_perf), 2249 OPT_STRING('p', "pid", &record.opts.target.pid, "pid", 2250 "record events on existing process id"), 2251 OPT_STRING('t', "tid", &record.opts.target.tid, "tid", 2252 "record events on existing thread id"), 2253 OPT_INTEGER('r', "realtime", &record.realtime_prio, 2254 "collect data with this RT SCHED_FIFO priority"), 2255 OPT_BOOLEAN(0, "no-buffering", &record.opts.no_buffering, 2256 "collect data without buffering"), 2257 OPT_BOOLEAN('R', "raw-samples", &record.opts.raw_samples, 2258 "collect raw sample records from all opened counters"), 2259 OPT_BOOLEAN('a', "all-cpus", &record.opts.target.system_wide, 2260 "system-wide collection from all CPUs"), 2261 OPT_STRING('C', "cpu", &record.opts.target.cpu_list, "cpu", 2262 "list of cpus to monitor"), 2263 OPT_U64('c', "count", &record.opts.user_interval, "event period to sample"), 2264 OPT_STRING('o', "output", &record.data.path, "file", 2265 "output file name"), 2266 OPT_BOOLEAN_SET('i', "no-inherit", &record.opts.no_inherit, 2267 &record.opts.no_inherit_set, 2268 "child tasks do not inherit counters"), 2269 OPT_BOOLEAN(0, "tail-synthesize", &record.opts.tail_synthesize, 2270 "synthesize non-sample events at the end of output"), 2271 OPT_BOOLEAN(0, "overwrite", &record.opts.overwrite, "use overwrite mode"), 2272 OPT_BOOLEAN(0, "no-bpf-event", &record.opts.no_bpf_event, "record bpf events"), 2273 OPT_BOOLEAN(0, "strict-freq", &record.opts.strict_freq, 2274 "Fail if the specified frequency can't be used"), 2275 OPT_CALLBACK('F', "freq", &record.opts, "freq or 'max'", 2276 "profile at this frequency", 2277 record__parse_freq), 2278 OPT_CALLBACK('m', "mmap-pages", &record.opts, "pages[,pages]", 2279 "number of mmap data pages and AUX area tracing mmap pages", 2280 record__parse_mmap_pages), 2281 OPT_CALLBACK(0, "mmap-flush", &record.opts, "number", 2282 "Minimal number of bytes that is extracted from mmap data pages (default: 1)", 2283 record__mmap_flush_parse), 2284 OPT_BOOLEAN(0, "group", &record.opts.group, 2285 "put the counters into a counter group"), 2286 OPT_CALLBACK_NOOPT('g', NULL, &callchain_param, 2287 NULL, "enables call-graph recording" , 2288 &record_callchain_opt), 2289 OPT_CALLBACK(0, "call-graph", &record.opts, 2290 "record_mode[,record_size]", record_callchain_help, 2291 &record_parse_callchain_opt), 2292 OPT_INCR('v', "verbose", &verbose, 2293 "be more verbose (show counter open errors, etc)"), 2294 OPT_BOOLEAN('q', "quiet", &quiet, "don't print any message"), 2295 OPT_BOOLEAN('s', "stat", &record.opts.inherit_stat, 2296 "per thread counts"), 2297 OPT_BOOLEAN('d', "data", &record.opts.sample_address, "Record the sample addresses"), 2298 OPT_BOOLEAN(0, "phys-data", &record.opts.sample_phys_addr, 2299 "Record the sample physical addresses"), 2300 OPT_BOOLEAN(0, "sample-cpu", &record.opts.sample_cpu, "Record the sample cpu"), 2301 OPT_BOOLEAN_SET('T', "timestamp", &record.opts.sample_time, 2302 &record.opts.sample_time_set, 2303 "Record the sample timestamps"), 2304 OPT_BOOLEAN_SET('P', "period", &record.opts.period, &record.opts.period_set, 2305 "Record the sample period"), 2306 OPT_BOOLEAN('n', "no-samples", &record.opts.no_samples, 2307 "don't sample"), 2308 OPT_BOOLEAN_SET('N', "no-buildid-cache", &record.no_buildid_cache, 2309 &record.no_buildid_cache_set, 2310 "do not update the buildid cache"), 2311 OPT_BOOLEAN_SET('B', "no-buildid", &record.no_buildid, 2312 &record.no_buildid_set, 2313 "do not collect buildids in perf.data"), 2314 OPT_CALLBACK('G', "cgroup", &record.evlist, "name", 2315 "monitor event in cgroup name only", 2316 parse_cgroups), 2317 OPT_UINTEGER('D', "delay", &record.opts.initial_delay, 2318 "ms to wait before starting measurement after program start"), 2319 OPT_BOOLEAN(0, "kcore", &record.opts.kcore, "copy /proc/kcore"), 2320 OPT_STRING('u', "uid", &record.opts.target.uid_str, "user", 2321 "user to profile"), 2322 2323 OPT_CALLBACK_NOOPT('b', "branch-any", &record.opts.branch_stack, 2324 "branch any", "sample any taken branches", 2325 parse_branch_stack), 2326 2327 OPT_CALLBACK('j', "branch-filter", &record.opts.branch_stack, 2328 "branch filter mask", "branch stack filter modes", 2329 parse_branch_stack), 2330 OPT_BOOLEAN('W', "weight", &record.opts.sample_weight, 2331 "sample by weight (on special events only)"), 2332 OPT_BOOLEAN(0, "transaction", &record.opts.sample_transaction, 2333 "sample transaction flags (special events only)"), 2334 OPT_BOOLEAN(0, "per-thread", &record.opts.target.per_thread, 2335 "use per-thread mmaps"), 2336 OPT_CALLBACK_OPTARG('I', "intr-regs", &record.opts.sample_intr_regs, NULL, "any register", 2337 "sample selected machine registers on interrupt," 2338 " use '-I?' to list register names", parse_intr_regs), 2339 OPT_CALLBACK_OPTARG(0, "user-regs", &record.opts.sample_user_regs, NULL, "any register", 2340 "sample selected machine registers on interrupt," 2341 " use '--user-regs=?' to list register names", parse_user_regs), 2342 OPT_BOOLEAN(0, "running-time", &record.opts.running_time, 2343 "Record running/enabled time of read (:S) events"), 2344 OPT_CALLBACK('k', "clockid", &record.opts, 2345 "clockid", "clockid to use for events, see clock_gettime()", 2346 parse_clockid), 2347 OPT_STRING_OPTARG('S', "snapshot", &record.opts.auxtrace_snapshot_opts, 2348 "opts", "AUX area tracing Snapshot Mode", ""), 2349 OPT_STRING_OPTARG(0, "aux-sample", &record.opts.auxtrace_sample_opts, 2350 "opts", "sample AUX area", ""), 2351 OPT_UINTEGER(0, "proc-map-timeout", &proc_map_timeout, 2352 "per thread proc mmap processing timeout in ms"), 2353 OPT_BOOLEAN(0, "namespaces", &record.opts.record_namespaces, 2354 "Record namespaces events"), 2355 OPT_BOOLEAN(0, "switch-events", &record.opts.record_switch_events, 2356 "Record context switch events"), 2357 OPT_BOOLEAN_FLAG(0, "all-kernel", &record.opts.all_kernel, 2358 "Configure all used events to run in kernel space.", 2359 PARSE_OPT_EXCLUSIVE), 2360 OPT_BOOLEAN_FLAG(0, "all-user", &record.opts.all_user, 2361 "Configure all used events to run in user space.", 2362 PARSE_OPT_EXCLUSIVE), 2363 OPT_BOOLEAN(0, "kernel-callchains", &record.opts.kernel_callchains, 2364 "collect kernel callchains"), 2365 OPT_BOOLEAN(0, "user-callchains", &record.opts.user_callchains, 2366 "collect user callchains"), 2367 OPT_STRING(0, "clang-path", &llvm_param.clang_path, "clang path", 2368 "clang binary to use for compiling BPF scriptlets"), 2369 OPT_STRING(0, "clang-opt", &llvm_param.clang_opt, "clang options", 2370 "options passed to clang when compiling BPF scriptlets"), 2371 OPT_STRING(0, "vmlinux", &symbol_conf.vmlinux_name, 2372 "file", "vmlinux pathname"), 2373 OPT_BOOLEAN(0, "buildid-all", &record.buildid_all, 2374 "Record build-id of all DSOs regardless of hits"), 2375 OPT_BOOLEAN(0, "timestamp-filename", &record.timestamp_filename, 2376 "append timestamp to output filename"), 2377 OPT_BOOLEAN(0, "timestamp-boundary", &record.timestamp_boundary, 2378 "Record timestamp boundary (time of first/last samples)"), 2379 OPT_STRING_OPTARG_SET(0, "switch-output", &record.switch_output.str, 2380 &record.switch_output.set, "signal or size[BKMG] or time[smhd]", 2381 "Switch output when receiving SIGUSR2 (signal) or cross a size or time threshold", 2382 "signal"), 2383 OPT_INTEGER(0, "switch-max-files", &record.switch_output.num_files, 2384 "Limit number of switch output generated files"), 2385 OPT_BOOLEAN(0, "dry-run", &dry_run, 2386 "Parse options then exit"), 2387 #ifdef HAVE_AIO_SUPPORT 2388 OPT_CALLBACK_OPTARG(0, "aio", &record.opts, 2389 &nr_cblocks_default, "n", "Use <n> control blocks in asynchronous trace writing mode (default: 1, max: 4)", 2390 record__aio_parse), 2391 #endif 2392 OPT_CALLBACK(0, "affinity", &record.opts, "node|cpu", 2393 "Set affinity mask of trace reading thread to NUMA node cpu mask or cpu of processed mmap buffer", 2394 record__parse_affinity), 2395 #ifdef HAVE_ZSTD_SUPPORT 2396 OPT_CALLBACK_OPTARG('z', "compression-level", &record.opts, &comp_level_default, 2397 "n", "Compressed records using specified level (default: 1 - fastest compression, 22 - greatest compression)", 2398 record__parse_comp_level), 2399 #endif 2400 OPT_CALLBACK(0, "max-size", &record.output_max_size, 2401 "size", "Limit the maximum size of the output file", parse_output_max_size), 2402 OPT_END() 2403 }; 2404 2405 struct option *record_options = __record_options; 2406 2407 int cmd_record(int argc, const char **argv) 2408 { 2409 int err; 2410 struct record *rec = &record; 2411 char errbuf[BUFSIZ]; 2412 2413 setlocale(LC_ALL, ""); 2414 2415 #ifndef HAVE_LIBBPF_SUPPORT 2416 # define set_nobuild(s, l, c) set_option_nobuild(record_options, s, l, "NO_LIBBPF=1", c) 2417 set_nobuild('\0', "clang-path", true); 2418 set_nobuild('\0', "clang-opt", true); 2419 # undef set_nobuild 2420 #endif 2421 2422 #ifndef HAVE_BPF_PROLOGUE 2423 # if !defined (HAVE_DWARF_SUPPORT) 2424 # define REASON "NO_DWARF=1" 2425 # elif !defined (HAVE_LIBBPF_SUPPORT) 2426 # define REASON "NO_LIBBPF=1" 2427 # else 2428 # define REASON "this architecture doesn't support BPF prologue" 2429 # endif 2430 # define set_nobuild(s, l, c) set_option_nobuild(record_options, s, l, REASON, c) 2431 set_nobuild('\0', "vmlinux", true); 2432 # undef set_nobuild 2433 # undef REASON 2434 #endif 2435 2436 CPU_ZERO(&rec->affinity_mask); 2437 rec->opts.affinity = PERF_AFFINITY_SYS; 2438 2439 rec->evlist = evlist__new(); 2440 if (rec->evlist == NULL) 2441 return -ENOMEM; 2442 2443 err = perf_config(perf_record_config, rec); 2444 if (err) 2445 return err; 2446 2447 argc = parse_options(argc, argv, record_options, record_usage, 2448 PARSE_OPT_STOP_AT_NON_OPTION); 2449 if (quiet) 2450 perf_quiet_option(); 2451 2452 /* Make system wide (-a) the default target. */ 2453 if (!argc && target__none(&rec->opts.target)) 2454 rec->opts.target.system_wide = true; 2455 2456 if (nr_cgroups && !rec->opts.target.system_wide) { 2457 usage_with_options_msg(record_usage, record_options, 2458 "cgroup monitoring only available in system-wide mode"); 2459 2460 } 2461 2462 if (rec->opts.kcore) 2463 rec->data.is_dir = true; 2464 2465 if (rec->opts.comp_level != 0) { 2466 pr_debug("Compression enabled, disabling build id collection at the end of the session.\n"); 2467 rec->no_buildid = true; 2468 } 2469 2470 if (rec->opts.record_switch_events && 2471 !perf_can_record_switch_events()) { 2472 ui__error("kernel does not support recording context switch events\n"); 2473 parse_options_usage(record_usage, record_options, "switch-events", 0); 2474 return -EINVAL; 2475 } 2476 2477 if (switch_output_setup(rec)) { 2478 parse_options_usage(record_usage, record_options, "switch-output", 0); 2479 return -EINVAL; 2480 } 2481 2482 if (rec->switch_output.time) { 2483 signal(SIGALRM, alarm_sig_handler); 2484 alarm(rec->switch_output.time); 2485 } 2486 2487 if (rec->switch_output.num_files) { 2488 rec->switch_output.filenames = calloc(sizeof(char *), 2489 rec->switch_output.num_files); 2490 if (!rec->switch_output.filenames) 2491 return -EINVAL; 2492 } 2493 2494 /* 2495 * Allow aliases to facilitate the lookup of symbols for address 2496 * filters. Refer to auxtrace_parse_filters(). 2497 */ 2498 symbol_conf.allow_aliases = true; 2499 2500 symbol__init(NULL); 2501 2502 err = record__auxtrace_init(rec); 2503 if (err) 2504 goto out; 2505 2506 if (dry_run) 2507 goto out; 2508 2509 err = bpf__setup_stdout(rec->evlist); 2510 if (err) { 2511 bpf__strerror_setup_stdout(rec->evlist, err, errbuf, sizeof(errbuf)); 2512 pr_err("ERROR: Setup BPF stdout failed: %s\n", 2513 errbuf); 2514 goto out; 2515 } 2516 2517 err = -ENOMEM; 2518 2519 if (rec->no_buildid_cache || rec->no_buildid) { 2520 disable_buildid_cache(); 2521 } else if (rec->switch_output.enabled) { 2522 /* 2523 * In 'perf record --switch-output', disable buildid 2524 * generation by default to reduce data file switching 2525 * overhead. Still generate buildid if they are required 2526 * explicitly using 2527 * 2528 * perf record --switch-output --no-no-buildid \ 2529 * --no-no-buildid-cache 2530 * 2531 * Following code equals to: 2532 * 2533 * if ((rec->no_buildid || !rec->no_buildid_set) && 2534 * (rec->no_buildid_cache || !rec->no_buildid_cache_set)) 2535 * disable_buildid_cache(); 2536 */ 2537 bool disable = true; 2538 2539 if (rec->no_buildid_set && !rec->no_buildid) 2540 disable = false; 2541 if (rec->no_buildid_cache_set && !rec->no_buildid_cache) 2542 disable = false; 2543 if (disable) { 2544 rec->no_buildid = true; 2545 rec->no_buildid_cache = true; 2546 disable_buildid_cache(); 2547 } 2548 } 2549 2550 if (record.opts.overwrite) 2551 record.opts.tail_synthesize = true; 2552 2553 if (rec->evlist->core.nr_entries == 0 && 2554 __perf_evlist__add_default(rec->evlist, !record.opts.no_samples) < 0) { 2555 pr_err("Not enough memory for event selector list\n"); 2556 goto out; 2557 } 2558 2559 if (rec->opts.target.tid && !rec->opts.no_inherit_set) 2560 rec->opts.no_inherit = true; 2561 2562 err = target__validate(&rec->opts.target); 2563 if (err) { 2564 target__strerror(&rec->opts.target, err, errbuf, BUFSIZ); 2565 ui__warning("%s\n", errbuf); 2566 } 2567 2568 err = target__parse_uid(&rec->opts.target); 2569 if (err) { 2570 int saved_errno = errno; 2571 2572 target__strerror(&rec->opts.target, err, errbuf, BUFSIZ); 2573 ui__error("%s", errbuf); 2574 2575 err = -saved_errno; 2576 goto out; 2577 } 2578 2579 /* Enable ignoring missing threads when -u/-p option is defined. */ 2580 rec->opts.ignore_missing_thread = rec->opts.target.uid != UINT_MAX || rec->opts.target.pid; 2581 2582 err = -ENOMEM; 2583 if (perf_evlist__create_maps(rec->evlist, &rec->opts.target) < 0) 2584 usage_with_options(record_usage, record_options); 2585 2586 err = auxtrace_record__options(rec->itr, rec->evlist, &rec->opts); 2587 if (err) 2588 goto out; 2589 2590 /* 2591 * We take all buildids when the file contains 2592 * AUX area tracing data because we do not decode the 2593 * trace because it would take too long. 2594 */ 2595 if (rec->opts.full_auxtrace) 2596 rec->buildid_all = true; 2597 2598 if (record_opts__config(&rec->opts)) { 2599 err = -EINVAL; 2600 goto out; 2601 } 2602 2603 if (rec->opts.nr_cblocks > nr_cblocks_max) 2604 rec->opts.nr_cblocks = nr_cblocks_max; 2605 pr_debug("nr_cblocks: %d\n", rec->opts.nr_cblocks); 2606 2607 pr_debug("affinity: %s\n", affinity_tags[rec->opts.affinity]); 2608 pr_debug("mmap flush: %d\n", rec->opts.mmap_flush); 2609 2610 if (rec->opts.comp_level > comp_level_max) 2611 rec->opts.comp_level = comp_level_max; 2612 pr_debug("comp level: %d\n", rec->opts.comp_level); 2613 2614 err = __cmd_record(&record, argc, argv); 2615 out: 2616 evlist__delete(rec->evlist); 2617 symbol__exit(); 2618 auxtrace_record__free(rec->itr); 2619 return err; 2620 } 2621 2622 static void snapshot_sig_handler(int sig __maybe_unused) 2623 { 2624 struct record *rec = &record; 2625 2626 if (trigger_is_ready(&auxtrace_snapshot_trigger)) { 2627 trigger_hit(&auxtrace_snapshot_trigger); 2628 auxtrace_record__snapshot_started = 1; 2629 if (auxtrace_record__snapshot_start(record.itr)) 2630 trigger_error(&auxtrace_snapshot_trigger); 2631 } 2632 2633 if (switch_output_signal(rec)) 2634 trigger_hit(&switch_output_trigger); 2635 } 2636 2637 static void alarm_sig_handler(int sig __maybe_unused) 2638 { 2639 struct record *rec = &record; 2640 2641 if (switch_output_time(rec)) 2642 trigger_hit(&switch_output_trigger); 2643 } 2644