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