Merge tag 'kgdb-4.21-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/danielt...
[linux-2.6-microblaze.git] / tools / perf / builtin-record.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * builtin-record.c
4  *
5  * Builtin record command: Record the profile of a workload
6  * (or a CPU, or a PID) into the perf.data output file - for
7  * later analysis via perf report.
8  */
9 #include "builtin.h"
10
11 #include "perf.h"
12
13 #include "util/build-id.h"
14 #include "util/util.h"
15 #include <subcmd/parse-options.h>
16 #include "util/parse-events.h"
17 #include "util/config.h"
18
19 #include "util/callchain.h"
20 #include "util/cgroup.h"
21 #include "util/header.h"
22 #include "util/event.h"
23 #include "util/evlist.h"
24 #include "util/evsel.h"
25 #include "util/debug.h"
26 #include "util/drv_configs.h"
27 #include "util/session.h"
28 #include "util/tool.h"
29 #include "util/symbol.h"
30 #include "util/cpumap.h"
31 #include "util/thread_map.h"
32 #include "util/data.h"
33 #include "util/perf_regs.h"
34 #include "util/auxtrace.h"
35 #include "util/tsc.h"
36 #include "util/parse-branch-options.h"
37 #include "util/parse-regs-options.h"
38 #include "util/llvm-utils.h"
39 #include "util/bpf-loader.h"
40 #include "util/trigger.h"
41 #include "util/perf-hooks.h"
42 #include "util/time-utils.h"
43 #include "util/units.h"
44 #include "asm/bug.h"
45
46 #include <errno.h>
47 #include <inttypes.h>
48 #include <locale.h>
49 #include <poll.h>
50 #include <unistd.h>
51 #include <sched.h>
52 #include <signal.h>
53 #include <sys/mman.h>
54 #include <sys/wait.h>
55 #include <linux/time64.h>
56
57 struct switch_output {
58         bool             enabled;
59         bool             signal;
60         unsigned long    size;
61         unsigned long    time;
62         const char      *str;
63         bool             set;
64 };
65
66 struct record {
67         struct perf_tool        tool;
68         struct record_opts      opts;
69         u64                     bytes_written;
70         struct perf_data        data;
71         struct auxtrace_record  *itr;
72         struct perf_evlist      *evlist;
73         struct perf_session     *session;
74         int                     realtime_prio;
75         bool                    no_buildid;
76         bool                    no_buildid_set;
77         bool                    no_buildid_cache;
78         bool                    no_buildid_cache_set;
79         bool                    buildid_all;
80         bool                    timestamp_filename;
81         bool                    timestamp_boundary;
82         struct switch_output    switch_output;
83         unsigned long long      samples;
84 };
85
86 static volatile int auxtrace_record__snapshot_started;
87 static DEFINE_TRIGGER(auxtrace_snapshot_trigger);
88 static DEFINE_TRIGGER(switch_output_trigger);
89
90 static bool switch_output_signal(struct record *rec)
91 {
92         return rec->switch_output.signal &&
93                trigger_is_ready(&switch_output_trigger);
94 }
95
96 static bool switch_output_size(struct record *rec)
97 {
98         return rec->switch_output.size &&
99                trigger_is_ready(&switch_output_trigger) &&
100                (rec->bytes_written >= rec->switch_output.size);
101 }
102
103 static bool switch_output_time(struct record *rec)
104 {
105         return rec->switch_output.time &&
106                trigger_is_ready(&switch_output_trigger);
107 }
108
109 static int record__write(struct record *rec, 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
128 static 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
153 static 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
199 static 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
234 static 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
251 static off_t record__aio_get_pos(int trace_fd)
252 {
253         return lseek(trace_fd, 0, SEEK_CUR);
254 }
255
256 static void record__aio_set_pos(int trace_fd, off_t pos)
257 {
258         lseek(trace_fd, pos, SEEK_SET);
259 }
260
261 static 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
278 static int nr_cblocks_default = 1;
279 static int nr_cblocks_max = 4;
280
281 static 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 */
299 static int nr_cblocks_max = 0;
300
301 static int record__aio_sync(struct perf_mmap *md __maybe_unused, bool sync_all __maybe_unused)
302 {
303         return -1;
304 }
305
306 static 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
312 static off_t record__aio_get_pos(int trace_fd __maybe_unused)
313 {
314         return -1;
315 }
316
317 static void record__aio_set_pos(int trace_fd __maybe_unused, off_t pos __maybe_unused)
318 {
319 }
320
321 static void record__aio_mmap_read_sync(struct record *rec __maybe_unused)
322 {
323 }
324 #endif
325
326 static int record__aio_enabled(struct record *rec)
327 {
328         return rec->opts.nr_cblocks > 0;
329 }
330
331 static 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
340 static 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
348 static volatile int done;
349 static volatile int signr = -1;
350 static volatile int child_finished;
351
352 static 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
362 static void sigsegv_handler(int sig)
363 {
364         perf_hooks__recover();
365         sighandler_dump_stack(sig);
366 }
367
368 static 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
379 static 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
417 static 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
433 static 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
450 static 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         }
466 out:
467         return rc;
468 }
469
470 static 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
483 static 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
503 static inline
504 int record__auxtrace_mmap_read(struct record *rec __maybe_unused,
505                                struct perf_mmap *map __maybe_unused)
506 {
507         return 0;
508 }
509
510 static inline
511 void record__read_auxtrace_snapshot(struct record *rec __maybe_unused)
512 {
513 }
514
515 static inline
516 int auxtrace_record__snapshot_start(struct auxtrace_record *itr __maybe_unused)
517 {
518         return 0;
519 }
520
521 static int record__auxtrace_init(struct record *rec __maybe_unused)
522 {
523         return 0;
524 }
525
526 #endif
527
528 static 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
557 static int record__mmap(struct record *rec)
558 {
559         return record__mmap_evlist(rec, rec->evlist);
560 }
561
562 static 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) {
591 try_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);
636 out:
637         return rc;
638 }
639
640 static 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
660 static 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
691 static 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
720 static struct perf_event_header finished_round_event = {
721         .size = sizeof(struct perf_event_header),
722         .type = PERF_RECORD_FINISHED_ROUND,
723 };
724
725 static 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);
791 out:
792         return rc;
793 }
794
795 static 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
806 static 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
832 static void
833 record__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
855 static 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
875 static int record__synthesize(struct record *rec, bool tail);
876
877 static int
878 record__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
931 static 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  */
938 static 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
947 static void snapshot_sig_handler(int sig);
948 static void alarm_sig_handler(int sig);
949
950 int __weak
951 perf_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
959 static const struct perf_event_mmap_page *
960 perf_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
971 static 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
981 static 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);
1088 out:
1089         return err;
1090 }
1091
1092 static 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
1397 out_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
1451 out_delete_session:
1452         perf_session__delete(session);
1453         return status;
1454 }
1455
1456 static 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
1467 int 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
1492 int 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
1499 int 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
1514 static 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
1544 struct 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
1568 static 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
1587 static 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
1600 static 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
1642 static 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
1680 out_free:
1681         free(s);
1682         return ret;
1683 }
1684
1685 static 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
1702 static 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
1747 enabled:
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
1757 static const char * const __record_usage[] = {
1758         "perf record [<options>] [<command>]",
1759         "perf record [<options>] -- <command> [<options>]",
1760         NULL
1761 };
1762 const 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  */
1774 static 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
1798 const char record_callchain_help[] = CALLCHAIN_RECORD_HELP
1799         "\n\t\t\t\tDefault: fp";
1800
1801 static 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  */
1810 static 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
1952 struct option *record_options = __record_options;
1953
1954 int 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);
2147 out:
2148         perf_evlist__delete(rec->evlist);
2149         symbol__exit();
2150         auxtrace_record__free(rec->itr);
2151         return err;
2152 }
2153
2154 static 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
2169 static 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 }