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