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