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