xref: /openbmc/linux/tools/perf/builtin-record.c (revision 0153682e)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * builtin-record.c
4  *
5  * Builtin record command: Record the profile of a workload
6  * (or a CPU, or a PID) into the perf.data output file - for
7  * later analysis via perf report.
8  */
9 #include "builtin.h"
10 
11 #include "util/build-id.h"
12 #include <subcmd/parse-options.h>
13 #include "util/parse-events.h"
14 #include "util/config.h"
15 
16 #include "util/callchain.h"
17 #include "util/cgroup.h"
18 #include "util/header.h"
19 #include "util/event.h"
20 #include "util/evlist.h"
21 #include "util/evsel.h"
22 #include "util/debug.h"
23 #include "util/mmap.h"
24 #include "util/target.h"
25 #include "util/session.h"
26 #include "util/tool.h"
27 #include "util/symbol.h"
28 #include "util/record.h"
29 #include "util/cpumap.h"
30 #include "util/thread_map.h"
31 #include "util/data.h"
32 #include "util/perf_regs.h"
33 #include "util/auxtrace.h"
34 #include "util/tsc.h"
35 #include "util/parse-branch-options.h"
36 #include "util/parse-regs-options.h"
37 #include "util/perf_api_probe.h"
38 #include "util/llvm-utils.h"
39 #include "util/bpf-loader.h"
40 #include "util/trigger.h"
41 #include "util/perf-hooks.h"
42 #include "util/cpu-set-sched.h"
43 #include "util/synthetic-events.h"
44 #include "util/time-utils.h"
45 #include "util/units.h"
46 #include "util/bpf-event.h"
47 #include "util/util.h"
48 #include "util/pfm.h"
49 #include "util/clockid.h"
50 #include "util/pmu-hybrid.h"
51 #include "util/evlist-hybrid.h"
52 #include "util/off_cpu.h"
53 #include "asm/bug.h"
54 #include "perf.h"
55 #include "cputopo.h"
56 
57 #include <errno.h>
58 #include <inttypes.h>
59 #include <locale.h>
60 #include <poll.h>
61 #include <pthread.h>
62 #include <unistd.h>
63 #ifndef HAVE_GETTID
64 #include <syscall.h>
65 #endif
66 #include <sched.h>
67 #include <signal.h>
68 #ifdef HAVE_EVENTFD_SUPPORT
69 #include <sys/eventfd.h>
70 #endif
71 #include <sys/mman.h>
72 #include <sys/wait.h>
73 #include <sys/types.h>
74 #include <sys/stat.h>
75 #include <fcntl.h>
76 #include <linux/err.h>
77 #include <linux/string.h>
78 #include <linux/time64.h>
79 #include <linux/zalloc.h>
80 #include <linux/bitmap.h>
81 #include <sys/time.h>
82 
83 struct switch_output {
84 	bool		 enabled;
85 	bool		 signal;
86 	unsigned long	 size;
87 	unsigned long	 time;
88 	const char	*str;
89 	bool		 set;
90 	char		 **filenames;
91 	int		 num_files;
92 	int		 cur_file;
93 };
94 
95 struct thread_mask {
96 	struct mmap_cpu_mask	maps;
97 	struct mmap_cpu_mask	affinity;
98 };
99 
100 struct record_thread {
101 	pid_t			tid;
102 	struct thread_mask	*mask;
103 	struct {
104 		int		msg[2];
105 		int		ack[2];
106 	} pipes;
107 	struct fdarray		pollfd;
108 	int			ctlfd_pos;
109 	int			nr_mmaps;
110 	struct mmap		**maps;
111 	struct mmap		**overwrite_maps;
112 	struct record		*rec;
113 	unsigned long long	samples;
114 	unsigned long		waking;
115 	u64			bytes_written;
116 	u64			bytes_transferred;
117 	u64			bytes_compressed;
118 };
119 
120 static __thread struct record_thread *thread;
121 
122 enum thread_msg {
123 	THREAD_MSG__UNDEFINED = 0,
124 	THREAD_MSG__READY,
125 	THREAD_MSG__MAX,
126 };
127 
128 static const char *thread_msg_tags[THREAD_MSG__MAX] = {
129 	"UNDEFINED", "READY"
130 };
131 
132 enum thread_spec {
133 	THREAD_SPEC__UNDEFINED = 0,
134 	THREAD_SPEC__CPU,
135 	THREAD_SPEC__CORE,
136 	THREAD_SPEC__PACKAGE,
137 	THREAD_SPEC__NUMA,
138 	THREAD_SPEC__USER,
139 	THREAD_SPEC__MAX,
140 };
141 
142 static const char *thread_spec_tags[THREAD_SPEC__MAX] = {
143 	"undefined", "cpu", "core", "package", "numa", "user"
144 };
145 
146 struct record {
147 	struct perf_tool	tool;
148 	struct record_opts	opts;
149 	u64			bytes_written;
150 	struct perf_data	data;
151 	struct auxtrace_record	*itr;
152 	struct evlist	*evlist;
153 	struct perf_session	*session;
154 	struct evlist		*sb_evlist;
155 	pthread_t		thread_id;
156 	int			realtime_prio;
157 	bool			switch_output_event_set;
158 	bool			no_buildid;
159 	bool			no_buildid_set;
160 	bool			no_buildid_cache;
161 	bool			no_buildid_cache_set;
162 	bool			buildid_all;
163 	bool			buildid_mmap;
164 	bool			timestamp_filename;
165 	bool			timestamp_boundary;
166 	bool			off_cpu;
167 	struct switch_output	switch_output;
168 	unsigned long long	samples;
169 	unsigned long		output_max_size;	/* = 0: unlimited */
170 	struct perf_debuginfod	debuginfod;
171 	int			nr_threads;
172 	struct thread_mask	*thread_masks;
173 	struct record_thread	*thread_data;
174 };
175 
176 static volatile int done;
177 
178 static volatile int auxtrace_record__snapshot_started;
179 static DEFINE_TRIGGER(auxtrace_snapshot_trigger);
180 static DEFINE_TRIGGER(switch_output_trigger);
181 
182 static const char *affinity_tags[PERF_AFFINITY_MAX] = {
183 	"SYS", "NODE", "CPU"
184 };
185 
186 #ifndef HAVE_GETTID
187 static inline pid_t gettid(void)
188 {
189 	return (pid_t)syscall(__NR_gettid);
190 }
191 #endif
192 
193 static int record__threads_enabled(struct record *rec)
194 {
195 	return rec->opts.threads_spec;
196 }
197 
198 static bool switch_output_signal(struct record *rec)
199 {
200 	return rec->switch_output.signal &&
201 	       trigger_is_ready(&switch_output_trigger);
202 }
203 
204 static bool switch_output_size(struct record *rec)
205 {
206 	return rec->switch_output.size &&
207 	       trigger_is_ready(&switch_output_trigger) &&
208 	       (rec->bytes_written >= rec->switch_output.size);
209 }
210 
211 static bool switch_output_time(struct record *rec)
212 {
213 	return rec->switch_output.time &&
214 	       trigger_is_ready(&switch_output_trigger);
215 }
216 
217 static u64 record__bytes_written(struct record *rec)
218 {
219 	int t;
220 	u64 bytes_written = rec->bytes_written;
221 	struct record_thread *thread_data = rec->thread_data;
222 
223 	for (t = 0; t < rec->nr_threads; t++)
224 		bytes_written += thread_data[t].bytes_written;
225 
226 	return bytes_written;
227 }
228 
229 static bool record__output_max_size_exceeded(struct record *rec)
230 {
231 	return rec->output_max_size &&
232 	       (record__bytes_written(rec) >= rec->output_max_size);
233 }
234 
235 static int record__write(struct record *rec, struct mmap *map __maybe_unused,
236 			 void *bf, size_t size)
237 {
238 	struct perf_data_file *file = &rec->session->data->file;
239 
240 	if (map && map->file)
241 		file = map->file;
242 
243 	if (perf_data_file__write(file, bf, size) < 0) {
244 		pr_err("failed to write perf data, error: %m\n");
245 		return -1;
246 	}
247 
248 	if (map && map->file)
249 		thread->bytes_written += size;
250 	else
251 		rec->bytes_written += size;
252 
253 	if (record__output_max_size_exceeded(rec) && !done) {
254 		fprintf(stderr, "[ perf record: perf size limit reached (%" PRIu64 " KB),"
255 				" stopping session ]\n",
256 				record__bytes_written(rec) >> 10);
257 		done = 1;
258 	}
259 
260 	if (switch_output_size(rec))
261 		trigger_hit(&switch_output_trigger);
262 
263 	return 0;
264 }
265 
266 static int record__aio_enabled(struct record *rec);
267 static int record__comp_enabled(struct record *rec);
268 static size_t zstd_compress(struct perf_session *session, struct mmap *map,
269 			    void *dst, size_t dst_size, void *src, size_t src_size);
270 
271 #ifdef HAVE_AIO_SUPPORT
272 static int record__aio_write(struct aiocb *cblock, int trace_fd,
273 		void *buf, size_t size, off_t off)
274 {
275 	int rc;
276 
277 	cblock->aio_fildes = trace_fd;
278 	cblock->aio_buf    = buf;
279 	cblock->aio_nbytes = size;
280 	cblock->aio_offset = off;
281 	cblock->aio_sigevent.sigev_notify = SIGEV_NONE;
282 
283 	do {
284 		rc = aio_write(cblock);
285 		if (rc == 0) {
286 			break;
287 		} else if (errno != EAGAIN) {
288 			cblock->aio_fildes = -1;
289 			pr_err("failed to queue perf data, error: %m\n");
290 			break;
291 		}
292 	} while (1);
293 
294 	return rc;
295 }
296 
297 static int record__aio_complete(struct mmap *md, struct aiocb *cblock)
298 {
299 	void *rem_buf;
300 	off_t rem_off;
301 	size_t rem_size;
302 	int rc, aio_errno;
303 	ssize_t aio_ret, written;
304 
305 	aio_errno = aio_error(cblock);
306 	if (aio_errno == EINPROGRESS)
307 		return 0;
308 
309 	written = aio_ret = aio_return(cblock);
310 	if (aio_ret < 0) {
311 		if (aio_errno != EINTR)
312 			pr_err("failed to write perf data, error: %m\n");
313 		written = 0;
314 	}
315 
316 	rem_size = cblock->aio_nbytes - written;
317 
318 	if (rem_size == 0) {
319 		cblock->aio_fildes = -1;
320 		/*
321 		 * md->refcount is incremented in record__aio_pushfn() for
322 		 * every aio write request started in record__aio_push() so
323 		 * decrement it because the request is now complete.
324 		 */
325 		perf_mmap__put(&md->core);
326 		rc = 1;
327 	} else {
328 		/*
329 		 * aio write request may require restart with the
330 		 * reminder if the kernel didn't write whole
331 		 * chunk at once.
332 		 */
333 		rem_off = cblock->aio_offset + written;
334 		rem_buf = (void *)(cblock->aio_buf + written);
335 		record__aio_write(cblock, cblock->aio_fildes,
336 				rem_buf, rem_size, rem_off);
337 		rc = 0;
338 	}
339 
340 	return rc;
341 }
342 
343 static int record__aio_sync(struct mmap *md, bool sync_all)
344 {
345 	struct aiocb **aiocb = md->aio.aiocb;
346 	struct aiocb *cblocks = md->aio.cblocks;
347 	struct timespec timeout = { 0, 1000 * 1000  * 1 }; /* 1ms */
348 	int i, do_suspend;
349 
350 	do {
351 		do_suspend = 0;
352 		for (i = 0; i < md->aio.nr_cblocks; ++i) {
353 			if (cblocks[i].aio_fildes == -1 || record__aio_complete(md, &cblocks[i])) {
354 				if (sync_all)
355 					aiocb[i] = NULL;
356 				else
357 					return i;
358 			} else {
359 				/*
360 				 * Started aio write is not complete yet
361 				 * so it has to be waited before the
362 				 * next allocation.
363 				 */
364 				aiocb[i] = &cblocks[i];
365 				do_suspend = 1;
366 			}
367 		}
368 		if (!do_suspend)
369 			return -1;
370 
371 		while (aio_suspend((const struct aiocb **)aiocb, md->aio.nr_cblocks, &timeout)) {
372 			if (!(errno == EAGAIN || errno == EINTR))
373 				pr_err("failed to sync perf data, error: %m\n");
374 		}
375 	} while (1);
376 }
377 
378 struct record_aio {
379 	struct record	*rec;
380 	void		*data;
381 	size_t		size;
382 };
383 
384 static int record__aio_pushfn(struct mmap *map, void *to, void *buf, size_t size)
385 {
386 	struct record_aio *aio = to;
387 
388 	/*
389 	 * map->core.base data pointed by buf is copied into free map->aio.data[] buffer
390 	 * to release space in the kernel buffer as fast as possible, calling
391 	 * perf_mmap__consume() from perf_mmap__push() function.
392 	 *
393 	 * That lets the kernel to proceed with storing more profiling data into
394 	 * the kernel buffer earlier than other per-cpu kernel buffers are handled.
395 	 *
396 	 * Coping can be done in two steps in case the chunk of profiling data
397 	 * crosses the upper bound of the kernel buffer. In this case we first move
398 	 * part of data from map->start till the upper bound and then the reminder
399 	 * from the beginning of the kernel buffer till the end of the data chunk.
400 	 */
401 
402 	if (record__comp_enabled(aio->rec)) {
403 		size = zstd_compress(aio->rec->session, NULL, aio->data + aio->size,
404 				     mmap__mmap_len(map) - aio->size,
405 				     buf, size);
406 	} else {
407 		memcpy(aio->data + aio->size, buf, size);
408 	}
409 
410 	if (!aio->size) {
411 		/*
412 		 * Increment map->refcount to guard map->aio.data[] buffer
413 		 * from premature deallocation because map object can be
414 		 * released earlier than aio write request started on
415 		 * map->aio.data[] buffer is complete.
416 		 *
417 		 * perf_mmap__put() is done at record__aio_complete()
418 		 * after started aio request completion or at record__aio_push()
419 		 * if the request failed to start.
420 		 */
421 		perf_mmap__get(&map->core);
422 	}
423 
424 	aio->size += size;
425 
426 	return size;
427 }
428 
429 static int record__aio_push(struct record *rec, struct mmap *map, off_t *off)
430 {
431 	int ret, idx;
432 	int trace_fd = rec->session->data->file.fd;
433 	struct record_aio aio = { .rec = rec, .size = 0 };
434 
435 	/*
436 	 * Call record__aio_sync() to wait till map->aio.data[] buffer
437 	 * becomes available after previous aio write operation.
438 	 */
439 
440 	idx = record__aio_sync(map, false);
441 	aio.data = map->aio.data[idx];
442 	ret = perf_mmap__push(map, &aio, record__aio_pushfn);
443 	if (ret != 0) /* ret > 0 - no data, ret < 0 - error */
444 		return ret;
445 
446 	rec->samples++;
447 	ret = record__aio_write(&(map->aio.cblocks[idx]), trace_fd, aio.data, aio.size, *off);
448 	if (!ret) {
449 		*off += aio.size;
450 		rec->bytes_written += aio.size;
451 		if (switch_output_size(rec))
452 			trigger_hit(&switch_output_trigger);
453 	} else {
454 		/*
455 		 * Decrement map->refcount incremented in record__aio_pushfn()
456 		 * back if record__aio_write() operation failed to start, otherwise
457 		 * map->refcount is decremented in record__aio_complete() after
458 		 * aio write operation finishes successfully.
459 		 */
460 		perf_mmap__put(&map->core);
461 	}
462 
463 	return ret;
464 }
465 
466 static off_t record__aio_get_pos(int trace_fd)
467 {
468 	return lseek(trace_fd, 0, SEEK_CUR);
469 }
470 
471 static void record__aio_set_pos(int trace_fd, off_t pos)
472 {
473 	lseek(trace_fd, pos, SEEK_SET);
474 }
475 
476 static void record__aio_mmap_read_sync(struct record *rec)
477 {
478 	int i;
479 	struct evlist *evlist = rec->evlist;
480 	struct mmap *maps = evlist->mmap;
481 
482 	if (!record__aio_enabled(rec))
483 		return;
484 
485 	for (i = 0; i < evlist->core.nr_mmaps; i++) {
486 		struct mmap *map = &maps[i];
487 
488 		if (map->core.base)
489 			record__aio_sync(map, true);
490 	}
491 }
492 
493 static int nr_cblocks_default = 1;
494 static int nr_cblocks_max = 4;
495 
496 static int record__aio_parse(const struct option *opt,
497 			     const char *str,
498 			     int unset)
499 {
500 	struct record_opts *opts = (struct record_opts *)opt->value;
501 
502 	if (unset) {
503 		opts->nr_cblocks = 0;
504 	} else {
505 		if (str)
506 			opts->nr_cblocks = strtol(str, NULL, 0);
507 		if (!opts->nr_cblocks)
508 			opts->nr_cblocks = nr_cblocks_default;
509 	}
510 
511 	return 0;
512 }
513 #else /* HAVE_AIO_SUPPORT */
514 static int nr_cblocks_max = 0;
515 
516 static int record__aio_push(struct record *rec __maybe_unused, struct mmap *map __maybe_unused,
517 			    off_t *off __maybe_unused)
518 {
519 	return -1;
520 }
521 
522 static off_t record__aio_get_pos(int trace_fd __maybe_unused)
523 {
524 	return -1;
525 }
526 
527 static void record__aio_set_pos(int trace_fd __maybe_unused, off_t pos __maybe_unused)
528 {
529 }
530 
531 static void record__aio_mmap_read_sync(struct record *rec __maybe_unused)
532 {
533 }
534 #endif
535 
536 static int record__aio_enabled(struct record *rec)
537 {
538 	return rec->opts.nr_cblocks > 0;
539 }
540 
541 #define MMAP_FLUSH_DEFAULT 1
542 static int record__mmap_flush_parse(const struct option *opt,
543 				    const char *str,
544 				    int unset)
545 {
546 	int flush_max;
547 	struct record_opts *opts = (struct record_opts *)opt->value;
548 	static struct parse_tag tags[] = {
549 			{ .tag  = 'B', .mult = 1       },
550 			{ .tag  = 'K', .mult = 1 << 10 },
551 			{ .tag  = 'M', .mult = 1 << 20 },
552 			{ .tag  = 'G', .mult = 1 << 30 },
553 			{ .tag  = 0 },
554 	};
555 
556 	if (unset)
557 		return 0;
558 
559 	if (str) {
560 		opts->mmap_flush = parse_tag_value(str, tags);
561 		if (opts->mmap_flush == (int)-1)
562 			opts->mmap_flush = strtol(str, NULL, 0);
563 	}
564 
565 	if (!opts->mmap_flush)
566 		opts->mmap_flush = MMAP_FLUSH_DEFAULT;
567 
568 	flush_max = evlist__mmap_size(opts->mmap_pages);
569 	flush_max /= 4;
570 	if (opts->mmap_flush > flush_max)
571 		opts->mmap_flush = flush_max;
572 
573 	return 0;
574 }
575 
576 #ifdef HAVE_ZSTD_SUPPORT
577 static unsigned int comp_level_default = 1;
578 
579 static int record__parse_comp_level(const struct option *opt, const char *str, int unset)
580 {
581 	struct record_opts *opts = opt->value;
582 
583 	if (unset) {
584 		opts->comp_level = 0;
585 	} else {
586 		if (str)
587 			opts->comp_level = strtol(str, NULL, 0);
588 		if (!opts->comp_level)
589 			opts->comp_level = comp_level_default;
590 	}
591 
592 	return 0;
593 }
594 #endif
595 static unsigned int comp_level_max = 22;
596 
597 static int record__comp_enabled(struct record *rec)
598 {
599 	return rec->opts.comp_level > 0;
600 }
601 
602 static int process_synthesized_event(struct perf_tool *tool,
603 				     union perf_event *event,
604 				     struct perf_sample *sample __maybe_unused,
605 				     struct machine *machine __maybe_unused)
606 {
607 	struct record *rec = container_of(tool, struct record, tool);
608 	return record__write(rec, NULL, event, event->header.size);
609 }
610 
611 static int process_locked_synthesized_event(struct perf_tool *tool,
612 				     union perf_event *event,
613 				     struct perf_sample *sample __maybe_unused,
614 				     struct machine *machine __maybe_unused)
615 {
616 	static pthread_mutex_t synth_lock = PTHREAD_MUTEX_INITIALIZER;
617 	int ret;
618 
619 	pthread_mutex_lock(&synth_lock);
620 	ret = process_synthesized_event(tool, event, sample, machine);
621 	pthread_mutex_unlock(&synth_lock);
622 	return ret;
623 }
624 
625 static int record__pushfn(struct mmap *map, void *to, void *bf, size_t size)
626 {
627 	struct record *rec = to;
628 
629 	if (record__comp_enabled(rec)) {
630 		size = zstd_compress(rec->session, map, map->data, mmap__mmap_len(map), bf, size);
631 		bf   = map->data;
632 	}
633 
634 	thread->samples++;
635 	return record__write(rec, map, bf, size);
636 }
637 
638 static volatile int signr = -1;
639 static volatile int child_finished;
640 #ifdef HAVE_EVENTFD_SUPPORT
641 static int done_fd = -1;
642 #endif
643 
644 static void sig_handler(int sig)
645 {
646 	if (sig == SIGCHLD)
647 		child_finished = 1;
648 	else
649 		signr = sig;
650 
651 	done = 1;
652 #ifdef HAVE_EVENTFD_SUPPORT
653 {
654 	u64 tmp = 1;
655 	/*
656 	 * It is possible for this signal handler to run after done is checked
657 	 * in the main loop, but before the perf counter fds are polled. If this
658 	 * happens, the poll() will continue to wait even though done is set,
659 	 * and will only break out if either another signal is received, or the
660 	 * counters are ready for read. To ensure the poll() doesn't sleep when
661 	 * done is set, use an eventfd (done_fd) to wake up the poll().
662 	 */
663 	if (write(done_fd, &tmp, sizeof(tmp)) < 0)
664 		pr_err("failed to signal wakeup fd, error: %m\n");
665 }
666 #endif // HAVE_EVENTFD_SUPPORT
667 }
668 
669 static void sigsegv_handler(int sig)
670 {
671 	perf_hooks__recover();
672 	sighandler_dump_stack(sig);
673 }
674 
675 static void record__sig_exit(void)
676 {
677 	if (signr == -1)
678 		return;
679 
680 	signal(signr, SIG_DFL);
681 	raise(signr);
682 }
683 
684 #ifdef HAVE_AUXTRACE_SUPPORT
685 
686 static int record__process_auxtrace(struct perf_tool *tool,
687 				    struct mmap *map,
688 				    union perf_event *event, void *data1,
689 				    size_t len1, void *data2, size_t len2)
690 {
691 	struct record *rec = container_of(tool, struct record, tool);
692 	struct perf_data *data = &rec->data;
693 	size_t padding;
694 	u8 pad[8] = {0};
695 
696 	if (!perf_data__is_pipe(data) && perf_data__is_single_file(data)) {
697 		off_t file_offset;
698 		int fd = perf_data__fd(data);
699 		int err;
700 
701 		file_offset = lseek(fd, 0, SEEK_CUR);
702 		if (file_offset == -1)
703 			return -1;
704 		err = auxtrace_index__auxtrace_event(&rec->session->auxtrace_index,
705 						     event, file_offset);
706 		if (err)
707 			return err;
708 	}
709 
710 	/* event.auxtrace.size includes padding, see __auxtrace_mmap__read() */
711 	padding = (len1 + len2) & 7;
712 	if (padding)
713 		padding = 8 - padding;
714 
715 	record__write(rec, map, event, event->header.size);
716 	record__write(rec, map, data1, len1);
717 	if (len2)
718 		record__write(rec, map, data2, len2);
719 	record__write(rec, map, &pad, padding);
720 
721 	return 0;
722 }
723 
724 static int record__auxtrace_mmap_read(struct record *rec,
725 				      struct mmap *map)
726 {
727 	int ret;
728 
729 	ret = auxtrace_mmap__read(map, rec->itr, &rec->tool,
730 				  record__process_auxtrace);
731 	if (ret < 0)
732 		return ret;
733 
734 	if (ret)
735 		rec->samples++;
736 
737 	return 0;
738 }
739 
740 static int record__auxtrace_mmap_read_snapshot(struct record *rec,
741 					       struct mmap *map)
742 {
743 	int ret;
744 
745 	ret = auxtrace_mmap__read_snapshot(map, rec->itr, &rec->tool,
746 					   record__process_auxtrace,
747 					   rec->opts.auxtrace_snapshot_size);
748 	if (ret < 0)
749 		return ret;
750 
751 	if (ret)
752 		rec->samples++;
753 
754 	return 0;
755 }
756 
757 static int record__auxtrace_read_snapshot_all(struct record *rec)
758 {
759 	int i;
760 	int rc = 0;
761 
762 	for (i = 0; i < rec->evlist->core.nr_mmaps; i++) {
763 		struct mmap *map = &rec->evlist->mmap[i];
764 
765 		if (!map->auxtrace_mmap.base)
766 			continue;
767 
768 		if (record__auxtrace_mmap_read_snapshot(rec, map) != 0) {
769 			rc = -1;
770 			goto out;
771 		}
772 	}
773 out:
774 	return rc;
775 }
776 
777 static void record__read_auxtrace_snapshot(struct record *rec, bool on_exit)
778 {
779 	pr_debug("Recording AUX area tracing snapshot\n");
780 	if (record__auxtrace_read_snapshot_all(rec) < 0) {
781 		trigger_error(&auxtrace_snapshot_trigger);
782 	} else {
783 		if (auxtrace_record__snapshot_finish(rec->itr, on_exit))
784 			trigger_error(&auxtrace_snapshot_trigger);
785 		else
786 			trigger_ready(&auxtrace_snapshot_trigger);
787 	}
788 }
789 
790 static int record__auxtrace_snapshot_exit(struct record *rec)
791 {
792 	if (trigger_is_error(&auxtrace_snapshot_trigger))
793 		return 0;
794 
795 	if (!auxtrace_record__snapshot_started &&
796 	    auxtrace_record__snapshot_start(rec->itr))
797 		return -1;
798 
799 	record__read_auxtrace_snapshot(rec, true);
800 	if (trigger_is_error(&auxtrace_snapshot_trigger))
801 		return -1;
802 
803 	return 0;
804 }
805 
806 static int record__auxtrace_init(struct record *rec)
807 {
808 	int err;
809 
810 	if ((rec->opts.auxtrace_snapshot_opts || rec->opts.auxtrace_sample_opts)
811 	    && record__threads_enabled(rec)) {
812 		pr_err("AUX area tracing options are not available in parallel streaming mode.\n");
813 		return -EINVAL;
814 	}
815 
816 	if (!rec->itr) {
817 		rec->itr = auxtrace_record__init(rec->evlist, &err);
818 		if (err)
819 			return err;
820 	}
821 
822 	err = auxtrace_parse_snapshot_options(rec->itr, &rec->opts,
823 					      rec->opts.auxtrace_snapshot_opts);
824 	if (err)
825 		return err;
826 
827 	err = auxtrace_parse_sample_options(rec->itr, rec->evlist, &rec->opts,
828 					    rec->opts.auxtrace_sample_opts);
829 	if (err)
830 		return err;
831 
832 	auxtrace_regroup_aux_output(rec->evlist);
833 
834 	return auxtrace_parse_filters(rec->evlist);
835 }
836 
837 #else
838 
839 static inline
840 int record__auxtrace_mmap_read(struct record *rec __maybe_unused,
841 			       struct mmap *map __maybe_unused)
842 {
843 	return 0;
844 }
845 
846 static inline
847 void record__read_auxtrace_snapshot(struct record *rec __maybe_unused,
848 				    bool on_exit __maybe_unused)
849 {
850 }
851 
852 static inline
853 int auxtrace_record__snapshot_start(struct auxtrace_record *itr __maybe_unused)
854 {
855 	return 0;
856 }
857 
858 static inline
859 int record__auxtrace_snapshot_exit(struct record *rec __maybe_unused)
860 {
861 	return 0;
862 }
863 
864 static int record__auxtrace_init(struct record *rec __maybe_unused)
865 {
866 	return 0;
867 }
868 
869 #endif
870 
871 static int record__config_text_poke(struct evlist *evlist)
872 {
873 	struct evsel *evsel;
874 
875 	/* Nothing to do if text poke is already configured */
876 	evlist__for_each_entry(evlist, evsel) {
877 		if (evsel->core.attr.text_poke)
878 			return 0;
879 	}
880 
881 	evsel = evlist__add_dummy_on_all_cpus(evlist);
882 	if (!evsel)
883 		return -ENOMEM;
884 
885 	evsel->core.attr.text_poke = 1;
886 	evsel->core.attr.ksymbol = 1;
887 	evsel->immediate = true;
888 	evsel__set_sample_bit(evsel, TIME);
889 
890 	return 0;
891 }
892 
893 static int record__config_off_cpu(struct record *rec)
894 {
895 	return off_cpu_prepare(rec->evlist, &rec->opts.target, &rec->opts);
896 }
897 
898 static bool record__kcore_readable(struct machine *machine)
899 {
900 	char kcore[PATH_MAX];
901 	int fd;
902 
903 	scnprintf(kcore, sizeof(kcore), "%s/proc/kcore", machine->root_dir);
904 
905 	fd = open(kcore, O_RDONLY);
906 	if (fd < 0)
907 		return false;
908 
909 	close(fd);
910 
911 	return true;
912 }
913 
914 static int record__kcore_copy(struct machine *machine, struct perf_data *data)
915 {
916 	char from_dir[PATH_MAX];
917 	char kcore_dir[PATH_MAX];
918 	int ret;
919 
920 	snprintf(from_dir, sizeof(from_dir), "%s/proc", machine->root_dir);
921 
922 	ret = perf_data__make_kcore_dir(data, kcore_dir, sizeof(kcore_dir));
923 	if (ret)
924 		return ret;
925 
926 	return kcore_copy(from_dir, kcore_dir);
927 }
928 
929 static void record__thread_data_init_pipes(struct record_thread *thread_data)
930 {
931 	thread_data->pipes.msg[0] = -1;
932 	thread_data->pipes.msg[1] = -1;
933 	thread_data->pipes.ack[0] = -1;
934 	thread_data->pipes.ack[1] = -1;
935 }
936 
937 static int record__thread_data_open_pipes(struct record_thread *thread_data)
938 {
939 	if (pipe(thread_data->pipes.msg))
940 		return -EINVAL;
941 
942 	if (pipe(thread_data->pipes.ack)) {
943 		close(thread_data->pipes.msg[0]);
944 		thread_data->pipes.msg[0] = -1;
945 		close(thread_data->pipes.msg[1]);
946 		thread_data->pipes.msg[1] = -1;
947 		return -EINVAL;
948 	}
949 
950 	pr_debug2("thread_data[%p]: msg=[%d,%d], ack=[%d,%d]\n", thread_data,
951 		 thread_data->pipes.msg[0], thread_data->pipes.msg[1],
952 		 thread_data->pipes.ack[0], thread_data->pipes.ack[1]);
953 
954 	return 0;
955 }
956 
957 static void record__thread_data_close_pipes(struct record_thread *thread_data)
958 {
959 	if (thread_data->pipes.msg[0] != -1) {
960 		close(thread_data->pipes.msg[0]);
961 		thread_data->pipes.msg[0] = -1;
962 	}
963 	if (thread_data->pipes.msg[1] != -1) {
964 		close(thread_data->pipes.msg[1]);
965 		thread_data->pipes.msg[1] = -1;
966 	}
967 	if (thread_data->pipes.ack[0] != -1) {
968 		close(thread_data->pipes.ack[0]);
969 		thread_data->pipes.ack[0] = -1;
970 	}
971 	if (thread_data->pipes.ack[1] != -1) {
972 		close(thread_data->pipes.ack[1]);
973 		thread_data->pipes.ack[1] = -1;
974 	}
975 }
976 
977 static bool evlist__per_thread(struct evlist *evlist)
978 {
979 	return cpu_map__is_dummy(evlist->core.user_requested_cpus);
980 }
981 
982 static int record__thread_data_init_maps(struct record_thread *thread_data, struct evlist *evlist)
983 {
984 	int m, tm, nr_mmaps = evlist->core.nr_mmaps;
985 	struct mmap *mmap = evlist->mmap;
986 	struct mmap *overwrite_mmap = evlist->overwrite_mmap;
987 	struct perf_cpu_map *cpus = evlist->core.all_cpus;
988 	bool per_thread = evlist__per_thread(evlist);
989 
990 	if (per_thread)
991 		thread_data->nr_mmaps = nr_mmaps;
992 	else
993 		thread_data->nr_mmaps = bitmap_weight(thread_data->mask->maps.bits,
994 						      thread_data->mask->maps.nbits);
995 	if (mmap) {
996 		thread_data->maps = zalloc(thread_data->nr_mmaps * sizeof(struct mmap *));
997 		if (!thread_data->maps)
998 			return -ENOMEM;
999 	}
1000 	if (overwrite_mmap) {
1001 		thread_data->overwrite_maps = zalloc(thread_data->nr_mmaps * sizeof(struct mmap *));
1002 		if (!thread_data->overwrite_maps) {
1003 			zfree(&thread_data->maps);
1004 			return -ENOMEM;
1005 		}
1006 	}
1007 	pr_debug2("thread_data[%p]: nr_mmaps=%d, maps=%p, ow_maps=%p\n", thread_data,
1008 		 thread_data->nr_mmaps, thread_data->maps, thread_data->overwrite_maps);
1009 
1010 	for (m = 0, tm = 0; m < nr_mmaps && tm < thread_data->nr_mmaps; m++) {
1011 		if (per_thread ||
1012 		    test_bit(perf_cpu_map__cpu(cpus, m).cpu, thread_data->mask->maps.bits)) {
1013 			if (thread_data->maps) {
1014 				thread_data->maps[tm] = &mmap[m];
1015 				pr_debug2("thread_data[%p]: cpu%d: maps[%d] -> mmap[%d]\n",
1016 					  thread_data, perf_cpu_map__cpu(cpus, m).cpu, tm, m);
1017 			}
1018 			if (thread_data->overwrite_maps) {
1019 				thread_data->overwrite_maps[tm] = &overwrite_mmap[m];
1020 				pr_debug2("thread_data[%p]: cpu%d: ow_maps[%d] -> ow_mmap[%d]\n",
1021 					  thread_data, perf_cpu_map__cpu(cpus, m).cpu, tm, m);
1022 			}
1023 			tm++;
1024 		}
1025 	}
1026 
1027 	return 0;
1028 }
1029 
1030 static int record__thread_data_init_pollfd(struct record_thread *thread_data, struct evlist *evlist)
1031 {
1032 	int f, tm, pos;
1033 	struct mmap *map, *overwrite_map;
1034 
1035 	fdarray__init(&thread_data->pollfd, 64);
1036 
1037 	for (tm = 0; tm < thread_data->nr_mmaps; tm++) {
1038 		map = thread_data->maps ? thread_data->maps[tm] : NULL;
1039 		overwrite_map = thread_data->overwrite_maps ?
1040 				thread_data->overwrite_maps[tm] : NULL;
1041 
1042 		for (f = 0; f < evlist->core.pollfd.nr; f++) {
1043 			void *ptr = evlist->core.pollfd.priv[f].ptr;
1044 
1045 			if ((map && ptr == map) || (overwrite_map && ptr == overwrite_map)) {
1046 				pos = fdarray__dup_entry_from(&thread_data->pollfd, f,
1047 							      &evlist->core.pollfd);
1048 				if (pos < 0)
1049 					return pos;
1050 				pr_debug2("thread_data[%p]: pollfd[%d] <- event_fd=%d\n",
1051 					 thread_data, pos, evlist->core.pollfd.entries[f].fd);
1052 			}
1053 		}
1054 	}
1055 
1056 	return 0;
1057 }
1058 
1059 static void record__free_thread_data(struct record *rec)
1060 {
1061 	int t;
1062 	struct record_thread *thread_data = rec->thread_data;
1063 
1064 	if (thread_data == NULL)
1065 		return;
1066 
1067 	for (t = 0; t < rec->nr_threads; t++) {
1068 		record__thread_data_close_pipes(&thread_data[t]);
1069 		zfree(&thread_data[t].maps);
1070 		zfree(&thread_data[t].overwrite_maps);
1071 		fdarray__exit(&thread_data[t].pollfd);
1072 	}
1073 
1074 	zfree(&rec->thread_data);
1075 }
1076 
1077 static int record__alloc_thread_data(struct record *rec, struct evlist *evlist)
1078 {
1079 	int t, ret;
1080 	struct record_thread *thread_data;
1081 
1082 	rec->thread_data = zalloc(rec->nr_threads * sizeof(*(rec->thread_data)));
1083 	if (!rec->thread_data) {
1084 		pr_err("Failed to allocate thread data\n");
1085 		return -ENOMEM;
1086 	}
1087 	thread_data = rec->thread_data;
1088 
1089 	for (t = 0; t < rec->nr_threads; t++)
1090 		record__thread_data_init_pipes(&thread_data[t]);
1091 
1092 	for (t = 0; t < rec->nr_threads; t++) {
1093 		thread_data[t].rec = rec;
1094 		thread_data[t].mask = &rec->thread_masks[t];
1095 		ret = record__thread_data_init_maps(&thread_data[t], evlist);
1096 		if (ret) {
1097 			pr_err("Failed to initialize thread[%d] maps\n", t);
1098 			goto out_free;
1099 		}
1100 		ret = record__thread_data_init_pollfd(&thread_data[t], evlist);
1101 		if (ret) {
1102 			pr_err("Failed to initialize thread[%d] pollfd\n", t);
1103 			goto out_free;
1104 		}
1105 		if (t) {
1106 			thread_data[t].tid = -1;
1107 			ret = record__thread_data_open_pipes(&thread_data[t]);
1108 			if (ret) {
1109 				pr_err("Failed to open thread[%d] communication pipes\n", t);
1110 				goto out_free;
1111 			}
1112 			ret = fdarray__add(&thread_data[t].pollfd, thread_data[t].pipes.msg[0],
1113 					   POLLIN | POLLERR | POLLHUP, fdarray_flag__nonfilterable);
1114 			if (ret < 0) {
1115 				pr_err("Failed to add descriptor to thread[%d] pollfd\n", t);
1116 				goto out_free;
1117 			}
1118 			thread_data[t].ctlfd_pos = ret;
1119 			pr_debug2("thread_data[%p]: pollfd[%d] <- ctl_fd=%d\n",
1120 				 thread_data, thread_data[t].ctlfd_pos,
1121 				 thread_data[t].pipes.msg[0]);
1122 		} else {
1123 			thread_data[t].tid = gettid();
1124 			if (evlist->ctl_fd.pos == -1)
1125 				continue;
1126 			ret = fdarray__dup_entry_from(&thread_data[t].pollfd, evlist->ctl_fd.pos,
1127 						      &evlist->core.pollfd);
1128 			if (ret < 0) {
1129 				pr_err("Failed to duplicate descriptor in main thread pollfd\n");
1130 				goto out_free;
1131 			}
1132 			thread_data[t].ctlfd_pos = ret;
1133 			pr_debug2("thread_data[%p]: pollfd[%d] <- ctl_fd=%d\n",
1134 				 thread_data, thread_data[t].ctlfd_pos,
1135 				 evlist->core.pollfd.entries[evlist->ctl_fd.pos].fd);
1136 		}
1137 	}
1138 
1139 	return 0;
1140 
1141 out_free:
1142 	record__free_thread_data(rec);
1143 
1144 	return ret;
1145 }
1146 
1147 static int record__mmap_evlist(struct record *rec,
1148 			       struct evlist *evlist)
1149 {
1150 	int i, ret;
1151 	struct record_opts *opts = &rec->opts;
1152 	bool auxtrace_overwrite = opts->auxtrace_snapshot_mode ||
1153 				  opts->auxtrace_sample_mode;
1154 	char msg[512];
1155 
1156 	if (opts->affinity != PERF_AFFINITY_SYS)
1157 		cpu__setup_cpunode_map();
1158 
1159 	if (evlist__mmap_ex(evlist, opts->mmap_pages,
1160 				 opts->auxtrace_mmap_pages,
1161 				 auxtrace_overwrite,
1162 				 opts->nr_cblocks, opts->affinity,
1163 				 opts->mmap_flush, opts->comp_level) < 0) {
1164 		if (errno == EPERM) {
1165 			pr_err("Permission error mapping pages.\n"
1166 			       "Consider increasing "
1167 			       "/proc/sys/kernel/perf_event_mlock_kb,\n"
1168 			       "or try again with a smaller value of -m/--mmap_pages.\n"
1169 			       "(current value: %u,%u)\n",
1170 			       opts->mmap_pages, opts->auxtrace_mmap_pages);
1171 			return -errno;
1172 		} else {
1173 			pr_err("failed to mmap with %d (%s)\n", errno,
1174 				str_error_r(errno, msg, sizeof(msg)));
1175 			if (errno)
1176 				return -errno;
1177 			else
1178 				return -EINVAL;
1179 		}
1180 	}
1181 
1182 	if (evlist__initialize_ctlfd(evlist, opts->ctl_fd, opts->ctl_fd_ack))
1183 		return -1;
1184 
1185 	ret = record__alloc_thread_data(rec, evlist);
1186 	if (ret)
1187 		return ret;
1188 
1189 	if (record__threads_enabled(rec)) {
1190 		ret = perf_data__create_dir(&rec->data, evlist->core.nr_mmaps);
1191 		if (ret) {
1192 			pr_err("Failed to create data directory: %s\n", strerror(-ret));
1193 			return ret;
1194 		}
1195 		for (i = 0; i < evlist->core.nr_mmaps; i++) {
1196 			if (evlist->mmap)
1197 				evlist->mmap[i].file = &rec->data.dir.files[i];
1198 			if (evlist->overwrite_mmap)
1199 				evlist->overwrite_mmap[i].file = &rec->data.dir.files[i];
1200 		}
1201 	}
1202 
1203 	return 0;
1204 }
1205 
1206 static int record__mmap(struct record *rec)
1207 {
1208 	return record__mmap_evlist(rec, rec->evlist);
1209 }
1210 
1211 static int record__open(struct record *rec)
1212 {
1213 	char msg[BUFSIZ];
1214 	struct evsel *pos;
1215 	struct evlist *evlist = rec->evlist;
1216 	struct perf_session *session = rec->session;
1217 	struct record_opts *opts = &rec->opts;
1218 	int rc = 0;
1219 
1220 	/*
1221 	 * For initial_delay, system wide or a hybrid system, we need to add a
1222 	 * dummy event so that we can track PERF_RECORD_MMAP to cover the delay
1223 	 * of waiting or event synthesis.
1224 	 */
1225 	if (opts->initial_delay || target__has_cpu(&opts->target) ||
1226 	    perf_pmu__has_hybrid()) {
1227 		pos = evlist__get_tracking_event(evlist);
1228 		if (!evsel__is_dummy_event(pos)) {
1229 			/* Set up dummy event. */
1230 			if (evlist__add_dummy(evlist))
1231 				return -ENOMEM;
1232 			pos = evlist__last(evlist);
1233 			evlist__set_tracking_event(evlist, pos);
1234 		}
1235 
1236 		/*
1237 		 * Enable the dummy event when the process is forked for
1238 		 * initial_delay, immediately for system wide.
1239 		 */
1240 		if (opts->initial_delay && !pos->immediate &&
1241 		    !target__has_cpu(&opts->target))
1242 			pos->core.attr.enable_on_exec = 1;
1243 		else
1244 			pos->immediate = 1;
1245 	}
1246 
1247 	evlist__config(evlist, opts, &callchain_param);
1248 
1249 	evlist__for_each_entry(evlist, pos) {
1250 try_again:
1251 		if (evsel__open(pos, pos->core.cpus, pos->core.threads) < 0) {
1252 			if (evsel__fallback(pos, errno, msg, sizeof(msg))) {
1253 				if (verbose > 0)
1254 					ui__warning("%s\n", msg);
1255 				goto try_again;
1256 			}
1257 			if ((errno == EINVAL || errno == EBADF) &&
1258 			    pos->core.leader != &pos->core &&
1259 			    pos->weak_group) {
1260 			        pos = evlist__reset_weak_group(evlist, pos, true);
1261 				goto try_again;
1262 			}
1263 			rc = -errno;
1264 			evsel__open_strerror(pos, &opts->target, errno, msg, sizeof(msg));
1265 			ui__error("%s\n", msg);
1266 			goto out;
1267 		}
1268 
1269 		pos->supported = true;
1270 	}
1271 
1272 	if (symbol_conf.kptr_restrict && !evlist__exclude_kernel(evlist)) {
1273 		pr_warning(
1274 "WARNING: Kernel address maps (/proc/{kallsyms,modules}) are restricted,\n"
1275 "check /proc/sys/kernel/kptr_restrict and /proc/sys/kernel/perf_event_paranoid.\n\n"
1276 "Samples in kernel functions may not be resolved if a suitable vmlinux\n"
1277 "file is not found in the buildid cache or in the vmlinux path.\n\n"
1278 "Samples in kernel modules won't be resolved at all.\n\n"
1279 "If some relocation was applied (e.g. kexec) symbols may be misresolved\n"
1280 "even with a suitable vmlinux or kallsyms file.\n\n");
1281 	}
1282 
1283 	if (evlist__apply_filters(evlist, &pos)) {
1284 		pr_err("failed to set filter \"%s\" on event %s with %d (%s)\n",
1285 			pos->filter, evsel__name(pos), errno,
1286 			str_error_r(errno, msg, sizeof(msg)));
1287 		rc = -1;
1288 		goto out;
1289 	}
1290 
1291 	rc = record__mmap(rec);
1292 	if (rc)
1293 		goto out;
1294 
1295 	session->evlist = evlist;
1296 	perf_session__set_id_hdr_size(session);
1297 out:
1298 	return rc;
1299 }
1300 
1301 static void set_timestamp_boundary(struct record *rec, u64 sample_time)
1302 {
1303 	if (rec->evlist->first_sample_time == 0)
1304 		rec->evlist->first_sample_time = sample_time;
1305 
1306 	if (sample_time)
1307 		rec->evlist->last_sample_time = sample_time;
1308 }
1309 
1310 static int process_sample_event(struct perf_tool *tool,
1311 				union perf_event *event,
1312 				struct perf_sample *sample,
1313 				struct evsel *evsel,
1314 				struct machine *machine)
1315 {
1316 	struct record *rec = container_of(tool, struct record, tool);
1317 
1318 	set_timestamp_boundary(rec, sample->time);
1319 
1320 	if (rec->buildid_all)
1321 		return 0;
1322 
1323 	rec->samples++;
1324 	return build_id__mark_dso_hit(tool, event, sample, evsel, machine);
1325 }
1326 
1327 static int process_buildids(struct record *rec)
1328 {
1329 	struct perf_session *session = rec->session;
1330 
1331 	if (perf_data__size(&rec->data) == 0)
1332 		return 0;
1333 
1334 	/*
1335 	 * During this process, it'll load kernel map and replace the
1336 	 * dso->long_name to a real pathname it found.  In this case
1337 	 * we prefer the vmlinux path like
1338 	 *   /lib/modules/3.16.4/build/vmlinux
1339 	 *
1340 	 * rather than build-id path (in debug directory).
1341 	 *   $HOME/.debug/.build-id/f0/6e17aa50adf4d00b88925e03775de107611551
1342 	 */
1343 	symbol_conf.ignore_vmlinux_buildid = true;
1344 
1345 	/*
1346 	 * If --buildid-all is given, it marks all DSO regardless of hits,
1347 	 * so no need to process samples. But if timestamp_boundary is enabled,
1348 	 * it still needs to walk on all samples to get the timestamps of
1349 	 * first/last samples.
1350 	 */
1351 	if (rec->buildid_all && !rec->timestamp_boundary)
1352 		rec->tool.sample = NULL;
1353 
1354 	return perf_session__process_events(session);
1355 }
1356 
1357 static void perf_event__synthesize_guest_os(struct machine *machine, void *data)
1358 {
1359 	int err;
1360 	struct perf_tool *tool = data;
1361 	/*
1362 	 *As for guest kernel when processing subcommand record&report,
1363 	 *we arrange module mmap prior to guest kernel mmap and trigger
1364 	 *a preload dso because default guest module symbols are loaded
1365 	 *from guest kallsyms instead of /lib/modules/XXX/XXX. This
1366 	 *method is used to avoid symbol missing when the first addr is
1367 	 *in module instead of in guest kernel.
1368 	 */
1369 	err = perf_event__synthesize_modules(tool, process_synthesized_event,
1370 					     machine);
1371 	if (err < 0)
1372 		pr_err("Couldn't record guest kernel [%d]'s reference"
1373 		       " relocation symbol.\n", machine->pid);
1374 
1375 	/*
1376 	 * We use _stext for guest kernel because guest kernel's /proc/kallsyms
1377 	 * have no _text sometimes.
1378 	 */
1379 	err = perf_event__synthesize_kernel_mmap(tool, process_synthesized_event,
1380 						 machine);
1381 	if (err < 0)
1382 		pr_err("Couldn't record guest kernel [%d]'s reference"
1383 		       " relocation symbol.\n", machine->pid);
1384 }
1385 
1386 static struct perf_event_header finished_round_event = {
1387 	.size = sizeof(struct perf_event_header),
1388 	.type = PERF_RECORD_FINISHED_ROUND,
1389 };
1390 
1391 static struct perf_event_header finished_init_event = {
1392 	.size = sizeof(struct perf_event_header),
1393 	.type = PERF_RECORD_FINISHED_INIT,
1394 };
1395 
1396 static void record__adjust_affinity(struct record *rec, struct mmap *map)
1397 {
1398 	if (rec->opts.affinity != PERF_AFFINITY_SYS &&
1399 	    !bitmap_equal(thread->mask->affinity.bits, map->affinity_mask.bits,
1400 			  thread->mask->affinity.nbits)) {
1401 		bitmap_zero(thread->mask->affinity.bits, thread->mask->affinity.nbits);
1402 		bitmap_or(thread->mask->affinity.bits, thread->mask->affinity.bits,
1403 			  map->affinity_mask.bits, thread->mask->affinity.nbits);
1404 		sched_setaffinity(0, MMAP_CPU_MASK_BYTES(&thread->mask->affinity),
1405 					(cpu_set_t *)thread->mask->affinity.bits);
1406 		if (verbose == 2) {
1407 			pr_debug("threads[%d]: running on cpu%d: ", thread->tid, sched_getcpu());
1408 			mmap_cpu_mask__scnprintf(&thread->mask->affinity, "affinity");
1409 		}
1410 	}
1411 }
1412 
1413 static size_t process_comp_header(void *record, size_t increment)
1414 {
1415 	struct perf_record_compressed *event = record;
1416 	size_t size = sizeof(*event);
1417 
1418 	if (increment) {
1419 		event->header.size += increment;
1420 		return increment;
1421 	}
1422 
1423 	event->header.type = PERF_RECORD_COMPRESSED;
1424 	event->header.size = size;
1425 
1426 	return size;
1427 }
1428 
1429 static size_t zstd_compress(struct perf_session *session, struct mmap *map,
1430 			    void *dst, size_t dst_size, void *src, size_t src_size)
1431 {
1432 	size_t compressed;
1433 	size_t max_record_size = PERF_SAMPLE_MAX_SIZE - sizeof(struct perf_record_compressed) - 1;
1434 	struct zstd_data *zstd_data = &session->zstd_data;
1435 
1436 	if (map && map->file)
1437 		zstd_data = &map->zstd_data;
1438 
1439 	compressed = zstd_compress_stream_to_records(zstd_data, dst, dst_size, src, src_size,
1440 						     max_record_size, process_comp_header);
1441 
1442 	if (map && map->file) {
1443 		thread->bytes_transferred += src_size;
1444 		thread->bytes_compressed  += compressed;
1445 	} else {
1446 		session->bytes_transferred += src_size;
1447 		session->bytes_compressed  += compressed;
1448 	}
1449 
1450 	return compressed;
1451 }
1452 
1453 static int record__mmap_read_evlist(struct record *rec, struct evlist *evlist,
1454 				    bool overwrite, bool synch)
1455 {
1456 	u64 bytes_written = rec->bytes_written;
1457 	int i;
1458 	int rc = 0;
1459 	int nr_mmaps;
1460 	struct mmap **maps;
1461 	int trace_fd = rec->data.file.fd;
1462 	off_t off = 0;
1463 
1464 	if (!evlist)
1465 		return 0;
1466 
1467 	nr_mmaps = thread->nr_mmaps;
1468 	maps = overwrite ? thread->overwrite_maps : thread->maps;
1469 
1470 	if (!maps)
1471 		return 0;
1472 
1473 	if (overwrite && evlist->bkw_mmap_state != BKW_MMAP_DATA_PENDING)
1474 		return 0;
1475 
1476 	if (record__aio_enabled(rec))
1477 		off = record__aio_get_pos(trace_fd);
1478 
1479 	for (i = 0; i < nr_mmaps; i++) {
1480 		u64 flush = 0;
1481 		struct mmap *map = maps[i];
1482 
1483 		if (map->core.base) {
1484 			record__adjust_affinity(rec, map);
1485 			if (synch) {
1486 				flush = map->core.flush;
1487 				map->core.flush = 1;
1488 			}
1489 			if (!record__aio_enabled(rec)) {
1490 				if (perf_mmap__push(map, rec, record__pushfn) < 0) {
1491 					if (synch)
1492 						map->core.flush = flush;
1493 					rc = -1;
1494 					goto out;
1495 				}
1496 			} else {
1497 				if (record__aio_push(rec, map, &off) < 0) {
1498 					record__aio_set_pos(trace_fd, off);
1499 					if (synch)
1500 						map->core.flush = flush;
1501 					rc = -1;
1502 					goto out;
1503 				}
1504 			}
1505 			if (synch)
1506 				map->core.flush = flush;
1507 		}
1508 
1509 		if (map->auxtrace_mmap.base && !rec->opts.auxtrace_snapshot_mode &&
1510 		    !rec->opts.auxtrace_sample_mode &&
1511 		    record__auxtrace_mmap_read(rec, map) != 0) {
1512 			rc = -1;
1513 			goto out;
1514 		}
1515 	}
1516 
1517 	if (record__aio_enabled(rec))
1518 		record__aio_set_pos(trace_fd, off);
1519 
1520 	/*
1521 	 * Mark the round finished in case we wrote
1522 	 * at least one event.
1523 	 *
1524 	 * No need for round events in directory mode,
1525 	 * because per-cpu maps and files have data
1526 	 * sorted by kernel.
1527 	 */
1528 	if (!record__threads_enabled(rec) && bytes_written != rec->bytes_written)
1529 		rc = record__write(rec, NULL, &finished_round_event, sizeof(finished_round_event));
1530 
1531 	if (overwrite)
1532 		evlist__toggle_bkw_mmap(evlist, BKW_MMAP_EMPTY);
1533 out:
1534 	return rc;
1535 }
1536 
1537 static int record__mmap_read_all(struct record *rec, bool synch)
1538 {
1539 	int err;
1540 
1541 	err = record__mmap_read_evlist(rec, rec->evlist, false, synch);
1542 	if (err)
1543 		return err;
1544 
1545 	return record__mmap_read_evlist(rec, rec->evlist, true, synch);
1546 }
1547 
1548 static void record__thread_munmap_filtered(struct fdarray *fda, int fd,
1549 					   void *arg __maybe_unused)
1550 {
1551 	struct perf_mmap *map = fda->priv[fd].ptr;
1552 
1553 	if (map)
1554 		perf_mmap__put(map);
1555 }
1556 
1557 static void *record__thread(void *arg)
1558 {
1559 	enum thread_msg msg = THREAD_MSG__READY;
1560 	bool terminate = false;
1561 	struct fdarray *pollfd;
1562 	int err, ctlfd_pos;
1563 
1564 	thread = arg;
1565 	thread->tid = gettid();
1566 
1567 	err = write(thread->pipes.ack[1], &msg, sizeof(msg));
1568 	if (err == -1)
1569 		pr_warning("threads[%d]: failed to notify on start: %s\n",
1570 			   thread->tid, strerror(errno));
1571 
1572 	pr_debug("threads[%d]: started on cpu%d\n", thread->tid, sched_getcpu());
1573 
1574 	pollfd = &thread->pollfd;
1575 	ctlfd_pos = thread->ctlfd_pos;
1576 
1577 	for (;;) {
1578 		unsigned long long hits = thread->samples;
1579 
1580 		if (record__mmap_read_all(thread->rec, false) < 0 || terminate)
1581 			break;
1582 
1583 		if (hits == thread->samples) {
1584 
1585 			err = fdarray__poll(pollfd, -1);
1586 			/*
1587 			 * Propagate error, only if there's any. Ignore positive
1588 			 * number of returned events and interrupt error.
1589 			 */
1590 			if (err > 0 || (err < 0 && errno == EINTR))
1591 				err = 0;
1592 			thread->waking++;
1593 
1594 			if (fdarray__filter(pollfd, POLLERR | POLLHUP,
1595 					    record__thread_munmap_filtered, NULL) == 0)
1596 				break;
1597 		}
1598 
1599 		if (pollfd->entries[ctlfd_pos].revents & POLLHUP) {
1600 			terminate = true;
1601 			close(thread->pipes.msg[0]);
1602 			thread->pipes.msg[0] = -1;
1603 			pollfd->entries[ctlfd_pos].fd = -1;
1604 			pollfd->entries[ctlfd_pos].events = 0;
1605 		}
1606 
1607 		pollfd->entries[ctlfd_pos].revents = 0;
1608 	}
1609 	record__mmap_read_all(thread->rec, true);
1610 
1611 	err = write(thread->pipes.ack[1], &msg, sizeof(msg));
1612 	if (err == -1)
1613 		pr_warning("threads[%d]: failed to notify on termination: %s\n",
1614 			   thread->tid, strerror(errno));
1615 
1616 	return NULL;
1617 }
1618 
1619 static void record__init_features(struct record *rec)
1620 {
1621 	struct perf_session *session = rec->session;
1622 	int feat;
1623 
1624 	for (feat = HEADER_FIRST_FEATURE; feat < HEADER_LAST_FEATURE; feat++)
1625 		perf_header__set_feat(&session->header, feat);
1626 
1627 	if (rec->no_buildid)
1628 		perf_header__clear_feat(&session->header, HEADER_BUILD_ID);
1629 
1630 	if (!have_tracepoints(&rec->evlist->core.entries))
1631 		perf_header__clear_feat(&session->header, HEADER_TRACING_DATA);
1632 
1633 	if (!rec->opts.branch_stack)
1634 		perf_header__clear_feat(&session->header, HEADER_BRANCH_STACK);
1635 
1636 	if (!rec->opts.full_auxtrace)
1637 		perf_header__clear_feat(&session->header, HEADER_AUXTRACE);
1638 
1639 	if (!(rec->opts.use_clockid && rec->opts.clockid_res_ns))
1640 		perf_header__clear_feat(&session->header, HEADER_CLOCKID);
1641 
1642 	if (!rec->opts.use_clockid)
1643 		perf_header__clear_feat(&session->header, HEADER_CLOCK_DATA);
1644 
1645 	if (!record__threads_enabled(rec))
1646 		perf_header__clear_feat(&session->header, HEADER_DIR_FORMAT);
1647 
1648 	if (!record__comp_enabled(rec))
1649 		perf_header__clear_feat(&session->header, HEADER_COMPRESSED);
1650 
1651 	perf_header__clear_feat(&session->header, HEADER_STAT);
1652 }
1653 
1654 static void
1655 record__finish_output(struct record *rec)
1656 {
1657 	int i;
1658 	struct perf_data *data = &rec->data;
1659 	int fd = perf_data__fd(data);
1660 
1661 	if (data->is_pipe)
1662 		return;
1663 
1664 	rec->session->header.data_size += rec->bytes_written;
1665 	data->file.size = lseek(perf_data__fd(data), 0, SEEK_CUR);
1666 	if (record__threads_enabled(rec)) {
1667 		for (i = 0; i < data->dir.nr; i++)
1668 			data->dir.files[i].size = lseek(data->dir.files[i].fd, 0, SEEK_CUR);
1669 	}
1670 
1671 	if (!rec->no_buildid) {
1672 		process_buildids(rec);
1673 
1674 		if (rec->buildid_all)
1675 			dsos__hit_all(rec->session);
1676 	}
1677 	perf_session__write_header(rec->session, rec->evlist, fd, true);
1678 
1679 	return;
1680 }
1681 
1682 static int record__synthesize_workload(struct record *rec, bool tail)
1683 {
1684 	int err;
1685 	struct perf_thread_map *thread_map;
1686 	bool needs_mmap = rec->opts.synth & PERF_SYNTH_MMAP;
1687 
1688 	if (rec->opts.tail_synthesize != tail)
1689 		return 0;
1690 
1691 	thread_map = thread_map__new_by_tid(rec->evlist->workload.pid);
1692 	if (thread_map == NULL)
1693 		return -1;
1694 
1695 	err = perf_event__synthesize_thread_map(&rec->tool, thread_map,
1696 						 process_synthesized_event,
1697 						 &rec->session->machines.host,
1698 						 needs_mmap,
1699 						 rec->opts.sample_address);
1700 	perf_thread_map__put(thread_map);
1701 	return err;
1702 }
1703 
1704 static int write_finished_init(struct record *rec, bool tail)
1705 {
1706 	if (rec->opts.tail_synthesize != tail)
1707 		return 0;
1708 
1709 	return record__write(rec, NULL, &finished_init_event, sizeof(finished_init_event));
1710 }
1711 
1712 static int record__synthesize(struct record *rec, bool tail);
1713 
1714 static int
1715 record__switch_output(struct record *rec, bool at_exit)
1716 {
1717 	struct perf_data *data = &rec->data;
1718 	int fd, err;
1719 	char *new_filename;
1720 
1721 	/* Same Size:      "2015122520103046"*/
1722 	char timestamp[] = "InvalidTimestamp";
1723 
1724 	record__aio_mmap_read_sync(rec);
1725 
1726 	write_finished_init(rec, true);
1727 
1728 	record__synthesize(rec, true);
1729 	if (target__none(&rec->opts.target))
1730 		record__synthesize_workload(rec, true);
1731 
1732 	rec->samples = 0;
1733 	record__finish_output(rec);
1734 	err = fetch_current_timestamp(timestamp, sizeof(timestamp));
1735 	if (err) {
1736 		pr_err("Failed to get current timestamp\n");
1737 		return -EINVAL;
1738 	}
1739 
1740 	fd = perf_data__switch(data, timestamp,
1741 				    rec->session->header.data_offset,
1742 				    at_exit, &new_filename);
1743 	if (fd >= 0 && !at_exit) {
1744 		rec->bytes_written = 0;
1745 		rec->session->header.data_size = 0;
1746 	}
1747 
1748 	if (!quiet)
1749 		fprintf(stderr, "[ perf record: Dump %s.%s ]\n",
1750 			data->path, timestamp);
1751 
1752 	if (rec->switch_output.num_files) {
1753 		int n = rec->switch_output.cur_file + 1;
1754 
1755 		if (n >= rec->switch_output.num_files)
1756 			n = 0;
1757 		rec->switch_output.cur_file = n;
1758 		if (rec->switch_output.filenames[n]) {
1759 			remove(rec->switch_output.filenames[n]);
1760 			zfree(&rec->switch_output.filenames[n]);
1761 		}
1762 		rec->switch_output.filenames[n] = new_filename;
1763 	} else {
1764 		free(new_filename);
1765 	}
1766 
1767 	/* Output tracking events */
1768 	if (!at_exit) {
1769 		record__synthesize(rec, false);
1770 
1771 		/*
1772 		 * In 'perf record --switch-output' without -a,
1773 		 * record__synthesize() in record__switch_output() won't
1774 		 * generate tracking events because there's no thread_map
1775 		 * in evlist. Which causes newly created perf.data doesn't
1776 		 * contain map and comm information.
1777 		 * Create a fake thread_map and directly call
1778 		 * perf_event__synthesize_thread_map() for those events.
1779 		 */
1780 		if (target__none(&rec->opts.target))
1781 			record__synthesize_workload(rec, false);
1782 		write_finished_init(rec, false);
1783 	}
1784 	return fd;
1785 }
1786 
1787 static volatile int workload_exec_errno;
1788 
1789 /*
1790  * evlist__prepare_workload will send a SIGUSR1
1791  * if the fork fails, since we asked by setting its
1792  * want_signal to true.
1793  */
1794 static void workload_exec_failed_signal(int signo __maybe_unused,
1795 					siginfo_t *info,
1796 					void *ucontext __maybe_unused)
1797 {
1798 	workload_exec_errno = info->si_value.sival_int;
1799 	done = 1;
1800 	child_finished = 1;
1801 }
1802 
1803 static void snapshot_sig_handler(int sig);
1804 static void alarm_sig_handler(int sig);
1805 
1806 static const struct perf_event_mmap_page *evlist__pick_pc(struct evlist *evlist)
1807 {
1808 	if (evlist) {
1809 		if (evlist->mmap && evlist->mmap[0].core.base)
1810 			return evlist->mmap[0].core.base;
1811 		if (evlist->overwrite_mmap && evlist->overwrite_mmap[0].core.base)
1812 			return evlist->overwrite_mmap[0].core.base;
1813 	}
1814 	return NULL;
1815 }
1816 
1817 static const struct perf_event_mmap_page *record__pick_pc(struct record *rec)
1818 {
1819 	const struct perf_event_mmap_page *pc = evlist__pick_pc(rec->evlist);
1820 	if (pc)
1821 		return pc;
1822 	return NULL;
1823 }
1824 
1825 static int record__synthesize(struct record *rec, bool tail)
1826 {
1827 	struct perf_session *session = rec->session;
1828 	struct machine *machine = &session->machines.host;
1829 	struct perf_data *data = &rec->data;
1830 	struct record_opts *opts = &rec->opts;
1831 	struct perf_tool *tool = &rec->tool;
1832 	int err = 0;
1833 	event_op f = process_synthesized_event;
1834 
1835 	if (rec->opts.tail_synthesize != tail)
1836 		return 0;
1837 
1838 	if (data->is_pipe) {
1839 		err = perf_event__synthesize_for_pipe(tool, session, data,
1840 						      process_synthesized_event);
1841 		if (err < 0)
1842 			goto out;
1843 
1844 		rec->bytes_written += err;
1845 	}
1846 
1847 	err = perf_event__synth_time_conv(record__pick_pc(rec), tool,
1848 					  process_synthesized_event, machine);
1849 	if (err)
1850 		goto out;
1851 
1852 	/* Synthesize id_index before auxtrace_info */
1853 	err = perf_event__synthesize_id_index(tool,
1854 					      process_synthesized_event,
1855 					      session->evlist, machine);
1856 	if (err)
1857 		goto out;
1858 
1859 	if (rec->opts.full_auxtrace) {
1860 		err = perf_event__synthesize_auxtrace_info(rec->itr, tool,
1861 					session, process_synthesized_event);
1862 		if (err)
1863 			goto out;
1864 	}
1865 
1866 	if (!evlist__exclude_kernel(rec->evlist)) {
1867 		err = perf_event__synthesize_kernel_mmap(tool, process_synthesized_event,
1868 							 machine);
1869 		WARN_ONCE(err < 0, "Couldn't record kernel reference relocation symbol\n"
1870 				   "Symbol resolution may be skewed if relocation was used (e.g. kexec).\n"
1871 				   "Check /proc/kallsyms permission or run as root.\n");
1872 
1873 		err = perf_event__synthesize_modules(tool, process_synthesized_event,
1874 						     machine);
1875 		WARN_ONCE(err < 0, "Couldn't record kernel module information.\n"
1876 				   "Symbol resolution may be skewed if relocation was used (e.g. kexec).\n"
1877 				   "Check /proc/modules permission or run as root.\n");
1878 	}
1879 
1880 	if (perf_guest) {
1881 		machines__process_guests(&session->machines,
1882 					 perf_event__synthesize_guest_os, tool);
1883 	}
1884 
1885 	err = perf_event__synthesize_extra_attr(&rec->tool,
1886 						rec->evlist,
1887 						process_synthesized_event,
1888 						data->is_pipe);
1889 	if (err)
1890 		goto out;
1891 
1892 	err = perf_event__synthesize_thread_map2(&rec->tool, rec->evlist->core.threads,
1893 						 process_synthesized_event,
1894 						NULL);
1895 	if (err < 0) {
1896 		pr_err("Couldn't synthesize thread map.\n");
1897 		return err;
1898 	}
1899 
1900 	err = perf_event__synthesize_cpu_map(&rec->tool, rec->evlist->core.all_cpus,
1901 					     process_synthesized_event, NULL);
1902 	if (err < 0) {
1903 		pr_err("Couldn't synthesize cpu map.\n");
1904 		return err;
1905 	}
1906 
1907 	err = perf_event__synthesize_bpf_events(session, process_synthesized_event,
1908 						machine, opts);
1909 	if (err < 0) {
1910 		pr_warning("Couldn't synthesize bpf events.\n");
1911 		err = 0;
1912 	}
1913 
1914 	if (rec->opts.synth & PERF_SYNTH_CGROUP) {
1915 		err = perf_event__synthesize_cgroups(tool, process_synthesized_event,
1916 						     machine);
1917 		if (err < 0) {
1918 			pr_warning("Couldn't synthesize cgroup events.\n");
1919 			err = 0;
1920 		}
1921 	}
1922 
1923 	if (rec->opts.nr_threads_synthesize > 1) {
1924 		perf_set_multithreaded();
1925 		f = process_locked_synthesized_event;
1926 	}
1927 
1928 	if (rec->opts.synth & PERF_SYNTH_TASK) {
1929 		bool needs_mmap = rec->opts.synth & PERF_SYNTH_MMAP;
1930 
1931 		err = __machine__synthesize_threads(machine, tool, &opts->target,
1932 						    rec->evlist->core.threads,
1933 						    f, needs_mmap, opts->sample_address,
1934 						    rec->opts.nr_threads_synthesize);
1935 	}
1936 
1937 	if (rec->opts.nr_threads_synthesize > 1)
1938 		perf_set_singlethreaded();
1939 
1940 out:
1941 	return err;
1942 }
1943 
1944 static int record__process_signal_event(union perf_event *event __maybe_unused, void *data)
1945 {
1946 	struct record *rec = data;
1947 	pthread_kill(rec->thread_id, SIGUSR2);
1948 	return 0;
1949 }
1950 
1951 static int record__setup_sb_evlist(struct record *rec)
1952 {
1953 	struct record_opts *opts = &rec->opts;
1954 
1955 	if (rec->sb_evlist != NULL) {
1956 		/*
1957 		 * We get here if --switch-output-event populated the
1958 		 * sb_evlist, so associate a callback that will send a SIGUSR2
1959 		 * to the main thread.
1960 		 */
1961 		evlist__set_cb(rec->sb_evlist, record__process_signal_event, rec);
1962 		rec->thread_id = pthread_self();
1963 	}
1964 #ifdef HAVE_LIBBPF_SUPPORT
1965 	if (!opts->no_bpf_event) {
1966 		if (rec->sb_evlist == NULL) {
1967 			rec->sb_evlist = evlist__new();
1968 
1969 			if (rec->sb_evlist == NULL) {
1970 				pr_err("Couldn't create side band evlist.\n.");
1971 				return -1;
1972 			}
1973 		}
1974 
1975 		if (evlist__add_bpf_sb_event(rec->sb_evlist, &rec->session->header.env)) {
1976 			pr_err("Couldn't ask for PERF_RECORD_BPF_EVENT side band events.\n.");
1977 			return -1;
1978 		}
1979 	}
1980 #endif
1981 	if (evlist__start_sb_thread(rec->sb_evlist, &rec->opts.target)) {
1982 		pr_debug("Couldn't start the BPF side band thread:\nBPF programs starting from now on won't be annotatable\n");
1983 		opts->no_bpf_event = true;
1984 	}
1985 
1986 	return 0;
1987 }
1988 
1989 static int record__init_clock(struct record *rec)
1990 {
1991 	struct perf_session *session = rec->session;
1992 	struct timespec ref_clockid;
1993 	struct timeval ref_tod;
1994 	u64 ref;
1995 
1996 	if (!rec->opts.use_clockid)
1997 		return 0;
1998 
1999 	if (rec->opts.use_clockid && rec->opts.clockid_res_ns)
2000 		session->header.env.clock.clockid_res_ns = rec->opts.clockid_res_ns;
2001 
2002 	session->header.env.clock.clockid = rec->opts.clockid;
2003 
2004 	if (gettimeofday(&ref_tod, NULL) != 0) {
2005 		pr_err("gettimeofday failed, cannot set reference time.\n");
2006 		return -1;
2007 	}
2008 
2009 	if (clock_gettime(rec->opts.clockid, &ref_clockid)) {
2010 		pr_err("clock_gettime failed, cannot set reference time.\n");
2011 		return -1;
2012 	}
2013 
2014 	ref = (u64) ref_tod.tv_sec * NSEC_PER_SEC +
2015 	      (u64) ref_tod.tv_usec * NSEC_PER_USEC;
2016 
2017 	session->header.env.clock.tod_ns = ref;
2018 
2019 	ref = (u64) ref_clockid.tv_sec * NSEC_PER_SEC +
2020 	      (u64) ref_clockid.tv_nsec;
2021 
2022 	session->header.env.clock.clockid_ns = ref;
2023 	return 0;
2024 }
2025 
2026 static void hit_auxtrace_snapshot_trigger(struct record *rec)
2027 {
2028 	if (trigger_is_ready(&auxtrace_snapshot_trigger)) {
2029 		trigger_hit(&auxtrace_snapshot_trigger);
2030 		auxtrace_record__snapshot_started = 1;
2031 		if (auxtrace_record__snapshot_start(rec->itr))
2032 			trigger_error(&auxtrace_snapshot_trigger);
2033 	}
2034 }
2035 
2036 static void record__uniquify_name(struct record *rec)
2037 {
2038 	struct evsel *pos;
2039 	struct evlist *evlist = rec->evlist;
2040 	char *new_name;
2041 	int ret;
2042 
2043 	if (!perf_pmu__has_hybrid())
2044 		return;
2045 
2046 	evlist__for_each_entry(evlist, pos) {
2047 		if (!evsel__is_hybrid(pos))
2048 			continue;
2049 
2050 		if (strchr(pos->name, '/'))
2051 			continue;
2052 
2053 		ret = asprintf(&new_name, "%s/%s/",
2054 			       pos->pmu_name, pos->name);
2055 		if (ret) {
2056 			free(pos->name);
2057 			pos->name = new_name;
2058 		}
2059 	}
2060 }
2061 
2062 static int record__terminate_thread(struct record_thread *thread_data)
2063 {
2064 	int err;
2065 	enum thread_msg ack = THREAD_MSG__UNDEFINED;
2066 	pid_t tid = thread_data->tid;
2067 
2068 	close(thread_data->pipes.msg[1]);
2069 	thread_data->pipes.msg[1] = -1;
2070 	err = read(thread_data->pipes.ack[0], &ack, sizeof(ack));
2071 	if (err > 0)
2072 		pr_debug2("threads[%d]: sent %s\n", tid, thread_msg_tags[ack]);
2073 	else
2074 		pr_warning("threads[%d]: failed to receive termination notification from %d\n",
2075 			   thread->tid, tid);
2076 
2077 	return 0;
2078 }
2079 
2080 static int record__start_threads(struct record *rec)
2081 {
2082 	int t, tt, err, ret = 0, nr_threads = rec->nr_threads;
2083 	struct record_thread *thread_data = rec->thread_data;
2084 	sigset_t full, mask;
2085 	pthread_t handle;
2086 	pthread_attr_t attrs;
2087 
2088 	thread = &thread_data[0];
2089 
2090 	if (!record__threads_enabled(rec))
2091 		return 0;
2092 
2093 	sigfillset(&full);
2094 	if (sigprocmask(SIG_SETMASK, &full, &mask)) {
2095 		pr_err("Failed to block signals on threads start: %s\n", strerror(errno));
2096 		return -1;
2097 	}
2098 
2099 	pthread_attr_init(&attrs);
2100 	pthread_attr_setdetachstate(&attrs, PTHREAD_CREATE_DETACHED);
2101 
2102 	for (t = 1; t < nr_threads; t++) {
2103 		enum thread_msg msg = THREAD_MSG__UNDEFINED;
2104 
2105 #ifdef HAVE_PTHREAD_ATTR_SETAFFINITY_NP
2106 		pthread_attr_setaffinity_np(&attrs,
2107 					    MMAP_CPU_MASK_BYTES(&(thread_data[t].mask->affinity)),
2108 					    (cpu_set_t *)(thread_data[t].mask->affinity.bits));
2109 #endif
2110 		if (pthread_create(&handle, &attrs, record__thread, &thread_data[t])) {
2111 			for (tt = 1; tt < t; tt++)
2112 				record__terminate_thread(&thread_data[t]);
2113 			pr_err("Failed to start threads: %s\n", strerror(errno));
2114 			ret = -1;
2115 			goto out_err;
2116 		}
2117 
2118 		err = read(thread_data[t].pipes.ack[0], &msg, sizeof(msg));
2119 		if (err > 0)
2120 			pr_debug2("threads[%d]: sent %s\n", rec->thread_data[t].tid,
2121 				  thread_msg_tags[msg]);
2122 		else
2123 			pr_warning("threads[%d]: failed to receive start notification from %d\n",
2124 				   thread->tid, rec->thread_data[t].tid);
2125 	}
2126 
2127 	sched_setaffinity(0, MMAP_CPU_MASK_BYTES(&thread->mask->affinity),
2128 			(cpu_set_t *)thread->mask->affinity.bits);
2129 
2130 	pr_debug("threads[%d]: started on cpu%d\n", thread->tid, sched_getcpu());
2131 
2132 out_err:
2133 	pthread_attr_destroy(&attrs);
2134 
2135 	if (sigprocmask(SIG_SETMASK, &mask, NULL)) {
2136 		pr_err("Failed to unblock signals on threads start: %s\n", strerror(errno));
2137 		ret = -1;
2138 	}
2139 
2140 	return ret;
2141 }
2142 
2143 static int record__stop_threads(struct record *rec)
2144 {
2145 	int t;
2146 	struct record_thread *thread_data = rec->thread_data;
2147 
2148 	for (t = 1; t < rec->nr_threads; t++)
2149 		record__terminate_thread(&thread_data[t]);
2150 
2151 	for (t = 0; t < rec->nr_threads; t++) {
2152 		rec->samples += thread_data[t].samples;
2153 		if (!record__threads_enabled(rec))
2154 			continue;
2155 		rec->session->bytes_transferred += thread_data[t].bytes_transferred;
2156 		rec->session->bytes_compressed += thread_data[t].bytes_compressed;
2157 		pr_debug("threads[%d]: samples=%lld, wakes=%ld, ", thread_data[t].tid,
2158 			 thread_data[t].samples, thread_data[t].waking);
2159 		if (thread_data[t].bytes_transferred && thread_data[t].bytes_compressed)
2160 			pr_debug("transferred=%" PRIu64 ", compressed=%" PRIu64 "\n",
2161 				 thread_data[t].bytes_transferred, thread_data[t].bytes_compressed);
2162 		else
2163 			pr_debug("written=%" PRIu64 "\n", thread_data[t].bytes_written);
2164 	}
2165 
2166 	return 0;
2167 }
2168 
2169 static unsigned long record__waking(struct record *rec)
2170 {
2171 	int t;
2172 	unsigned long waking = 0;
2173 	struct record_thread *thread_data = rec->thread_data;
2174 
2175 	for (t = 0; t < rec->nr_threads; t++)
2176 		waking += thread_data[t].waking;
2177 
2178 	return waking;
2179 }
2180 
2181 static int __cmd_record(struct record *rec, int argc, const char **argv)
2182 {
2183 	int err;
2184 	int status = 0;
2185 	const bool forks = argc > 0;
2186 	struct perf_tool *tool = &rec->tool;
2187 	struct record_opts *opts = &rec->opts;
2188 	struct perf_data *data = &rec->data;
2189 	struct perf_session *session;
2190 	bool disabled = false, draining = false;
2191 	int fd;
2192 	float ratio = 0;
2193 	enum evlist_ctl_cmd cmd = EVLIST_CTL_CMD_UNSUPPORTED;
2194 
2195 	atexit(record__sig_exit);
2196 	signal(SIGCHLD, sig_handler);
2197 	signal(SIGINT, sig_handler);
2198 	signal(SIGTERM, sig_handler);
2199 	signal(SIGSEGV, sigsegv_handler);
2200 
2201 	if (rec->opts.record_namespaces)
2202 		tool->namespace_events = true;
2203 
2204 	if (rec->opts.record_cgroup) {
2205 #ifdef HAVE_FILE_HANDLE
2206 		tool->cgroup_events = true;
2207 #else
2208 		pr_err("cgroup tracking is not supported\n");
2209 		return -1;
2210 #endif
2211 	}
2212 
2213 	if (rec->opts.auxtrace_snapshot_mode || rec->switch_output.enabled) {
2214 		signal(SIGUSR2, snapshot_sig_handler);
2215 		if (rec->opts.auxtrace_snapshot_mode)
2216 			trigger_on(&auxtrace_snapshot_trigger);
2217 		if (rec->switch_output.enabled)
2218 			trigger_on(&switch_output_trigger);
2219 	} else {
2220 		signal(SIGUSR2, SIG_IGN);
2221 	}
2222 
2223 	session = perf_session__new(data, tool);
2224 	if (IS_ERR(session)) {
2225 		pr_err("Perf session creation failed.\n");
2226 		return PTR_ERR(session);
2227 	}
2228 
2229 	if (record__threads_enabled(rec)) {
2230 		if (perf_data__is_pipe(&rec->data)) {
2231 			pr_err("Parallel trace streaming is not available in pipe mode.\n");
2232 			return -1;
2233 		}
2234 		if (rec->opts.full_auxtrace) {
2235 			pr_err("Parallel trace streaming is not available in AUX area tracing mode.\n");
2236 			return -1;
2237 		}
2238 	}
2239 
2240 	fd = perf_data__fd(data);
2241 	rec->session = session;
2242 
2243 	if (zstd_init(&session->zstd_data, rec->opts.comp_level) < 0) {
2244 		pr_err("Compression initialization failed.\n");
2245 		return -1;
2246 	}
2247 #ifdef HAVE_EVENTFD_SUPPORT
2248 	done_fd = eventfd(0, EFD_NONBLOCK);
2249 	if (done_fd < 0) {
2250 		pr_err("Failed to create wakeup eventfd, error: %m\n");
2251 		status = -1;
2252 		goto out_delete_session;
2253 	}
2254 	err = evlist__add_wakeup_eventfd(rec->evlist, done_fd);
2255 	if (err < 0) {
2256 		pr_err("Failed to add wakeup eventfd to poll list\n");
2257 		status = err;
2258 		goto out_delete_session;
2259 	}
2260 #endif // HAVE_EVENTFD_SUPPORT
2261 
2262 	session->header.env.comp_type  = PERF_COMP_ZSTD;
2263 	session->header.env.comp_level = rec->opts.comp_level;
2264 
2265 	if (rec->opts.kcore &&
2266 	    !record__kcore_readable(&session->machines.host)) {
2267 		pr_err("ERROR: kcore is not readable.\n");
2268 		return -1;
2269 	}
2270 
2271 	if (record__init_clock(rec))
2272 		return -1;
2273 
2274 	record__init_features(rec);
2275 
2276 	if (forks) {
2277 		err = evlist__prepare_workload(rec->evlist, &opts->target, argv, data->is_pipe,
2278 					       workload_exec_failed_signal);
2279 		if (err < 0) {
2280 			pr_err("Couldn't run the workload!\n");
2281 			status = err;
2282 			goto out_delete_session;
2283 		}
2284 	}
2285 
2286 	/*
2287 	 * If we have just single event and are sending data
2288 	 * through pipe, we need to force the ids allocation,
2289 	 * because we synthesize event name through the pipe
2290 	 * and need the id for that.
2291 	 */
2292 	if (data->is_pipe && rec->evlist->core.nr_entries == 1)
2293 		rec->opts.sample_id = true;
2294 
2295 	record__uniquify_name(rec);
2296 
2297 	if (record__open(rec) != 0) {
2298 		err = -1;
2299 		goto out_free_threads;
2300 	}
2301 	session->header.env.comp_mmap_len = session->evlist->core.mmap_len;
2302 
2303 	if (rec->opts.kcore) {
2304 		err = record__kcore_copy(&session->machines.host, data);
2305 		if (err) {
2306 			pr_err("ERROR: Failed to copy kcore\n");
2307 			goto out_free_threads;
2308 		}
2309 	}
2310 
2311 	err = bpf__apply_obj_config();
2312 	if (err) {
2313 		char errbuf[BUFSIZ];
2314 
2315 		bpf__strerror_apply_obj_config(err, errbuf, sizeof(errbuf));
2316 		pr_err("ERROR: Apply config to BPF failed: %s\n",
2317 			 errbuf);
2318 		goto out_free_threads;
2319 	}
2320 
2321 	/*
2322 	 * Normally perf_session__new would do this, but it doesn't have the
2323 	 * evlist.
2324 	 */
2325 	if (rec->tool.ordered_events && !evlist__sample_id_all(rec->evlist)) {
2326 		pr_warning("WARNING: No sample_id_all support, falling back to unordered processing\n");
2327 		rec->tool.ordered_events = false;
2328 	}
2329 
2330 	if (!rec->evlist->core.nr_groups)
2331 		perf_header__clear_feat(&session->header, HEADER_GROUP_DESC);
2332 
2333 	if (data->is_pipe) {
2334 		err = perf_header__write_pipe(fd);
2335 		if (err < 0)
2336 			goto out_free_threads;
2337 	} else {
2338 		err = perf_session__write_header(session, rec->evlist, fd, false);
2339 		if (err < 0)
2340 			goto out_free_threads;
2341 	}
2342 
2343 	err = -1;
2344 	if (!rec->no_buildid
2345 	    && !perf_header__has_feat(&session->header, HEADER_BUILD_ID)) {
2346 		pr_err("Couldn't generate buildids. "
2347 		       "Use --no-buildid to profile anyway.\n");
2348 		goto out_free_threads;
2349 	}
2350 
2351 	err = record__setup_sb_evlist(rec);
2352 	if (err)
2353 		goto out_free_threads;
2354 
2355 	err = record__synthesize(rec, false);
2356 	if (err < 0)
2357 		goto out_free_threads;
2358 
2359 	if (rec->realtime_prio) {
2360 		struct sched_param param;
2361 
2362 		param.sched_priority = rec->realtime_prio;
2363 		if (sched_setscheduler(0, SCHED_FIFO, &param)) {
2364 			pr_err("Could not set realtime priority.\n");
2365 			err = -1;
2366 			goto out_free_threads;
2367 		}
2368 	}
2369 
2370 	if (record__start_threads(rec))
2371 		goto out_free_threads;
2372 
2373 	/*
2374 	 * When perf is starting the traced process, all the events
2375 	 * (apart from group members) have enable_on_exec=1 set,
2376 	 * so don't spoil it by prematurely enabling them.
2377 	 */
2378 	if (!target__none(&opts->target) && !opts->initial_delay)
2379 		evlist__enable(rec->evlist);
2380 
2381 	/*
2382 	 * Let the child rip
2383 	 */
2384 	if (forks) {
2385 		struct machine *machine = &session->machines.host;
2386 		union perf_event *event;
2387 		pid_t tgid;
2388 
2389 		event = malloc(sizeof(event->comm) + machine->id_hdr_size);
2390 		if (event == NULL) {
2391 			err = -ENOMEM;
2392 			goto out_child;
2393 		}
2394 
2395 		/*
2396 		 * Some H/W events are generated before COMM event
2397 		 * which is emitted during exec(), so perf script
2398 		 * cannot see a correct process name for those events.
2399 		 * Synthesize COMM event to prevent it.
2400 		 */
2401 		tgid = perf_event__synthesize_comm(tool, event,
2402 						   rec->evlist->workload.pid,
2403 						   process_synthesized_event,
2404 						   machine);
2405 		free(event);
2406 
2407 		if (tgid == -1)
2408 			goto out_child;
2409 
2410 		event = malloc(sizeof(event->namespaces) +
2411 			       (NR_NAMESPACES * sizeof(struct perf_ns_link_info)) +
2412 			       machine->id_hdr_size);
2413 		if (event == NULL) {
2414 			err = -ENOMEM;
2415 			goto out_child;
2416 		}
2417 
2418 		/*
2419 		 * Synthesize NAMESPACES event for the command specified.
2420 		 */
2421 		perf_event__synthesize_namespaces(tool, event,
2422 						  rec->evlist->workload.pid,
2423 						  tgid, process_synthesized_event,
2424 						  machine);
2425 		free(event);
2426 
2427 		evlist__start_workload(rec->evlist);
2428 	}
2429 
2430 	if (opts->initial_delay) {
2431 		pr_info(EVLIST_DISABLED_MSG);
2432 		if (opts->initial_delay > 0) {
2433 			usleep(opts->initial_delay * USEC_PER_MSEC);
2434 			evlist__enable(rec->evlist);
2435 			pr_info(EVLIST_ENABLED_MSG);
2436 		}
2437 	}
2438 
2439 	trigger_ready(&auxtrace_snapshot_trigger);
2440 	trigger_ready(&switch_output_trigger);
2441 	perf_hooks__invoke_record_start();
2442 
2443 	/*
2444 	 * Must write FINISHED_INIT so it will be seen after all other
2445 	 * synthesized user events, but before any regular events.
2446 	 */
2447 	err = write_finished_init(rec, false);
2448 	if (err < 0)
2449 		goto out_child;
2450 
2451 	for (;;) {
2452 		unsigned long long hits = thread->samples;
2453 
2454 		/*
2455 		 * rec->evlist->bkw_mmap_state is possible to be
2456 		 * BKW_MMAP_EMPTY here: when done == true and
2457 		 * hits != rec->samples in previous round.
2458 		 *
2459 		 * evlist__toggle_bkw_mmap ensure we never
2460 		 * convert BKW_MMAP_EMPTY to BKW_MMAP_DATA_PENDING.
2461 		 */
2462 		if (trigger_is_hit(&switch_output_trigger) || done || draining)
2463 			evlist__toggle_bkw_mmap(rec->evlist, BKW_MMAP_DATA_PENDING);
2464 
2465 		if (record__mmap_read_all(rec, false) < 0) {
2466 			trigger_error(&auxtrace_snapshot_trigger);
2467 			trigger_error(&switch_output_trigger);
2468 			err = -1;
2469 			goto out_child;
2470 		}
2471 
2472 		if (auxtrace_record__snapshot_started) {
2473 			auxtrace_record__snapshot_started = 0;
2474 			if (!trigger_is_error(&auxtrace_snapshot_trigger))
2475 				record__read_auxtrace_snapshot(rec, false);
2476 			if (trigger_is_error(&auxtrace_snapshot_trigger)) {
2477 				pr_err("AUX area tracing snapshot failed\n");
2478 				err = -1;
2479 				goto out_child;
2480 			}
2481 		}
2482 
2483 		if (trigger_is_hit(&switch_output_trigger)) {
2484 			/*
2485 			 * If switch_output_trigger is hit, the data in
2486 			 * overwritable ring buffer should have been collected,
2487 			 * so bkw_mmap_state should be set to BKW_MMAP_EMPTY.
2488 			 *
2489 			 * If SIGUSR2 raise after or during record__mmap_read_all(),
2490 			 * record__mmap_read_all() didn't collect data from
2491 			 * overwritable ring buffer. Read again.
2492 			 */
2493 			if (rec->evlist->bkw_mmap_state == BKW_MMAP_RUNNING)
2494 				continue;
2495 			trigger_ready(&switch_output_trigger);
2496 
2497 			/*
2498 			 * Reenable events in overwrite ring buffer after
2499 			 * record__mmap_read_all(): we should have collected
2500 			 * data from it.
2501 			 */
2502 			evlist__toggle_bkw_mmap(rec->evlist, BKW_MMAP_RUNNING);
2503 
2504 			if (!quiet)
2505 				fprintf(stderr, "[ perf record: dump data: Woken up %ld times ]\n",
2506 					record__waking(rec));
2507 			thread->waking = 0;
2508 			fd = record__switch_output(rec, false);
2509 			if (fd < 0) {
2510 				pr_err("Failed to switch to new file\n");
2511 				trigger_error(&switch_output_trigger);
2512 				err = fd;
2513 				goto out_child;
2514 			}
2515 
2516 			/* re-arm the alarm */
2517 			if (rec->switch_output.time)
2518 				alarm(rec->switch_output.time);
2519 		}
2520 
2521 		if (hits == thread->samples) {
2522 			if (done || draining)
2523 				break;
2524 			err = fdarray__poll(&thread->pollfd, -1);
2525 			/*
2526 			 * Propagate error, only if there's any. Ignore positive
2527 			 * number of returned events and interrupt error.
2528 			 */
2529 			if (err > 0 || (err < 0 && errno == EINTR))
2530 				err = 0;
2531 			thread->waking++;
2532 
2533 			if (fdarray__filter(&thread->pollfd, POLLERR | POLLHUP,
2534 					    record__thread_munmap_filtered, NULL) == 0)
2535 				draining = true;
2536 
2537 			evlist__ctlfd_update(rec->evlist,
2538 				&thread->pollfd.entries[thread->ctlfd_pos]);
2539 		}
2540 
2541 		if (evlist__ctlfd_process(rec->evlist, &cmd) > 0) {
2542 			switch (cmd) {
2543 			case EVLIST_CTL_CMD_SNAPSHOT:
2544 				hit_auxtrace_snapshot_trigger(rec);
2545 				evlist__ctlfd_ack(rec->evlist);
2546 				break;
2547 			case EVLIST_CTL_CMD_STOP:
2548 				done = 1;
2549 				break;
2550 			case EVLIST_CTL_CMD_ACK:
2551 			case EVLIST_CTL_CMD_UNSUPPORTED:
2552 			case EVLIST_CTL_CMD_ENABLE:
2553 			case EVLIST_CTL_CMD_DISABLE:
2554 			case EVLIST_CTL_CMD_EVLIST:
2555 			case EVLIST_CTL_CMD_PING:
2556 			default:
2557 				break;
2558 			}
2559 		}
2560 
2561 		/*
2562 		 * When perf is starting the traced process, at the end events
2563 		 * die with the process and we wait for that. Thus no need to
2564 		 * disable events in this case.
2565 		 */
2566 		if (done && !disabled && !target__none(&opts->target)) {
2567 			trigger_off(&auxtrace_snapshot_trigger);
2568 			evlist__disable(rec->evlist);
2569 			disabled = true;
2570 		}
2571 	}
2572 
2573 	trigger_off(&auxtrace_snapshot_trigger);
2574 	trigger_off(&switch_output_trigger);
2575 
2576 	if (opts->auxtrace_snapshot_on_exit)
2577 		record__auxtrace_snapshot_exit(rec);
2578 
2579 	if (forks && workload_exec_errno) {
2580 		char msg[STRERR_BUFSIZE], strevsels[2048];
2581 		const char *emsg = str_error_r(workload_exec_errno, msg, sizeof(msg));
2582 
2583 		evlist__scnprintf_evsels(rec->evlist, sizeof(strevsels), strevsels);
2584 
2585 		pr_err("Failed to collect '%s' for the '%s' workload: %s\n",
2586 			strevsels, argv[0], emsg);
2587 		err = -1;
2588 		goto out_child;
2589 	}
2590 
2591 	if (!quiet)
2592 		fprintf(stderr, "[ perf record: Woken up %ld times to write data ]\n",
2593 			record__waking(rec));
2594 
2595 	write_finished_init(rec, true);
2596 
2597 	if (target__none(&rec->opts.target))
2598 		record__synthesize_workload(rec, true);
2599 
2600 out_child:
2601 	record__stop_threads(rec);
2602 	record__mmap_read_all(rec, true);
2603 out_free_threads:
2604 	record__free_thread_data(rec);
2605 	evlist__finalize_ctlfd(rec->evlist);
2606 	record__aio_mmap_read_sync(rec);
2607 
2608 	if (rec->session->bytes_transferred && rec->session->bytes_compressed) {
2609 		ratio = (float)rec->session->bytes_transferred/(float)rec->session->bytes_compressed;
2610 		session->header.env.comp_ratio = ratio + 0.5;
2611 	}
2612 
2613 	if (forks) {
2614 		int exit_status;
2615 
2616 		if (!child_finished)
2617 			kill(rec->evlist->workload.pid, SIGTERM);
2618 
2619 		wait(&exit_status);
2620 
2621 		if (err < 0)
2622 			status = err;
2623 		else if (WIFEXITED(exit_status))
2624 			status = WEXITSTATUS(exit_status);
2625 		else if (WIFSIGNALED(exit_status))
2626 			signr = WTERMSIG(exit_status);
2627 	} else
2628 		status = err;
2629 
2630 	if (rec->off_cpu)
2631 		rec->bytes_written += off_cpu_write(rec->session);
2632 
2633 	record__synthesize(rec, true);
2634 	/* this will be recalculated during process_buildids() */
2635 	rec->samples = 0;
2636 
2637 	if (!err) {
2638 		if (!rec->timestamp_filename) {
2639 			record__finish_output(rec);
2640 		} else {
2641 			fd = record__switch_output(rec, true);
2642 			if (fd < 0) {
2643 				status = fd;
2644 				goto out_delete_session;
2645 			}
2646 		}
2647 	}
2648 
2649 	perf_hooks__invoke_record_end();
2650 
2651 	if (!err && !quiet) {
2652 		char samples[128];
2653 		const char *postfix = rec->timestamp_filename ?
2654 					".<timestamp>" : "";
2655 
2656 		if (rec->samples && !rec->opts.full_auxtrace)
2657 			scnprintf(samples, sizeof(samples),
2658 				  " (%" PRIu64 " samples)", rec->samples);
2659 		else
2660 			samples[0] = '\0';
2661 
2662 		fprintf(stderr,	"[ perf record: Captured and wrote %.3f MB %s%s%s",
2663 			perf_data__size(data) / 1024.0 / 1024.0,
2664 			data->path, postfix, samples);
2665 		if (ratio) {
2666 			fprintf(stderr,	", compressed (original %.3f MB, ratio is %.3f)",
2667 					rec->session->bytes_transferred / 1024.0 / 1024.0,
2668 					ratio);
2669 		}
2670 		fprintf(stderr, " ]\n");
2671 	}
2672 
2673 out_delete_session:
2674 #ifdef HAVE_EVENTFD_SUPPORT
2675 	if (done_fd >= 0)
2676 		close(done_fd);
2677 #endif
2678 	zstd_fini(&session->zstd_data);
2679 	perf_session__delete(session);
2680 
2681 	if (!opts->no_bpf_event)
2682 		evlist__stop_sb_thread(rec->sb_evlist);
2683 	return status;
2684 }
2685 
2686 static void callchain_debug(struct callchain_param *callchain)
2687 {
2688 	static const char *str[CALLCHAIN_MAX] = { "NONE", "FP", "DWARF", "LBR" };
2689 
2690 	pr_debug("callchain: type %s\n", str[callchain->record_mode]);
2691 
2692 	if (callchain->record_mode == CALLCHAIN_DWARF)
2693 		pr_debug("callchain: stack dump size %d\n",
2694 			 callchain->dump_size);
2695 }
2696 
2697 int record_opts__parse_callchain(struct record_opts *record,
2698 				 struct callchain_param *callchain,
2699 				 const char *arg, bool unset)
2700 {
2701 	int ret;
2702 	callchain->enabled = !unset;
2703 
2704 	/* --no-call-graph */
2705 	if (unset) {
2706 		callchain->record_mode = CALLCHAIN_NONE;
2707 		pr_debug("callchain: disabled\n");
2708 		return 0;
2709 	}
2710 
2711 	ret = parse_callchain_record_opt(arg, callchain);
2712 	if (!ret) {
2713 		/* Enable data address sampling for DWARF unwind. */
2714 		if (callchain->record_mode == CALLCHAIN_DWARF)
2715 			record->sample_address = true;
2716 		callchain_debug(callchain);
2717 	}
2718 
2719 	return ret;
2720 }
2721 
2722 int record_parse_callchain_opt(const struct option *opt,
2723 			       const char *arg,
2724 			       int unset)
2725 {
2726 	return record_opts__parse_callchain(opt->value, &callchain_param, arg, unset);
2727 }
2728 
2729 int record_callchain_opt(const struct option *opt,
2730 			 const char *arg __maybe_unused,
2731 			 int unset __maybe_unused)
2732 {
2733 	struct callchain_param *callchain = opt->value;
2734 
2735 	callchain->enabled = true;
2736 
2737 	if (callchain->record_mode == CALLCHAIN_NONE)
2738 		callchain->record_mode = CALLCHAIN_FP;
2739 
2740 	callchain_debug(callchain);
2741 	return 0;
2742 }
2743 
2744 static int perf_record_config(const char *var, const char *value, void *cb)
2745 {
2746 	struct record *rec = cb;
2747 
2748 	if (!strcmp(var, "record.build-id")) {
2749 		if (!strcmp(value, "cache"))
2750 			rec->no_buildid_cache = false;
2751 		else if (!strcmp(value, "no-cache"))
2752 			rec->no_buildid_cache = true;
2753 		else if (!strcmp(value, "skip"))
2754 			rec->no_buildid = true;
2755 		else if (!strcmp(value, "mmap"))
2756 			rec->buildid_mmap = true;
2757 		else
2758 			return -1;
2759 		return 0;
2760 	}
2761 	if (!strcmp(var, "record.call-graph")) {
2762 		var = "call-graph.record-mode";
2763 		return perf_default_config(var, value, cb);
2764 	}
2765 #ifdef HAVE_AIO_SUPPORT
2766 	if (!strcmp(var, "record.aio")) {
2767 		rec->opts.nr_cblocks = strtol(value, NULL, 0);
2768 		if (!rec->opts.nr_cblocks)
2769 			rec->opts.nr_cblocks = nr_cblocks_default;
2770 	}
2771 #endif
2772 	if (!strcmp(var, "record.debuginfod")) {
2773 		rec->debuginfod.urls = strdup(value);
2774 		if (!rec->debuginfod.urls)
2775 			return -ENOMEM;
2776 		rec->debuginfod.set = true;
2777 	}
2778 
2779 	return 0;
2780 }
2781 
2782 
2783 static int record__parse_affinity(const struct option *opt, const char *str, int unset)
2784 {
2785 	struct record_opts *opts = (struct record_opts *)opt->value;
2786 
2787 	if (unset || !str)
2788 		return 0;
2789 
2790 	if (!strcasecmp(str, "node"))
2791 		opts->affinity = PERF_AFFINITY_NODE;
2792 	else if (!strcasecmp(str, "cpu"))
2793 		opts->affinity = PERF_AFFINITY_CPU;
2794 
2795 	return 0;
2796 }
2797 
2798 static int record__mmap_cpu_mask_alloc(struct mmap_cpu_mask *mask, int nr_bits)
2799 {
2800 	mask->nbits = nr_bits;
2801 	mask->bits = bitmap_zalloc(mask->nbits);
2802 	if (!mask->bits)
2803 		return -ENOMEM;
2804 
2805 	return 0;
2806 }
2807 
2808 static void record__mmap_cpu_mask_free(struct mmap_cpu_mask *mask)
2809 {
2810 	bitmap_free(mask->bits);
2811 	mask->nbits = 0;
2812 }
2813 
2814 static int record__thread_mask_alloc(struct thread_mask *mask, int nr_bits)
2815 {
2816 	int ret;
2817 
2818 	ret = record__mmap_cpu_mask_alloc(&mask->maps, nr_bits);
2819 	if (ret) {
2820 		mask->affinity.bits = NULL;
2821 		return ret;
2822 	}
2823 
2824 	ret = record__mmap_cpu_mask_alloc(&mask->affinity, nr_bits);
2825 	if (ret) {
2826 		record__mmap_cpu_mask_free(&mask->maps);
2827 		mask->maps.bits = NULL;
2828 	}
2829 
2830 	return ret;
2831 }
2832 
2833 static void record__thread_mask_free(struct thread_mask *mask)
2834 {
2835 	record__mmap_cpu_mask_free(&mask->maps);
2836 	record__mmap_cpu_mask_free(&mask->affinity);
2837 }
2838 
2839 static int record__parse_threads(const struct option *opt, const char *str, int unset)
2840 {
2841 	int s;
2842 	struct record_opts *opts = opt->value;
2843 
2844 	if (unset || !str || !strlen(str)) {
2845 		opts->threads_spec = THREAD_SPEC__CPU;
2846 	} else {
2847 		for (s = 1; s < THREAD_SPEC__MAX; s++) {
2848 			if (s == THREAD_SPEC__USER) {
2849 				opts->threads_user_spec = strdup(str);
2850 				if (!opts->threads_user_spec)
2851 					return -ENOMEM;
2852 				opts->threads_spec = THREAD_SPEC__USER;
2853 				break;
2854 			}
2855 			if (!strncasecmp(str, thread_spec_tags[s], strlen(thread_spec_tags[s]))) {
2856 				opts->threads_spec = s;
2857 				break;
2858 			}
2859 		}
2860 	}
2861 
2862 	if (opts->threads_spec == THREAD_SPEC__USER)
2863 		pr_debug("threads_spec: %s\n", opts->threads_user_spec);
2864 	else
2865 		pr_debug("threads_spec: %s\n", thread_spec_tags[opts->threads_spec]);
2866 
2867 	return 0;
2868 }
2869 
2870 static int parse_output_max_size(const struct option *opt,
2871 				 const char *str, int unset)
2872 {
2873 	unsigned long *s = (unsigned long *)opt->value;
2874 	static struct parse_tag tags_size[] = {
2875 		{ .tag  = 'B', .mult = 1       },
2876 		{ .tag  = 'K', .mult = 1 << 10 },
2877 		{ .tag  = 'M', .mult = 1 << 20 },
2878 		{ .tag  = 'G', .mult = 1 << 30 },
2879 		{ .tag  = 0 },
2880 	};
2881 	unsigned long val;
2882 
2883 	if (unset) {
2884 		*s = 0;
2885 		return 0;
2886 	}
2887 
2888 	val = parse_tag_value(str, tags_size);
2889 	if (val != (unsigned long) -1) {
2890 		*s = val;
2891 		return 0;
2892 	}
2893 
2894 	return -1;
2895 }
2896 
2897 static int record__parse_mmap_pages(const struct option *opt,
2898 				    const char *str,
2899 				    int unset __maybe_unused)
2900 {
2901 	struct record_opts *opts = opt->value;
2902 	char *s, *p;
2903 	unsigned int mmap_pages;
2904 	int ret;
2905 
2906 	if (!str)
2907 		return -EINVAL;
2908 
2909 	s = strdup(str);
2910 	if (!s)
2911 		return -ENOMEM;
2912 
2913 	p = strchr(s, ',');
2914 	if (p)
2915 		*p = '\0';
2916 
2917 	if (*s) {
2918 		ret = __evlist__parse_mmap_pages(&mmap_pages, s);
2919 		if (ret)
2920 			goto out_free;
2921 		opts->mmap_pages = mmap_pages;
2922 	}
2923 
2924 	if (!p) {
2925 		ret = 0;
2926 		goto out_free;
2927 	}
2928 
2929 	ret = __evlist__parse_mmap_pages(&mmap_pages, p + 1);
2930 	if (ret)
2931 		goto out_free;
2932 
2933 	opts->auxtrace_mmap_pages = mmap_pages;
2934 
2935 out_free:
2936 	free(s);
2937 	return ret;
2938 }
2939 
2940 void __weak arch__add_leaf_frame_record_opts(struct record_opts *opts __maybe_unused)
2941 {
2942 }
2943 
2944 static int parse_control_option(const struct option *opt,
2945 				const char *str,
2946 				int unset __maybe_unused)
2947 {
2948 	struct record_opts *opts = opt->value;
2949 
2950 	return evlist__parse_control(str, &opts->ctl_fd, &opts->ctl_fd_ack, &opts->ctl_fd_close);
2951 }
2952 
2953 static void switch_output_size_warn(struct record *rec)
2954 {
2955 	u64 wakeup_size = evlist__mmap_size(rec->opts.mmap_pages);
2956 	struct switch_output *s = &rec->switch_output;
2957 
2958 	wakeup_size /= 2;
2959 
2960 	if (s->size < wakeup_size) {
2961 		char buf[100];
2962 
2963 		unit_number__scnprintf(buf, sizeof(buf), wakeup_size);
2964 		pr_warning("WARNING: switch-output data size lower than "
2965 			   "wakeup kernel buffer size (%s) "
2966 			   "expect bigger perf.data sizes\n", buf);
2967 	}
2968 }
2969 
2970 static int switch_output_setup(struct record *rec)
2971 {
2972 	struct switch_output *s = &rec->switch_output;
2973 	static struct parse_tag tags_size[] = {
2974 		{ .tag  = 'B', .mult = 1       },
2975 		{ .tag  = 'K', .mult = 1 << 10 },
2976 		{ .tag  = 'M', .mult = 1 << 20 },
2977 		{ .tag  = 'G', .mult = 1 << 30 },
2978 		{ .tag  = 0 },
2979 	};
2980 	static struct parse_tag tags_time[] = {
2981 		{ .tag  = 's', .mult = 1        },
2982 		{ .tag  = 'm', .mult = 60       },
2983 		{ .tag  = 'h', .mult = 60*60    },
2984 		{ .tag  = 'd', .mult = 60*60*24 },
2985 		{ .tag  = 0 },
2986 	};
2987 	unsigned long val;
2988 
2989 	/*
2990 	 * If we're using --switch-output-events, then we imply its
2991 	 * --switch-output=signal, as we'll send a SIGUSR2 from the side band
2992 	 *  thread to its parent.
2993 	 */
2994 	if (rec->switch_output_event_set) {
2995 		if (record__threads_enabled(rec)) {
2996 			pr_warning("WARNING: --switch-output-event option is not available in parallel streaming mode.\n");
2997 			return 0;
2998 		}
2999 		goto do_signal;
3000 	}
3001 
3002 	if (!s->set)
3003 		return 0;
3004 
3005 	if (record__threads_enabled(rec)) {
3006 		pr_warning("WARNING: --switch-output option is not available in parallel streaming mode.\n");
3007 		return 0;
3008 	}
3009 
3010 	if (!strcmp(s->str, "signal")) {
3011 do_signal:
3012 		s->signal = true;
3013 		pr_debug("switch-output with SIGUSR2 signal\n");
3014 		goto enabled;
3015 	}
3016 
3017 	val = parse_tag_value(s->str, tags_size);
3018 	if (val != (unsigned long) -1) {
3019 		s->size = val;
3020 		pr_debug("switch-output with %s size threshold\n", s->str);
3021 		goto enabled;
3022 	}
3023 
3024 	val = parse_tag_value(s->str, tags_time);
3025 	if (val != (unsigned long) -1) {
3026 		s->time = val;
3027 		pr_debug("switch-output with %s time threshold (%lu seconds)\n",
3028 			 s->str, s->time);
3029 		goto enabled;
3030 	}
3031 
3032 	return -1;
3033 
3034 enabled:
3035 	rec->timestamp_filename = true;
3036 	s->enabled              = true;
3037 
3038 	if (s->size && !rec->opts.no_buffering)
3039 		switch_output_size_warn(rec);
3040 
3041 	return 0;
3042 }
3043 
3044 static const char * const __record_usage[] = {
3045 	"perf record [<options>] [<command>]",
3046 	"perf record [<options>] -- <command> [<options>]",
3047 	NULL
3048 };
3049 const char * const *record_usage = __record_usage;
3050 
3051 static int build_id__process_mmap(struct perf_tool *tool, union perf_event *event,
3052 				  struct perf_sample *sample, struct machine *machine)
3053 {
3054 	/*
3055 	 * We already have the kernel maps, put in place via perf_session__create_kernel_maps()
3056 	 * no need to add them twice.
3057 	 */
3058 	if (!(event->header.misc & PERF_RECORD_MISC_USER))
3059 		return 0;
3060 	return perf_event__process_mmap(tool, event, sample, machine);
3061 }
3062 
3063 static int build_id__process_mmap2(struct perf_tool *tool, union perf_event *event,
3064 				   struct perf_sample *sample, struct machine *machine)
3065 {
3066 	/*
3067 	 * We already have the kernel maps, put in place via perf_session__create_kernel_maps()
3068 	 * no need to add them twice.
3069 	 */
3070 	if (!(event->header.misc & PERF_RECORD_MISC_USER))
3071 		return 0;
3072 
3073 	return perf_event__process_mmap2(tool, event, sample, machine);
3074 }
3075 
3076 static int process_timestamp_boundary(struct perf_tool *tool,
3077 				      union perf_event *event __maybe_unused,
3078 				      struct perf_sample *sample,
3079 				      struct machine *machine __maybe_unused)
3080 {
3081 	struct record *rec = container_of(tool, struct record, tool);
3082 
3083 	set_timestamp_boundary(rec, sample->time);
3084 	return 0;
3085 }
3086 
3087 static int parse_record_synth_option(const struct option *opt,
3088 				     const char *str,
3089 				     int unset __maybe_unused)
3090 {
3091 	struct record_opts *opts = opt->value;
3092 	char *p = strdup(str);
3093 
3094 	if (p == NULL)
3095 		return -1;
3096 
3097 	opts->synth = parse_synth_opt(p);
3098 	free(p);
3099 
3100 	if (opts->synth < 0) {
3101 		pr_err("Invalid synth option: %s\n", str);
3102 		return -1;
3103 	}
3104 	return 0;
3105 }
3106 
3107 /*
3108  * XXX Ideally would be local to cmd_record() and passed to a record__new
3109  * because we need to have access to it in record__exit, that is called
3110  * after cmd_record() exits, but since record_options need to be accessible to
3111  * builtin-script, leave it here.
3112  *
3113  * At least we don't ouch it in all the other functions here directly.
3114  *
3115  * Just say no to tons of global variables, sigh.
3116  */
3117 static struct record record = {
3118 	.opts = {
3119 		.sample_time	     = true,
3120 		.mmap_pages	     = UINT_MAX,
3121 		.user_freq	     = UINT_MAX,
3122 		.user_interval	     = ULLONG_MAX,
3123 		.freq		     = 4000,
3124 		.target		     = {
3125 			.uses_mmap   = true,
3126 			.default_per_cpu = true,
3127 		},
3128 		.mmap_flush          = MMAP_FLUSH_DEFAULT,
3129 		.nr_threads_synthesize = 1,
3130 		.ctl_fd              = -1,
3131 		.ctl_fd_ack          = -1,
3132 		.synth               = PERF_SYNTH_ALL,
3133 	},
3134 	.tool = {
3135 		.sample		= process_sample_event,
3136 		.fork		= perf_event__process_fork,
3137 		.exit		= perf_event__process_exit,
3138 		.comm		= perf_event__process_comm,
3139 		.namespaces	= perf_event__process_namespaces,
3140 		.mmap		= build_id__process_mmap,
3141 		.mmap2		= build_id__process_mmap2,
3142 		.itrace_start	= process_timestamp_boundary,
3143 		.aux		= process_timestamp_boundary,
3144 		.ordered_events	= true,
3145 	},
3146 };
3147 
3148 const char record_callchain_help[] = CALLCHAIN_RECORD_HELP
3149 	"\n\t\t\t\tDefault: fp";
3150 
3151 static bool dry_run;
3152 
3153 /*
3154  * XXX Will stay a global variable till we fix builtin-script.c to stop messing
3155  * with it and switch to use the library functions in perf_evlist that came
3156  * from builtin-record.c, i.e. use record_opts,
3157  * evlist__prepare_workload, etc instead of fork+exec'in 'perf record',
3158  * using pipes, etc.
3159  */
3160 static struct option __record_options[] = {
3161 	OPT_CALLBACK('e', "event", &record.evlist, "event",
3162 		     "event selector. use 'perf list' to list available events",
3163 		     parse_events_option),
3164 	OPT_CALLBACK(0, "filter", &record.evlist, "filter",
3165 		     "event filter", parse_filter),
3166 	OPT_CALLBACK_NOOPT(0, "exclude-perf", &record.evlist,
3167 			   NULL, "don't record events from perf itself",
3168 			   exclude_perf),
3169 	OPT_STRING('p', "pid", &record.opts.target.pid, "pid",
3170 		    "record events on existing process id"),
3171 	OPT_STRING('t', "tid", &record.opts.target.tid, "tid",
3172 		    "record events on existing thread id"),
3173 	OPT_INTEGER('r', "realtime", &record.realtime_prio,
3174 		    "collect data with this RT SCHED_FIFO priority"),
3175 	OPT_BOOLEAN(0, "no-buffering", &record.opts.no_buffering,
3176 		    "collect data without buffering"),
3177 	OPT_BOOLEAN('R', "raw-samples", &record.opts.raw_samples,
3178 		    "collect raw sample records from all opened counters"),
3179 	OPT_BOOLEAN('a', "all-cpus", &record.opts.target.system_wide,
3180 			    "system-wide collection from all CPUs"),
3181 	OPT_STRING('C', "cpu", &record.opts.target.cpu_list, "cpu",
3182 		    "list of cpus to monitor"),
3183 	OPT_U64('c', "count", &record.opts.user_interval, "event period to sample"),
3184 	OPT_STRING('o', "output", &record.data.path, "file",
3185 		    "output file name"),
3186 	OPT_BOOLEAN_SET('i', "no-inherit", &record.opts.no_inherit,
3187 			&record.opts.no_inherit_set,
3188 			"child tasks do not inherit counters"),
3189 	OPT_BOOLEAN(0, "tail-synthesize", &record.opts.tail_synthesize,
3190 		    "synthesize non-sample events at the end of output"),
3191 	OPT_BOOLEAN(0, "overwrite", &record.opts.overwrite, "use overwrite mode"),
3192 	OPT_BOOLEAN(0, "no-bpf-event", &record.opts.no_bpf_event, "do not record bpf events"),
3193 	OPT_BOOLEAN(0, "strict-freq", &record.opts.strict_freq,
3194 		    "Fail if the specified frequency can't be used"),
3195 	OPT_CALLBACK('F', "freq", &record.opts, "freq or 'max'",
3196 		     "profile at this frequency",
3197 		      record__parse_freq),
3198 	OPT_CALLBACK('m', "mmap-pages", &record.opts, "pages[,pages]",
3199 		     "number of mmap data pages and AUX area tracing mmap pages",
3200 		     record__parse_mmap_pages),
3201 	OPT_CALLBACK(0, "mmap-flush", &record.opts, "number",
3202 		     "Minimal number of bytes that is extracted from mmap data pages (default: 1)",
3203 		     record__mmap_flush_parse),
3204 	OPT_BOOLEAN(0, "group", &record.opts.group,
3205 		    "put the counters into a counter group"),
3206 	OPT_CALLBACK_NOOPT('g', NULL, &callchain_param,
3207 			   NULL, "enables call-graph recording" ,
3208 			   &record_callchain_opt),
3209 	OPT_CALLBACK(0, "call-graph", &record.opts,
3210 		     "record_mode[,record_size]", record_callchain_help,
3211 		     &record_parse_callchain_opt),
3212 	OPT_INCR('v', "verbose", &verbose,
3213 		    "be more verbose (show counter open errors, etc)"),
3214 	OPT_BOOLEAN('q', "quiet", &quiet, "don't print any message"),
3215 	OPT_BOOLEAN('s', "stat", &record.opts.inherit_stat,
3216 		    "per thread counts"),
3217 	OPT_BOOLEAN('d', "data", &record.opts.sample_address, "Record the sample addresses"),
3218 	OPT_BOOLEAN(0, "phys-data", &record.opts.sample_phys_addr,
3219 		    "Record the sample physical addresses"),
3220 	OPT_BOOLEAN(0, "data-page-size", &record.opts.sample_data_page_size,
3221 		    "Record the sampled data address data page size"),
3222 	OPT_BOOLEAN(0, "code-page-size", &record.opts.sample_code_page_size,
3223 		    "Record the sampled code address (ip) page size"),
3224 	OPT_BOOLEAN(0, "sample-cpu", &record.opts.sample_cpu, "Record the sample cpu"),
3225 	OPT_BOOLEAN(0, "sample-identifier", &record.opts.sample_identifier,
3226 		    "Record the sample identifier"),
3227 	OPT_BOOLEAN_SET('T', "timestamp", &record.opts.sample_time,
3228 			&record.opts.sample_time_set,
3229 			"Record the sample timestamps"),
3230 	OPT_BOOLEAN_SET('P', "period", &record.opts.period, &record.opts.period_set,
3231 			"Record the sample period"),
3232 	OPT_BOOLEAN('n', "no-samples", &record.opts.no_samples,
3233 		    "don't sample"),
3234 	OPT_BOOLEAN_SET('N', "no-buildid-cache", &record.no_buildid_cache,
3235 			&record.no_buildid_cache_set,
3236 			"do not update the buildid cache"),
3237 	OPT_BOOLEAN_SET('B', "no-buildid", &record.no_buildid,
3238 			&record.no_buildid_set,
3239 			"do not collect buildids in perf.data"),
3240 	OPT_CALLBACK('G', "cgroup", &record.evlist, "name",
3241 		     "monitor event in cgroup name only",
3242 		     parse_cgroups),
3243 	OPT_INTEGER('D', "delay", &record.opts.initial_delay,
3244 		  "ms to wait before starting measurement after program start (-1: start with events disabled)"),
3245 	OPT_BOOLEAN(0, "kcore", &record.opts.kcore, "copy /proc/kcore"),
3246 	OPT_STRING('u', "uid", &record.opts.target.uid_str, "user",
3247 		   "user to profile"),
3248 
3249 	OPT_CALLBACK_NOOPT('b', "branch-any", &record.opts.branch_stack,
3250 		     "branch any", "sample any taken branches",
3251 		     parse_branch_stack),
3252 
3253 	OPT_CALLBACK('j', "branch-filter", &record.opts.branch_stack,
3254 		     "branch filter mask", "branch stack filter modes",
3255 		     parse_branch_stack),
3256 	OPT_BOOLEAN('W', "weight", &record.opts.sample_weight,
3257 		    "sample by weight (on special events only)"),
3258 	OPT_BOOLEAN(0, "transaction", &record.opts.sample_transaction,
3259 		    "sample transaction flags (special events only)"),
3260 	OPT_BOOLEAN(0, "per-thread", &record.opts.target.per_thread,
3261 		    "use per-thread mmaps"),
3262 	OPT_CALLBACK_OPTARG('I', "intr-regs", &record.opts.sample_intr_regs, NULL, "any register",
3263 		    "sample selected machine registers on interrupt,"
3264 		    " use '-I?' to list register names", parse_intr_regs),
3265 	OPT_CALLBACK_OPTARG(0, "user-regs", &record.opts.sample_user_regs, NULL, "any register",
3266 		    "sample selected machine registers on interrupt,"
3267 		    " use '--user-regs=?' to list register names", parse_user_regs),
3268 	OPT_BOOLEAN(0, "running-time", &record.opts.running_time,
3269 		    "Record running/enabled time of read (:S) events"),
3270 	OPT_CALLBACK('k', "clockid", &record.opts,
3271 	"clockid", "clockid to use for events, see clock_gettime()",
3272 	parse_clockid),
3273 	OPT_STRING_OPTARG('S', "snapshot", &record.opts.auxtrace_snapshot_opts,
3274 			  "opts", "AUX area tracing Snapshot Mode", ""),
3275 	OPT_STRING_OPTARG(0, "aux-sample", &record.opts.auxtrace_sample_opts,
3276 			  "opts", "sample AUX area", ""),
3277 	OPT_UINTEGER(0, "proc-map-timeout", &proc_map_timeout,
3278 			"per thread proc mmap processing timeout in ms"),
3279 	OPT_BOOLEAN(0, "namespaces", &record.opts.record_namespaces,
3280 		    "Record namespaces events"),
3281 	OPT_BOOLEAN(0, "all-cgroups", &record.opts.record_cgroup,
3282 		    "Record cgroup events"),
3283 	OPT_BOOLEAN_SET(0, "switch-events", &record.opts.record_switch_events,
3284 			&record.opts.record_switch_events_set,
3285 			"Record context switch events"),
3286 	OPT_BOOLEAN_FLAG(0, "all-kernel", &record.opts.all_kernel,
3287 			 "Configure all used events to run in kernel space.",
3288 			 PARSE_OPT_EXCLUSIVE),
3289 	OPT_BOOLEAN_FLAG(0, "all-user", &record.opts.all_user,
3290 			 "Configure all used events to run in user space.",
3291 			 PARSE_OPT_EXCLUSIVE),
3292 	OPT_BOOLEAN(0, "kernel-callchains", &record.opts.kernel_callchains,
3293 		    "collect kernel callchains"),
3294 	OPT_BOOLEAN(0, "user-callchains", &record.opts.user_callchains,
3295 		    "collect user callchains"),
3296 	OPT_STRING(0, "clang-path", &llvm_param.clang_path, "clang path",
3297 		   "clang binary to use for compiling BPF scriptlets"),
3298 	OPT_STRING(0, "clang-opt", &llvm_param.clang_opt, "clang options",
3299 		   "options passed to clang when compiling BPF scriptlets"),
3300 	OPT_STRING(0, "vmlinux", &symbol_conf.vmlinux_name,
3301 		   "file", "vmlinux pathname"),
3302 	OPT_BOOLEAN(0, "buildid-all", &record.buildid_all,
3303 		    "Record build-id of all DSOs regardless of hits"),
3304 	OPT_BOOLEAN(0, "buildid-mmap", &record.buildid_mmap,
3305 		    "Record build-id in map events"),
3306 	OPT_BOOLEAN(0, "timestamp-filename", &record.timestamp_filename,
3307 		    "append timestamp to output filename"),
3308 	OPT_BOOLEAN(0, "timestamp-boundary", &record.timestamp_boundary,
3309 		    "Record timestamp boundary (time of first/last samples)"),
3310 	OPT_STRING_OPTARG_SET(0, "switch-output", &record.switch_output.str,
3311 			  &record.switch_output.set, "signal or size[BKMG] or time[smhd]",
3312 			  "Switch output when receiving SIGUSR2 (signal) or cross a size or time threshold",
3313 			  "signal"),
3314 	OPT_CALLBACK_SET(0, "switch-output-event", &record.sb_evlist, &record.switch_output_event_set, "switch output event",
3315 			 "switch output event selector. use 'perf list' to list available events",
3316 			 parse_events_option_new_evlist),
3317 	OPT_INTEGER(0, "switch-max-files", &record.switch_output.num_files,
3318 		   "Limit number of switch output generated files"),
3319 	OPT_BOOLEAN(0, "dry-run", &dry_run,
3320 		    "Parse options then exit"),
3321 #ifdef HAVE_AIO_SUPPORT
3322 	OPT_CALLBACK_OPTARG(0, "aio", &record.opts,
3323 		     &nr_cblocks_default, "n", "Use <n> control blocks in asynchronous trace writing mode (default: 1, max: 4)",
3324 		     record__aio_parse),
3325 #endif
3326 	OPT_CALLBACK(0, "affinity", &record.opts, "node|cpu",
3327 		     "Set affinity mask of trace reading thread to NUMA node cpu mask or cpu of processed mmap buffer",
3328 		     record__parse_affinity),
3329 #ifdef HAVE_ZSTD_SUPPORT
3330 	OPT_CALLBACK_OPTARG('z', "compression-level", &record.opts, &comp_level_default, "n",
3331 			    "Compress records using specified level (default: 1 - fastest compression, 22 - greatest compression)",
3332 			    record__parse_comp_level),
3333 #endif
3334 	OPT_CALLBACK(0, "max-size", &record.output_max_size,
3335 		     "size", "Limit the maximum size of the output file", parse_output_max_size),
3336 	OPT_UINTEGER(0, "num-thread-synthesize",
3337 		     &record.opts.nr_threads_synthesize,
3338 		     "number of threads to run for event synthesis"),
3339 #ifdef HAVE_LIBPFM
3340 	OPT_CALLBACK(0, "pfm-events", &record.evlist, "event",
3341 		"libpfm4 event selector. use 'perf list' to list available events",
3342 		parse_libpfm_events_option),
3343 #endif
3344 	OPT_CALLBACK(0, "control", &record.opts, "fd:ctl-fd[,ack-fd] or fifo:ctl-fifo[,ack-fifo]",
3345 		     "Listen on ctl-fd descriptor for command to control measurement ('enable': enable events, 'disable': disable events,\n"
3346 		     "\t\t\t  'snapshot': AUX area tracing snapshot).\n"
3347 		     "\t\t\t  Optionally send control command completion ('ack\\n') to ack-fd descriptor.\n"
3348 		     "\t\t\t  Alternatively, ctl-fifo / ack-fifo will be opened and used as ctl-fd / ack-fd.",
3349 		      parse_control_option),
3350 	OPT_CALLBACK(0, "synth", &record.opts, "no|all|task|mmap|cgroup",
3351 		     "Fine-tune event synthesis: default=all", parse_record_synth_option),
3352 	OPT_STRING_OPTARG_SET(0, "debuginfod", &record.debuginfod.urls,
3353 			  &record.debuginfod.set, "debuginfod urls",
3354 			  "Enable debuginfod data retrieval from DEBUGINFOD_URLS or specified urls",
3355 			  "system"),
3356 	OPT_CALLBACK_OPTARG(0, "threads", &record.opts, NULL, "spec",
3357 			    "write collected trace data into several data files using parallel threads",
3358 			    record__parse_threads),
3359 	OPT_BOOLEAN(0, "off-cpu", &record.off_cpu, "Enable off-cpu analysis"),
3360 	OPT_END()
3361 };
3362 
3363 struct option *record_options = __record_options;
3364 
3365 static int record__mmap_cpu_mask_init(struct mmap_cpu_mask *mask, struct perf_cpu_map *cpus)
3366 {
3367 	struct perf_cpu cpu;
3368 	int idx;
3369 
3370 	if (cpu_map__is_dummy(cpus))
3371 		return 0;
3372 
3373 	perf_cpu_map__for_each_cpu(cpu, idx, cpus) {
3374 		/* Return ENODEV is input cpu is greater than max cpu */
3375 		if ((unsigned long)cpu.cpu > mask->nbits)
3376 			return -ENODEV;
3377 		set_bit(cpu.cpu, mask->bits);
3378 	}
3379 
3380 	return 0;
3381 }
3382 
3383 static int record__mmap_cpu_mask_init_spec(struct mmap_cpu_mask *mask, const char *mask_spec)
3384 {
3385 	struct perf_cpu_map *cpus;
3386 
3387 	cpus = perf_cpu_map__new(mask_spec);
3388 	if (!cpus)
3389 		return -ENOMEM;
3390 
3391 	bitmap_zero(mask->bits, mask->nbits);
3392 	if (record__mmap_cpu_mask_init(mask, cpus))
3393 		return -ENODEV;
3394 
3395 	perf_cpu_map__put(cpus);
3396 
3397 	return 0;
3398 }
3399 
3400 static void record__free_thread_masks(struct record *rec, int nr_threads)
3401 {
3402 	int t;
3403 
3404 	if (rec->thread_masks)
3405 		for (t = 0; t < nr_threads; t++)
3406 			record__thread_mask_free(&rec->thread_masks[t]);
3407 
3408 	zfree(&rec->thread_masks);
3409 }
3410 
3411 static int record__alloc_thread_masks(struct record *rec, int nr_threads, int nr_bits)
3412 {
3413 	int t, ret;
3414 
3415 	rec->thread_masks = zalloc(nr_threads * sizeof(*(rec->thread_masks)));
3416 	if (!rec->thread_masks) {
3417 		pr_err("Failed to allocate thread masks\n");
3418 		return -ENOMEM;
3419 	}
3420 
3421 	for (t = 0; t < nr_threads; t++) {
3422 		ret = record__thread_mask_alloc(&rec->thread_masks[t], nr_bits);
3423 		if (ret) {
3424 			pr_err("Failed to allocate thread masks[%d]\n", t);
3425 			goto out_free;
3426 		}
3427 	}
3428 
3429 	return 0;
3430 
3431 out_free:
3432 	record__free_thread_masks(rec, nr_threads);
3433 
3434 	return ret;
3435 }
3436 
3437 static int record__init_thread_cpu_masks(struct record *rec, struct perf_cpu_map *cpus)
3438 {
3439 	int t, ret, nr_cpus = perf_cpu_map__nr(cpus);
3440 
3441 	ret = record__alloc_thread_masks(rec, nr_cpus, cpu__max_cpu().cpu);
3442 	if (ret)
3443 		return ret;
3444 
3445 	rec->nr_threads = nr_cpus;
3446 	pr_debug("nr_threads: %d\n", rec->nr_threads);
3447 
3448 	for (t = 0; t < rec->nr_threads; t++) {
3449 		set_bit(perf_cpu_map__cpu(cpus, t).cpu, rec->thread_masks[t].maps.bits);
3450 		set_bit(perf_cpu_map__cpu(cpus, t).cpu, rec->thread_masks[t].affinity.bits);
3451 		if (verbose) {
3452 			pr_debug("thread_masks[%d]: ", t);
3453 			mmap_cpu_mask__scnprintf(&rec->thread_masks[t].maps, "maps");
3454 			pr_debug("thread_masks[%d]: ", t);
3455 			mmap_cpu_mask__scnprintf(&rec->thread_masks[t].affinity, "affinity");
3456 		}
3457 	}
3458 
3459 	return 0;
3460 }
3461 
3462 static int record__init_thread_masks_spec(struct record *rec, struct perf_cpu_map *cpus,
3463 					  const char **maps_spec, const char **affinity_spec,
3464 					  u32 nr_spec)
3465 {
3466 	u32 s;
3467 	int ret = 0, t = 0;
3468 	struct mmap_cpu_mask cpus_mask;
3469 	struct thread_mask thread_mask, full_mask, *thread_masks;
3470 
3471 	ret = record__mmap_cpu_mask_alloc(&cpus_mask, cpu__max_cpu().cpu);
3472 	if (ret) {
3473 		pr_err("Failed to allocate CPUs mask\n");
3474 		return ret;
3475 	}
3476 
3477 	ret = record__mmap_cpu_mask_init(&cpus_mask, cpus);
3478 	if (ret) {
3479 		pr_err("Failed to init cpu mask\n");
3480 		goto out_free_cpu_mask;
3481 	}
3482 
3483 	ret = record__thread_mask_alloc(&full_mask, cpu__max_cpu().cpu);
3484 	if (ret) {
3485 		pr_err("Failed to allocate full mask\n");
3486 		goto out_free_cpu_mask;
3487 	}
3488 
3489 	ret = record__thread_mask_alloc(&thread_mask, cpu__max_cpu().cpu);
3490 	if (ret) {
3491 		pr_err("Failed to allocate thread mask\n");
3492 		goto out_free_full_and_cpu_masks;
3493 	}
3494 
3495 	for (s = 0; s < nr_spec; s++) {
3496 		ret = record__mmap_cpu_mask_init_spec(&thread_mask.maps, maps_spec[s]);
3497 		if (ret) {
3498 			pr_err("Failed to initialize maps thread mask\n");
3499 			goto out_free;
3500 		}
3501 		ret = record__mmap_cpu_mask_init_spec(&thread_mask.affinity, affinity_spec[s]);
3502 		if (ret) {
3503 			pr_err("Failed to initialize affinity thread mask\n");
3504 			goto out_free;
3505 		}
3506 
3507 		/* ignore invalid CPUs but do not allow empty masks */
3508 		if (!bitmap_and(thread_mask.maps.bits, thread_mask.maps.bits,
3509 				cpus_mask.bits, thread_mask.maps.nbits)) {
3510 			pr_err("Empty maps mask: %s\n", maps_spec[s]);
3511 			ret = -EINVAL;
3512 			goto out_free;
3513 		}
3514 		if (!bitmap_and(thread_mask.affinity.bits, thread_mask.affinity.bits,
3515 				cpus_mask.bits, thread_mask.affinity.nbits)) {
3516 			pr_err("Empty affinity mask: %s\n", affinity_spec[s]);
3517 			ret = -EINVAL;
3518 			goto out_free;
3519 		}
3520 
3521 		/* do not allow intersection with other masks (full_mask) */
3522 		if (bitmap_intersects(thread_mask.maps.bits, full_mask.maps.bits,
3523 				      thread_mask.maps.nbits)) {
3524 			pr_err("Intersecting maps mask: %s\n", maps_spec[s]);
3525 			ret = -EINVAL;
3526 			goto out_free;
3527 		}
3528 		if (bitmap_intersects(thread_mask.affinity.bits, full_mask.affinity.bits,
3529 				      thread_mask.affinity.nbits)) {
3530 			pr_err("Intersecting affinity mask: %s\n", affinity_spec[s]);
3531 			ret = -EINVAL;
3532 			goto out_free;
3533 		}
3534 
3535 		bitmap_or(full_mask.maps.bits, full_mask.maps.bits,
3536 			  thread_mask.maps.bits, full_mask.maps.nbits);
3537 		bitmap_or(full_mask.affinity.bits, full_mask.affinity.bits,
3538 			  thread_mask.affinity.bits, full_mask.maps.nbits);
3539 
3540 		thread_masks = realloc(rec->thread_masks, (t + 1) * sizeof(struct thread_mask));
3541 		if (!thread_masks) {
3542 			pr_err("Failed to reallocate thread masks\n");
3543 			ret = -ENOMEM;
3544 			goto out_free;
3545 		}
3546 		rec->thread_masks = thread_masks;
3547 		rec->thread_masks[t] = thread_mask;
3548 		if (verbose) {
3549 			pr_debug("thread_masks[%d]: ", t);
3550 			mmap_cpu_mask__scnprintf(&rec->thread_masks[t].maps, "maps");
3551 			pr_debug("thread_masks[%d]: ", t);
3552 			mmap_cpu_mask__scnprintf(&rec->thread_masks[t].affinity, "affinity");
3553 		}
3554 		t++;
3555 		ret = record__thread_mask_alloc(&thread_mask, cpu__max_cpu().cpu);
3556 		if (ret) {
3557 			pr_err("Failed to allocate thread mask\n");
3558 			goto out_free_full_and_cpu_masks;
3559 		}
3560 	}
3561 	rec->nr_threads = t;
3562 	pr_debug("nr_threads: %d\n", rec->nr_threads);
3563 	if (!rec->nr_threads)
3564 		ret = -EINVAL;
3565 
3566 out_free:
3567 	record__thread_mask_free(&thread_mask);
3568 out_free_full_and_cpu_masks:
3569 	record__thread_mask_free(&full_mask);
3570 out_free_cpu_mask:
3571 	record__mmap_cpu_mask_free(&cpus_mask);
3572 
3573 	return ret;
3574 }
3575 
3576 static int record__init_thread_core_masks(struct record *rec, struct perf_cpu_map *cpus)
3577 {
3578 	int ret;
3579 	struct cpu_topology *topo;
3580 
3581 	topo = cpu_topology__new();
3582 	if (!topo) {
3583 		pr_err("Failed to allocate CPU topology\n");
3584 		return -ENOMEM;
3585 	}
3586 
3587 	ret = record__init_thread_masks_spec(rec, cpus, topo->core_cpus_list,
3588 					     topo->core_cpus_list, topo->core_cpus_lists);
3589 	cpu_topology__delete(topo);
3590 
3591 	return ret;
3592 }
3593 
3594 static int record__init_thread_package_masks(struct record *rec, struct perf_cpu_map *cpus)
3595 {
3596 	int ret;
3597 	struct cpu_topology *topo;
3598 
3599 	topo = cpu_topology__new();
3600 	if (!topo) {
3601 		pr_err("Failed to allocate CPU topology\n");
3602 		return -ENOMEM;
3603 	}
3604 
3605 	ret = record__init_thread_masks_spec(rec, cpus, topo->package_cpus_list,
3606 					     topo->package_cpus_list, topo->package_cpus_lists);
3607 	cpu_topology__delete(topo);
3608 
3609 	return ret;
3610 }
3611 
3612 static int record__init_thread_numa_masks(struct record *rec, struct perf_cpu_map *cpus)
3613 {
3614 	u32 s;
3615 	int ret;
3616 	const char **spec;
3617 	struct numa_topology *topo;
3618 
3619 	topo = numa_topology__new();
3620 	if (!topo) {
3621 		pr_err("Failed to allocate NUMA topology\n");
3622 		return -ENOMEM;
3623 	}
3624 
3625 	spec = zalloc(topo->nr * sizeof(char *));
3626 	if (!spec) {
3627 		pr_err("Failed to allocate NUMA spec\n");
3628 		ret = -ENOMEM;
3629 		goto out_delete_topo;
3630 	}
3631 	for (s = 0; s < topo->nr; s++)
3632 		spec[s] = topo->nodes[s].cpus;
3633 
3634 	ret = record__init_thread_masks_spec(rec, cpus, spec, spec, topo->nr);
3635 
3636 	zfree(&spec);
3637 
3638 out_delete_topo:
3639 	numa_topology__delete(topo);
3640 
3641 	return ret;
3642 }
3643 
3644 static int record__init_thread_user_masks(struct record *rec, struct perf_cpu_map *cpus)
3645 {
3646 	int t, ret;
3647 	u32 s, nr_spec = 0;
3648 	char **maps_spec = NULL, **affinity_spec = NULL, **tmp_spec;
3649 	char *user_spec, *spec, *spec_ptr, *mask, *mask_ptr, *dup_mask = NULL;
3650 
3651 	for (t = 0, user_spec = (char *)rec->opts.threads_user_spec; ; t++, user_spec = NULL) {
3652 		spec = strtok_r(user_spec, ":", &spec_ptr);
3653 		if (spec == NULL)
3654 			break;
3655 		pr_debug2("threads_spec[%d]: %s\n", t, spec);
3656 		mask = strtok_r(spec, "/", &mask_ptr);
3657 		if (mask == NULL)
3658 			break;
3659 		pr_debug2("  maps mask: %s\n", mask);
3660 		tmp_spec = realloc(maps_spec, (nr_spec + 1) * sizeof(char *));
3661 		if (!tmp_spec) {
3662 			pr_err("Failed to reallocate maps spec\n");
3663 			ret = -ENOMEM;
3664 			goto out_free;
3665 		}
3666 		maps_spec = tmp_spec;
3667 		maps_spec[nr_spec] = dup_mask = strdup(mask);
3668 		if (!maps_spec[nr_spec]) {
3669 			pr_err("Failed to allocate maps spec[%d]\n", nr_spec);
3670 			ret = -ENOMEM;
3671 			goto out_free;
3672 		}
3673 		mask = strtok_r(NULL, "/", &mask_ptr);
3674 		if (mask == NULL) {
3675 			pr_err("Invalid thread maps or affinity specs\n");
3676 			ret = -EINVAL;
3677 			goto out_free;
3678 		}
3679 		pr_debug2("  affinity mask: %s\n", mask);
3680 		tmp_spec = realloc(affinity_spec, (nr_spec + 1) * sizeof(char *));
3681 		if (!tmp_spec) {
3682 			pr_err("Failed to reallocate affinity spec\n");
3683 			ret = -ENOMEM;
3684 			goto out_free;
3685 		}
3686 		affinity_spec = tmp_spec;
3687 		affinity_spec[nr_spec] = strdup(mask);
3688 		if (!affinity_spec[nr_spec]) {
3689 			pr_err("Failed to allocate affinity spec[%d]\n", nr_spec);
3690 			ret = -ENOMEM;
3691 			goto out_free;
3692 		}
3693 		dup_mask = NULL;
3694 		nr_spec++;
3695 	}
3696 
3697 	ret = record__init_thread_masks_spec(rec, cpus, (const char **)maps_spec,
3698 					     (const char **)affinity_spec, nr_spec);
3699 
3700 out_free:
3701 	free(dup_mask);
3702 	for (s = 0; s < nr_spec; s++) {
3703 		if (maps_spec)
3704 			free(maps_spec[s]);
3705 		if (affinity_spec)
3706 			free(affinity_spec[s]);
3707 	}
3708 	free(affinity_spec);
3709 	free(maps_spec);
3710 
3711 	return ret;
3712 }
3713 
3714 static int record__init_thread_default_masks(struct record *rec, struct perf_cpu_map *cpus)
3715 {
3716 	int ret;
3717 
3718 	ret = record__alloc_thread_masks(rec, 1, cpu__max_cpu().cpu);
3719 	if (ret)
3720 		return ret;
3721 
3722 	if (record__mmap_cpu_mask_init(&rec->thread_masks->maps, cpus))
3723 		return -ENODEV;
3724 
3725 	rec->nr_threads = 1;
3726 
3727 	return 0;
3728 }
3729 
3730 static int record__init_thread_masks(struct record *rec)
3731 {
3732 	int ret = 0;
3733 	struct perf_cpu_map *cpus = rec->evlist->core.all_cpus;
3734 
3735 	if (!record__threads_enabled(rec))
3736 		return record__init_thread_default_masks(rec, cpus);
3737 
3738 	if (evlist__per_thread(rec->evlist)) {
3739 		pr_err("--per-thread option is mutually exclusive to parallel streaming mode.\n");
3740 		return -EINVAL;
3741 	}
3742 
3743 	switch (rec->opts.threads_spec) {
3744 	case THREAD_SPEC__CPU:
3745 		ret = record__init_thread_cpu_masks(rec, cpus);
3746 		break;
3747 	case THREAD_SPEC__CORE:
3748 		ret = record__init_thread_core_masks(rec, cpus);
3749 		break;
3750 	case THREAD_SPEC__PACKAGE:
3751 		ret = record__init_thread_package_masks(rec, cpus);
3752 		break;
3753 	case THREAD_SPEC__NUMA:
3754 		ret = record__init_thread_numa_masks(rec, cpus);
3755 		break;
3756 	case THREAD_SPEC__USER:
3757 		ret = record__init_thread_user_masks(rec, cpus);
3758 		break;
3759 	default:
3760 		break;
3761 	}
3762 
3763 	return ret;
3764 }
3765 
3766 int cmd_record(int argc, const char **argv)
3767 {
3768 	int err;
3769 	struct record *rec = &record;
3770 	char errbuf[BUFSIZ];
3771 
3772 	setlocale(LC_ALL, "");
3773 
3774 #ifndef HAVE_LIBBPF_SUPPORT
3775 # define set_nobuild(s, l, c) set_option_nobuild(record_options, s, l, "NO_LIBBPF=1", c)
3776 	set_nobuild('\0', "clang-path", true);
3777 	set_nobuild('\0', "clang-opt", true);
3778 # undef set_nobuild
3779 #endif
3780 
3781 #ifndef HAVE_BPF_PROLOGUE
3782 # if !defined (HAVE_DWARF_SUPPORT)
3783 #  define REASON  "NO_DWARF=1"
3784 # elif !defined (HAVE_LIBBPF_SUPPORT)
3785 #  define REASON  "NO_LIBBPF=1"
3786 # else
3787 #  define REASON  "this architecture doesn't support BPF prologue"
3788 # endif
3789 # define set_nobuild(s, l, c) set_option_nobuild(record_options, s, l, REASON, c)
3790 	set_nobuild('\0', "vmlinux", true);
3791 # undef set_nobuild
3792 # undef REASON
3793 #endif
3794 
3795 #ifndef HAVE_BPF_SKEL
3796 # define set_nobuild(s, l, m, c) set_option_nobuild(record_options, s, l, m, c)
3797 	set_nobuild('\0', "off-cpu", "no BUILD_BPF_SKEL=1", true);
3798 # undef set_nobuild
3799 #endif
3800 
3801 	rec->opts.affinity = PERF_AFFINITY_SYS;
3802 
3803 	rec->evlist = evlist__new();
3804 	if (rec->evlist == NULL)
3805 		return -ENOMEM;
3806 
3807 	err = perf_config(perf_record_config, rec);
3808 	if (err)
3809 		return err;
3810 
3811 	argc = parse_options(argc, argv, record_options, record_usage,
3812 			    PARSE_OPT_STOP_AT_NON_OPTION);
3813 	if (quiet)
3814 		perf_quiet_option();
3815 
3816 	err = symbol__validate_sym_arguments();
3817 	if (err)
3818 		return err;
3819 
3820 	perf_debuginfod_setup(&record.debuginfod);
3821 
3822 	/* Make system wide (-a) the default target. */
3823 	if (!argc && target__none(&rec->opts.target))
3824 		rec->opts.target.system_wide = true;
3825 
3826 	if (nr_cgroups && !rec->opts.target.system_wide) {
3827 		usage_with_options_msg(record_usage, record_options,
3828 			"cgroup monitoring only available in system-wide mode");
3829 
3830 	}
3831 
3832 	if (rec->buildid_mmap) {
3833 		if (!perf_can_record_build_id()) {
3834 			pr_err("Failed: no support to record build id in mmap events, update your kernel.\n");
3835 			err = -EINVAL;
3836 			goto out_opts;
3837 		}
3838 		pr_debug("Enabling build id in mmap2 events.\n");
3839 		/* Enable mmap build id synthesizing. */
3840 		symbol_conf.buildid_mmap2 = true;
3841 		/* Enable perf_event_attr::build_id bit. */
3842 		rec->opts.build_id = true;
3843 		/* Disable build id cache. */
3844 		rec->no_buildid = true;
3845 	}
3846 
3847 	if (rec->opts.record_cgroup && !perf_can_record_cgroup()) {
3848 		pr_err("Kernel has no cgroup sampling support.\n");
3849 		err = -EINVAL;
3850 		goto out_opts;
3851 	}
3852 
3853 	if (rec->opts.kcore)
3854 		rec->opts.text_poke = true;
3855 
3856 	if (rec->opts.kcore || record__threads_enabled(rec))
3857 		rec->data.is_dir = true;
3858 
3859 	if (record__threads_enabled(rec)) {
3860 		if (rec->opts.affinity != PERF_AFFINITY_SYS) {
3861 			pr_err("--affinity option is mutually exclusive to parallel streaming mode.\n");
3862 			goto out_opts;
3863 		}
3864 		if (record__aio_enabled(rec)) {
3865 			pr_err("Asynchronous streaming mode (--aio) is mutually exclusive to parallel streaming mode.\n");
3866 			goto out_opts;
3867 		}
3868 	}
3869 
3870 	if (rec->opts.comp_level != 0) {
3871 		pr_debug("Compression enabled, disabling build id collection at the end of the session.\n");
3872 		rec->no_buildid = true;
3873 	}
3874 
3875 	if (rec->opts.record_switch_events &&
3876 	    !perf_can_record_switch_events()) {
3877 		ui__error("kernel does not support recording context switch events\n");
3878 		parse_options_usage(record_usage, record_options, "switch-events", 0);
3879 		err = -EINVAL;
3880 		goto out_opts;
3881 	}
3882 
3883 	if (switch_output_setup(rec)) {
3884 		parse_options_usage(record_usage, record_options, "switch-output", 0);
3885 		err = -EINVAL;
3886 		goto out_opts;
3887 	}
3888 
3889 	if (rec->switch_output.time) {
3890 		signal(SIGALRM, alarm_sig_handler);
3891 		alarm(rec->switch_output.time);
3892 	}
3893 
3894 	if (rec->switch_output.num_files) {
3895 		rec->switch_output.filenames = calloc(sizeof(char *),
3896 						      rec->switch_output.num_files);
3897 		if (!rec->switch_output.filenames) {
3898 			err = -EINVAL;
3899 			goto out_opts;
3900 		}
3901 	}
3902 
3903 	if (rec->timestamp_filename && record__threads_enabled(rec)) {
3904 		rec->timestamp_filename = false;
3905 		pr_warning("WARNING: --timestamp-filename option is not available in parallel streaming mode.\n");
3906 	}
3907 
3908 	/*
3909 	 * Allow aliases to facilitate the lookup of symbols for address
3910 	 * filters. Refer to auxtrace_parse_filters().
3911 	 */
3912 	symbol_conf.allow_aliases = true;
3913 
3914 	symbol__init(NULL);
3915 
3916 	err = record__auxtrace_init(rec);
3917 	if (err)
3918 		goto out;
3919 
3920 	if (dry_run)
3921 		goto out;
3922 
3923 	err = bpf__setup_stdout(rec->evlist);
3924 	if (err) {
3925 		bpf__strerror_setup_stdout(rec->evlist, err, errbuf, sizeof(errbuf));
3926 		pr_err("ERROR: Setup BPF stdout failed: %s\n",
3927 			 errbuf);
3928 		goto out;
3929 	}
3930 
3931 	err = -ENOMEM;
3932 
3933 	if (rec->no_buildid_cache || rec->no_buildid) {
3934 		disable_buildid_cache();
3935 	} else if (rec->switch_output.enabled) {
3936 		/*
3937 		 * In 'perf record --switch-output', disable buildid
3938 		 * generation by default to reduce data file switching
3939 		 * overhead. Still generate buildid if they are required
3940 		 * explicitly using
3941 		 *
3942 		 *  perf record --switch-output --no-no-buildid \
3943 		 *              --no-no-buildid-cache
3944 		 *
3945 		 * Following code equals to:
3946 		 *
3947 		 * if ((rec->no_buildid || !rec->no_buildid_set) &&
3948 		 *     (rec->no_buildid_cache || !rec->no_buildid_cache_set))
3949 		 *         disable_buildid_cache();
3950 		 */
3951 		bool disable = true;
3952 
3953 		if (rec->no_buildid_set && !rec->no_buildid)
3954 			disable = false;
3955 		if (rec->no_buildid_cache_set && !rec->no_buildid_cache)
3956 			disable = false;
3957 		if (disable) {
3958 			rec->no_buildid = true;
3959 			rec->no_buildid_cache = true;
3960 			disable_buildid_cache();
3961 		}
3962 	}
3963 
3964 	if (record.opts.overwrite)
3965 		record.opts.tail_synthesize = true;
3966 
3967 	if (rec->evlist->core.nr_entries == 0) {
3968 		if (perf_pmu__has_hybrid()) {
3969 			err = evlist__add_default_hybrid(rec->evlist,
3970 							 !record.opts.no_samples);
3971 		} else {
3972 			err = __evlist__add_default(rec->evlist,
3973 						    !record.opts.no_samples);
3974 		}
3975 
3976 		if (err < 0) {
3977 			pr_err("Not enough memory for event selector list\n");
3978 			goto out;
3979 		}
3980 	}
3981 
3982 	if (rec->opts.target.tid && !rec->opts.no_inherit_set)
3983 		rec->opts.no_inherit = true;
3984 
3985 	err = target__validate(&rec->opts.target);
3986 	if (err) {
3987 		target__strerror(&rec->opts.target, err, errbuf, BUFSIZ);
3988 		ui__warning("%s\n", errbuf);
3989 	}
3990 
3991 	err = target__parse_uid(&rec->opts.target);
3992 	if (err) {
3993 		int saved_errno = errno;
3994 
3995 		target__strerror(&rec->opts.target, err, errbuf, BUFSIZ);
3996 		ui__error("%s", errbuf);
3997 
3998 		err = -saved_errno;
3999 		goto out;
4000 	}
4001 
4002 	/* Enable ignoring missing threads when -u/-p option is defined. */
4003 	rec->opts.ignore_missing_thread = rec->opts.target.uid != UINT_MAX || rec->opts.target.pid;
4004 
4005 	if (evlist__fix_hybrid_cpus(rec->evlist, rec->opts.target.cpu_list)) {
4006 		pr_err("failed to use cpu list %s\n",
4007 		       rec->opts.target.cpu_list);
4008 		goto out;
4009 	}
4010 
4011 	rec->opts.target.hybrid = perf_pmu__has_hybrid();
4012 
4013 	if (callchain_param.enabled && callchain_param.record_mode == CALLCHAIN_FP)
4014 		arch__add_leaf_frame_record_opts(&rec->opts);
4015 
4016 	err = -ENOMEM;
4017 	if (evlist__create_maps(rec->evlist, &rec->opts.target) < 0) {
4018 		if (rec->opts.target.pid != NULL) {
4019 			pr_err("Couldn't create thread/CPU maps: %s\n",
4020 				errno == ENOENT ? "No such process" : str_error_r(errno, errbuf, sizeof(errbuf)));
4021 			goto out;
4022 		}
4023 		else
4024 			usage_with_options(record_usage, record_options);
4025 	}
4026 
4027 	err = auxtrace_record__options(rec->itr, rec->evlist, &rec->opts);
4028 	if (err)
4029 		goto out;
4030 
4031 	/*
4032 	 * We take all buildids when the file contains
4033 	 * AUX area tracing data because we do not decode the
4034 	 * trace because it would take too long.
4035 	 */
4036 	if (rec->opts.full_auxtrace)
4037 		rec->buildid_all = true;
4038 
4039 	if (rec->opts.text_poke) {
4040 		err = record__config_text_poke(rec->evlist);
4041 		if (err) {
4042 			pr_err("record__config_text_poke failed, error %d\n", err);
4043 			goto out;
4044 		}
4045 	}
4046 
4047 	if (rec->off_cpu) {
4048 		err = record__config_off_cpu(rec);
4049 		if (err) {
4050 			pr_err("record__config_off_cpu failed, error %d\n", err);
4051 			goto out;
4052 		}
4053 	}
4054 
4055 	if (record_opts__config(&rec->opts)) {
4056 		err = -EINVAL;
4057 		goto out;
4058 	}
4059 
4060 	err = record__init_thread_masks(rec);
4061 	if (err) {
4062 		pr_err("Failed to initialize parallel data streaming masks\n");
4063 		goto out;
4064 	}
4065 
4066 	if (rec->opts.nr_cblocks > nr_cblocks_max)
4067 		rec->opts.nr_cblocks = nr_cblocks_max;
4068 	pr_debug("nr_cblocks: %d\n", rec->opts.nr_cblocks);
4069 
4070 	pr_debug("affinity: %s\n", affinity_tags[rec->opts.affinity]);
4071 	pr_debug("mmap flush: %d\n", rec->opts.mmap_flush);
4072 
4073 	if (rec->opts.comp_level > comp_level_max)
4074 		rec->opts.comp_level = comp_level_max;
4075 	pr_debug("comp level: %d\n", rec->opts.comp_level);
4076 
4077 	err = __cmd_record(&record, argc, argv);
4078 out:
4079 	evlist__delete(rec->evlist);
4080 	symbol__exit();
4081 	auxtrace_record__free(rec->itr);
4082 out_opts:
4083 	record__free_thread_masks(rec, rec->nr_threads);
4084 	rec->nr_threads = 0;
4085 	evlist__close_control(rec->opts.ctl_fd, rec->opts.ctl_fd_ack, &rec->opts.ctl_fd_close);
4086 	return err;
4087 }
4088 
4089 static void snapshot_sig_handler(int sig __maybe_unused)
4090 {
4091 	struct record *rec = &record;
4092 
4093 	hit_auxtrace_snapshot_trigger(rec);
4094 
4095 	if (switch_output_signal(rec))
4096 		trigger_hit(&switch_output_trigger);
4097 }
4098 
4099 static void alarm_sig_handler(int sig __maybe_unused)
4100 {
4101 	struct record *rec = &record;
4102 
4103 	if (switch_output_time(rec))
4104 		trigger_hit(&switch_output_trigger);
4105 }
4106