Lines Matching refs:rec

114 	struct record		*rec;  member
203 static int record__threads_enabled(struct record *rec) in record__threads_enabled() argument
205 return rec->opts.threads_spec; in record__threads_enabled()
208 static bool switch_output_signal(struct record *rec) in switch_output_signal() argument
210 return rec->switch_output.signal && in switch_output_signal()
214 static bool switch_output_size(struct record *rec) in switch_output_size() argument
216 return rec->switch_output.size && in switch_output_size()
218 (rec->bytes_written >= rec->switch_output.size); in switch_output_size()
221 static bool switch_output_time(struct record *rec) in switch_output_time() argument
223 return rec->switch_output.time && in switch_output_time()
227 static u64 record__bytes_written(struct record *rec) in record__bytes_written() argument
230 u64 bytes_written = rec->bytes_written; in record__bytes_written()
231 struct record_thread *thread_data = rec->thread_data; in record__bytes_written()
233 for (t = 0; t < rec->nr_threads; t++) in record__bytes_written()
239 static bool record__output_max_size_exceeded(struct record *rec) in record__output_max_size_exceeded() argument
241 return rec->output_max_size && in record__output_max_size_exceeded()
242 (record__bytes_written(rec) >= rec->output_max_size); in record__output_max_size_exceeded()
245 static int record__write(struct record *rec, struct mmap *map __maybe_unused, in record__write() argument
248 struct perf_data_file *file = &rec->session->data->file; in record__write()
261 rec->bytes_written += size; in record__write()
263 if (record__output_max_size_exceeded(rec) && !done) { in record__write()
266 record__bytes_written(rec) >> 10); in record__write()
270 if (switch_output_size(rec)) in record__write()
276 static int record__aio_enabled(struct record *rec);
277 static int record__comp_enabled(struct record *rec);
389 struct record *rec; member
412 if (record__comp_enabled(aio->rec)) { in record__aio_pushfn()
413 size = zstd_compress(aio->rec->session, NULL, aio->data + aio->size, in record__aio_pushfn()
439 static int record__aio_push(struct record *rec, struct mmap *map, off_t *off) in record__aio_push() argument
442 int trace_fd = rec->session->data->file.fd; in record__aio_push()
443 struct record_aio aio = { .rec = rec, .size = 0 }; in record__aio_push()
456 rec->samples++; in record__aio_push()
460 rec->bytes_written += aio.size; in record__aio_push()
461 if (switch_output_size(rec)) in record__aio_push()
486 static void record__aio_mmap_read_sync(struct record *rec) in record__aio_mmap_read_sync() argument
489 struct evlist *evlist = rec->evlist; in record__aio_mmap_read_sync()
492 if (!record__aio_enabled(rec)) in record__aio_mmap_read_sync()
526 static int record__aio_push(struct record *rec __maybe_unused, struct mmap *map __maybe_unused, in record__aio_push()
541 static void record__aio_mmap_read_sync(struct record *rec __maybe_unused) in record__aio_mmap_read_sync()
546 static int record__aio_enabled(struct record *rec) in record__aio_enabled() argument
548 return rec->opts.nr_cblocks > 0; in record__aio_enabled()
607 static int record__comp_enabled(struct record *rec) in record__comp_enabled() argument
609 return rec->opts.comp_level > 0; in record__comp_enabled()
617 struct record *rec = container_of(tool, struct record, tool); in process_synthesized_event() local
618 return record__write(rec, NULL, event, event->header.size); in process_synthesized_event()
638 struct record *rec = to; in record__pushfn() local
640 if (record__comp_enabled(rec)) { in record__pushfn()
641 size = zstd_compress(rec->session, map, map->data, mmap__mmap_len(map), bf, size); in record__pushfn()
646 return record__write(rec, map, bf, size); in record__pushfn()
707 struct record *rec = container_of(tool, struct record, tool); in record__process_auxtrace() local
708 struct perf_data *data = &rec->data; in record__process_auxtrace()
720 err = auxtrace_index__auxtrace_event(&rec->session->auxtrace_index, in record__process_auxtrace()
731 record__write(rec, map, event, event->header.size); in record__process_auxtrace()
732 record__write(rec, map, data1, len1); in record__process_auxtrace()
734 record__write(rec, map, data2, len2); in record__process_auxtrace()
735 record__write(rec, map, &pad, padding); in record__process_auxtrace()
740 static int record__auxtrace_mmap_read(struct record *rec, in record__auxtrace_mmap_read() argument
745 ret = auxtrace_mmap__read(map, rec->itr, &rec->tool, in record__auxtrace_mmap_read()
751 rec->samples++; in record__auxtrace_mmap_read()
756 static int record__auxtrace_mmap_read_snapshot(struct record *rec, in record__auxtrace_mmap_read_snapshot() argument
761 ret = auxtrace_mmap__read_snapshot(map, rec->itr, &rec->tool, in record__auxtrace_mmap_read_snapshot()
763 rec->opts.auxtrace_snapshot_size); in record__auxtrace_mmap_read_snapshot()
768 rec->samples++; in record__auxtrace_mmap_read_snapshot()
773 static int record__auxtrace_read_snapshot_all(struct record *rec) in record__auxtrace_read_snapshot_all() argument
778 for (i = 0; i < rec->evlist->core.nr_mmaps; i++) { in record__auxtrace_read_snapshot_all()
779 struct mmap *map = &rec->evlist->mmap[i]; in record__auxtrace_read_snapshot_all()
784 if (record__auxtrace_mmap_read_snapshot(rec, map) != 0) { in record__auxtrace_read_snapshot_all()
793 static void record__read_auxtrace_snapshot(struct record *rec, bool on_exit) in record__read_auxtrace_snapshot() argument
796 if (record__auxtrace_read_snapshot_all(rec) < 0) { in record__read_auxtrace_snapshot()
799 if (auxtrace_record__snapshot_finish(rec->itr, on_exit)) in record__read_auxtrace_snapshot()
806 static int record__auxtrace_snapshot_exit(struct record *rec) in record__auxtrace_snapshot_exit() argument
812 auxtrace_record__snapshot_start(rec->itr)) in record__auxtrace_snapshot_exit()
815 record__read_auxtrace_snapshot(rec, true); in record__auxtrace_snapshot_exit()
822 static int record__auxtrace_init(struct record *rec) in record__auxtrace_init() argument
826 if ((rec->opts.auxtrace_snapshot_opts || rec->opts.auxtrace_sample_opts) in record__auxtrace_init()
827 && record__threads_enabled(rec)) { in record__auxtrace_init()
832 if (!rec->itr) { in record__auxtrace_init()
833 rec->itr = auxtrace_record__init(rec->evlist, &err); in record__auxtrace_init()
838 err = auxtrace_parse_snapshot_options(rec->itr, &rec->opts, in record__auxtrace_init()
839 rec->opts.auxtrace_snapshot_opts); in record__auxtrace_init()
843 err = auxtrace_parse_sample_options(rec->itr, rec->evlist, &rec->opts, in record__auxtrace_init()
844 rec->opts.auxtrace_sample_opts); in record__auxtrace_init()
848 auxtrace_regroup_aux_output(rec->evlist); in record__auxtrace_init()
850 return auxtrace_parse_filters(rec->evlist); in record__auxtrace_init()
856 int record__auxtrace_mmap_read(struct record *rec __maybe_unused, in record__auxtrace_mmap_read()
863 void record__read_auxtrace_snapshot(struct record *rec __maybe_unused, in record__read_auxtrace_snapshot()
875 int record__auxtrace_snapshot_exit(struct record *rec __maybe_unused) in record__auxtrace_snapshot_exit()
880 static int record__auxtrace_init(struct record *rec __maybe_unused) in record__auxtrace_init()
909 static int record__config_off_cpu(struct record *rec) in record__config_off_cpu() argument
911 return off_cpu_prepare(rec->evlist, &rec->opts.target, &rec->opts); in record__config_off_cpu()
1075 static void record__free_thread_data(struct record *rec) in record__free_thread_data() argument
1078 struct record_thread *thread_data = rec->thread_data; in record__free_thread_data()
1083 for (t = 0; t < rec->nr_threads; t++) { in record__free_thread_data()
1090 zfree(&rec->thread_data); in record__free_thread_data()
1093 static int record__map_thread_evlist_pollfd_indexes(struct record *rec, in record__map_thread_evlist_pollfd_indexes() argument
1097 size_t x = rec->index_map_cnt; in record__map_thread_evlist_pollfd_indexes()
1099 if (realloc_array_as_needed(rec->index_map, rec->index_map_sz, x, NULL)) in record__map_thread_evlist_pollfd_indexes()
1101 rec->index_map[x].evlist_pollfd_index = evlist_pollfd_index; in record__map_thread_evlist_pollfd_indexes()
1102 rec->index_map[x].thread_pollfd_index = thread_pollfd_index; in record__map_thread_evlist_pollfd_indexes()
1103 rec->index_map_cnt += 1; in record__map_thread_evlist_pollfd_indexes()
1107 static int record__update_evlist_pollfd_from_thread(struct record *rec, in record__update_evlist_pollfd_from_thread() argument
1116 for (i = 0; i < rec->index_map_cnt; i++) { in record__update_evlist_pollfd_from_thread()
1117 int e_pos = rec->index_map[i].evlist_pollfd_index; in record__update_evlist_pollfd_from_thread()
1118 int t_pos = rec->index_map[i].thread_pollfd_index; in record__update_evlist_pollfd_from_thread()
1131 static int record__dup_non_perf_events(struct record *rec, in record__dup_non_perf_events() argument
1148 ret = record__map_thread_evlist_pollfd_indexes(rec, i, ret); in record__dup_non_perf_events()
1157 static int record__alloc_thread_data(struct record *rec, struct evlist *evlist) in record__alloc_thread_data() argument
1162 rec->thread_data = zalloc(rec->nr_threads * sizeof(*(rec->thread_data))); in record__alloc_thread_data()
1163 if (!rec->thread_data) { in record__alloc_thread_data()
1167 thread_data = rec->thread_data; in record__alloc_thread_data()
1169 for (t = 0; t < rec->nr_threads; t++) in record__alloc_thread_data()
1172 for (t = 0; t < rec->nr_threads; t++) { in record__alloc_thread_data()
1173 thread_data[t].rec = rec; in record__alloc_thread_data()
1174 thread_data[t].mask = &rec->thread_masks[t]; in record__alloc_thread_data()
1205 ret = record__dup_non_perf_events(rec, evlist, &thread_data[t]); in record__alloc_thread_data()
1216 record__free_thread_data(rec); in record__alloc_thread_data()
1221 static int record__mmap_evlist(struct record *rec, in record__mmap_evlist() argument
1225 struct record_opts *opts = &rec->opts; in record__mmap_evlist()
1259 ret = record__alloc_thread_data(rec, evlist); in record__mmap_evlist()
1263 if (record__threads_enabled(rec)) { in record__mmap_evlist()
1264 ret = perf_data__create_dir(&rec->data, evlist->core.nr_mmaps); in record__mmap_evlist()
1271 evlist->mmap[i].file = &rec->data.dir.files[i]; in record__mmap_evlist()
1273 evlist->overwrite_mmap[i].file = &rec->data.dir.files[i]; in record__mmap_evlist()
1280 static int record__mmap(struct record *rec) in record__mmap() argument
1282 return record__mmap_evlist(rec, rec->evlist); in record__mmap()
1285 static int record__open(struct record *rec) in record__open() argument
1289 struct evlist *evlist = rec->evlist; in record__open()
1290 struct perf_session *session = rec->session; in record__open()
1291 struct record_opts *opts = &rec->opts; in record__open()
1365 rc = record__mmap(rec); in record__open()
1375 static void set_timestamp_boundary(struct record *rec, u64 sample_time) in set_timestamp_boundary() argument
1377 if (rec->evlist->first_sample_time == 0) in set_timestamp_boundary()
1378 rec->evlist->first_sample_time = sample_time; in set_timestamp_boundary()
1381 rec->evlist->last_sample_time = sample_time; in set_timestamp_boundary()
1390 struct record *rec = container_of(tool, struct record, tool); in process_sample_event() local
1392 set_timestamp_boundary(rec, sample->time); in process_sample_event()
1394 if (rec->buildid_all) in process_sample_event()
1397 rec->samples++; in process_sample_event()
1401 static int process_buildids(struct record *rec) in process_buildids() argument
1403 struct perf_session *session = rec->session; in process_buildids()
1405 if (perf_data__size(&rec->data) == 0) in process_buildids()
1425 if (rec->buildid_all && !rec->timestamp_boundary) in process_buildids()
1426 rec->tool.sample = NULL; in process_buildids()
1470 static void record__adjust_affinity(struct record *rec, struct mmap *map) in record__adjust_affinity() argument
1472 if (rec->opts.affinity != PERF_AFFINITY_SYS && in record__adjust_affinity()
1527 static int record__mmap_read_evlist(struct record *rec, struct evlist *evlist, in record__mmap_read_evlist() argument
1530 u64 bytes_written = rec->bytes_written; in record__mmap_read_evlist()
1535 int trace_fd = rec->data.file.fd; in record__mmap_read_evlist()
1550 if (record__aio_enabled(rec)) in record__mmap_read_evlist()
1558 record__adjust_affinity(rec, map); in record__mmap_read_evlist()
1563 if (!record__aio_enabled(rec)) { in record__mmap_read_evlist()
1564 if (perf_mmap__push(map, rec, record__pushfn) < 0) { in record__mmap_read_evlist()
1571 if (record__aio_push(rec, map, &off) < 0) { in record__mmap_read_evlist()
1583 if (map->auxtrace_mmap.base && !rec->opts.auxtrace_snapshot_mode && in record__mmap_read_evlist()
1584 !rec->opts.auxtrace_sample_mode && in record__mmap_read_evlist()
1585 record__auxtrace_mmap_read(rec, map) != 0) { in record__mmap_read_evlist()
1591 if (record__aio_enabled(rec)) in record__mmap_read_evlist()
1602 if (!record__threads_enabled(rec) && bytes_written != rec->bytes_written) in record__mmap_read_evlist()
1603 rc = record__write(rec, NULL, &finished_round_event, sizeof(finished_round_event)); in record__mmap_read_evlist()
1611 static int record__mmap_read_all(struct record *rec, bool synch) in record__mmap_read_all() argument
1615 err = record__mmap_read_evlist(rec, rec->evlist, false, synch); in record__mmap_read_all()
1619 return record__mmap_read_evlist(rec, rec->evlist, true, synch); in record__mmap_read_all()
1654 if (record__mmap_read_all(thread->rec, false) < 0 || terminate) in record__thread()
1683 record__mmap_read_all(thread->rec, true); in record__thread()
1693 static void record__init_features(struct record *rec) in record__init_features() argument
1695 struct perf_session *session = rec->session; in record__init_features()
1701 if (rec->no_buildid) in record__init_features()
1704 if (!have_tracepoints(&rec->evlist->core.entries)) in record__init_features()
1707 if (!rec->opts.branch_stack) in record__init_features()
1710 if (!rec->opts.full_auxtrace) in record__init_features()
1713 if (!(rec->opts.use_clockid && rec->opts.clockid_res_ns)) in record__init_features()
1716 if (!rec->opts.use_clockid) in record__init_features()
1719 if (!record__threads_enabled(rec)) in record__init_features()
1722 if (!record__comp_enabled(rec)) in record__init_features()
1729 record__finish_output(struct record *rec) in record__finish_output() argument
1732 struct perf_data *data = &rec->data; in record__finish_output()
1738 rec->session->header.data_size += rec->bytes_written; in record__finish_output()
1740 if (record__threads_enabled(rec)) { in record__finish_output()
1745 if (!rec->no_buildid) { in record__finish_output()
1746 process_buildids(rec); in record__finish_output()
1748 if (rec->buildid_all) in record__finish_output()
1749 dsos__hit_all(rec->session); in record__finish_output()
1751 perf_session__write_header(rec->session, rec->evlist, fd, true); in record__finish_output()
1756 static int record__synthesize_workload(struct record *rec, bool tail) in record__synthesize_workload() argument
1760 bool needs_mmap = rec->opts.synth & PERF_SYNTH_MMAP; in record__synthesize_workload()
1762 if (rec->opts.tail_synthesize != tail) in record__synthesize_workload()
1765 thread_map = thread_map__new_by_tid(rec->evlist->workload.pid); in record__synthesize_workload()
1769 err = perf_event__synthesize_thread_map(&rec->tool, thread_map, in record__synthesize_workload()
1771 &rec->session->machines.host, in record__synthesize_workload()
1773 rec->opts.sample_address); in record__synthesize_workload()
1778 static int write_finished_init(struct record *rec, bool tail) in write_finished_init() argument
1780 if (rec->opts.tail_synthesize != tail) in write_finished_init()
1783 return record__write(rec, NULL, &finished_init_event, sizeof(finished_init_event)); in write_finished_init()
1786 static int record__synthesize(struct record *rec, bool tail);
1789 record__switch_output(struct record *rec, bool at_exit) in record__switch_output() argument
1791 struct perf_data *data = &rec->data; in record__switch_output()
1798 record__aio_mmap_read_sync(rec); in record__switch_output()
1800 write_finished_init(rec, true); in record__switch_output()
1802 record__synthesize(rec, true); in record__switch_output()
1803 if (target__none(&rec->opts.target)) in record__switch_output()
1804 record__synthesize_workload(rec, true); in record__switch_output()
1806 rec->samples = 0; in record__switch_output()
1807 record__finish_output(rec); in record__switch_output()
1815 rec->session->header.data_offset, in record__switch_output()
1818 rec->bytes_written = 0; in record__switch_output()
1819 rec->session->header.data_size = 0; in record__switch_output()
1826 if (rec->switch_output.num_files) { in record__switch_output()
1827 int n = rec->switch_output.cur_file + 1; in record__switch_output()
1829 if (n >= rec->switch_output.num_files) in record__switch_output()
1831 rec->switch_output.cur_file = n; in record__switch_output()
1832 if (rec->switch_output.filenames[n]) { in record__switch_output()
1833 remove(rec->switch_output.filenames[n]); in record__switch_output()
1834 zfree(&rec->switch_output.filenames[n]); in record__switch_output()
1836 rec->switch_output.filenames[n] = new_filename; in record__switch_output()
1843 record__synthesize(rec, false); in record__switch_output()
1854 if (target__none(&rec->opts.target)) in record__switch_output()
1855 record__synthesize_workload(rec, false); in record__switch_output()
1856 write_finished_init(rec, false); in record__switch_output()
1861 static void __record__read_lost_samples(struct record *rec, struct evsel *evsel, in __record__read_lost_samples() argument
1887 record__write(rec, NULL, lost, lost->header.size); in __record__read_lost_samples()
1890 static void record__read_lost_samples(struct record *rec) in record__read_lost_samples() argument
1892 struct perf_session *session = rec->session; in record__read_lost_samples()
1921 __record__read_lost_samples(rec, evsel, lost, x, y); in record__read_lost_samples()
1959 static const struct perf_event_mmap_page *record__pick_pc(struct record *rec) in record__pick_pc() argument
1961 const struct perf_event_mmap_page *pc = evlist__pick_pc(rec->evlist); in record__pick_pc()
1967 static int record__synthesize(struct record *rec, bool tail) in record__synthesize() argument
1969 struct perf_session *session = rec->session; in record__synthesize()
1971 struct perf_data *data = &rec->data; in record__synthesize()
1972 struct record_opts *opts = &rec->opts; in record__synthesize()
1973 struct perf_tool *tool = &rec->tool; in record__synthesize()
1977 if (rec->opts.tail_synthesize != tail) in record__synthesize()
1986 rec->bytes_written += err; in record__synthesize()
1989 err = perf_event__synth_time_conv(record__pick_pc(rec), tool, in record__synthesize()
2001 if (rec->opts.full_auxtrace) { in record__synthesize()
2002 err = perf_event__synthesize_auxtrace_info(rec->itr, tool, in record__synthesize()
2008 if (!evlist__exclude_kernel(rec->evlist)) { in record__synthesize()
2027 err = perf_event__synthesize_extra_attr(&rec->tool, in record__synthesize()
2028 rec->evlist, in record__synthesize()
2034 err = perf_event__synthesize_thread_map2(&rec->tool, rec->evlist->core.threads, in record__synthesize()
2042 err = perf_event__synthesize_cpu_map(&rec->tool, rec->evlist->core.all_cpus, in record__synthesize()
2056 if (rec->opts.synth & PERF_SYNTH_CGROUP) { in record__synthesize()
2065 if (rec->opts.nr_threads_synthesize > 1) { in record__synthesize()
2071 if (rec->opts.synth & PERF_SYNTH_TASK) { in record__synthesize()
2072 bool needs_mmap = rec->opts.synth & PERF_SYNTH_MMAP; in record__synthesize()
2075 rec->evlist->core.threads, in record__synthesize()
2077 rec->opts.nr_threads_synthesize); in record__synthesize()
2080 if (rec->opts.nr_threads_synthesize > 1) { in record__synthesize()
2091 struct record *rec = data; in record__process_signal_event() local
2092 pthread_kill(rec->thread_id, SIGUSR2); in record__process_signal_event()
2096 static int record__setup_sb_evlist(struct record *rec) in record__setup_sb_evlist() argument
2098 struct record_opts *opts = &rec->opts; in record__setup_sb_evlist()
2100 if (rec->sb_evlist != NULL) { in record__setup_sb_evlist()
2106 evlist__set_cb(rec->sb_evlist, record__process_signal_event, rec); in record__setup_sb_evlist()
2107 rec->thread_id = pthread_self(); in record__setup_sb_evlist()
2111 if (rec->sb_evlist == NULL) { in record__setup_sb_evlist()
2112 rec->sb_evlist = evlist__new(); in record__setup_sb_evlist()
2114 if (rec->sb_evlist == NULL) { in record__setup_sb_evlist()
2120 if (evlist__add_bpf_sb_event(rec->sb_evlist, &rec->session->header.env)) { in record__setup_sb_evlist()
2126 if (evlist__start_sb_thread(rec->sb_evlist, &rec->opts.target)) { in record__setup_sb_evlist()
2134 static int record__init_clock(struct record *rec) in record__init_clock() argument
2136 struct perf_session *session = rec->session; in record__init_clock()
2141 if (!rec->opts.use_clockid) in record__init_clock()
2144 if (rec->opts.use_clockid && rec->opts.clockid_res_ns) in record__init_clock()
2145 session->header.env.clock.clockid_res_ns = rec->opts.clockid_res_ns; in record__init_clock()
2147 session->header.env.clock.clockid = rec->opts.clockid; in record__init_clock()
2154 if (clock_gettime(rec->opts.clockid, &ref_clockid)) { in record__init_clock()
2171 static void hit_auxtrace_snapshot_trigger(struct record *rec) in hit_auxtrace_snapshot_trigger() argument
2176 if (auxtrace_record__snapshot_start(rec->itr)) in hit_auxtrace_snapshot_trigger()
2181 static void record__uniquify_name(struct record *rec) in record__uniquify_name() argument
2184 struct evlist *evlist = rec->evlist; in record__uniquify_name()
2225 static int record__start_threads(struct record *rec) in record__start_threads() argument
2227 int t, tt, err, ret = 0, nr_threads = rec->nr_threads; in record__start_threads()
2228 struct record_thread *thread_data = rec->thread_data; in record__start_threads()
2235 if (!record__threads_enabled(rec)) in record__start_threads()
2265 pr_debug2("threads[%d]: sent %s\n", rec->thread_data[t].tid, in record__start_threads()
2269 thread->tid, rec->thread_data[t].tid); in record__start_threads()
2288 static int record__stop_threads(struct record *rec) in record__stop_threads() argument
2291 struct record_thread *thread_data = rec->thread_data; in record__stop_threads()
2293 for (t = 1; t < rec->nr_threads; t++) in record__stop_threads()
2296 for (t = 0; t < rec->nr_threads; t++) { in record__stop_threads()
2297 rec->samples += thread_data[t].samples; in record__stop_threads()
2298 if (!record__threads_enabled(rec)) in record__stop_threads()
2300 rec->session->bytes_transferred += thread_data[t].bytes_transferred; in record__stop_threads()
2301 rec->session->bytes_compressed += thread_data[t].bytes_compressed; in record__stop_threads()
2314 static unsigned long record__waking(struct record *rec) in record__waking() argument
2318 struct record_thread *thread_data = rec->thread_data; in record__waking()
2320 for (t = 0; t < rec->nr_threads; t++) in record__waking()
2326 static int __cmd_record(struct record *rec, int argc, const char **argv) in __cmd_record() argument
2331 struct perf_tool *tool = &rec->tool; in __cmd_record()
2332 struct record_opts *opts = &rec->opts; in __cmd_record()
2333 struct perf_data *data = &rec->data; in __cmd_record()
2346 if (rec->opts.record_namespaces) in __cmd_record()
2349 if (rec->opts.record_cgroup) { in __cmd_record()
2358 if (rec->opts.auxtrace_snapshot_mode || rec->switch_output.enabled) { in __cmd_record()
2360 if (rec->opts.auxtrace_snapshot_mode) in __cmd_record()
2362 if (rec->switch_output.enabled) in __cmd_record()
2374 if (record__threads_enabled(rec)) { in __cmd_record()
2375 if (perf_data__is_pipe(&rec->data)) { in __cmd_record()
2379 if (rec->opts.full_auxtrace) { in __cmd_record()
2386 rec->session = session; in __cmd_record()
2388 if (zstd_init(&session->zstd_data, rec->opts.comp_level) < 0) { in __cmd_record()
2399 err = evlist__add_wakeup_eventfd(rec->evlist, done_fd); in __cmd_record()
2408 session->header.env.comp_level = rec->opts.comp_level; in __cmd_record()
2410 if (rec->opts.kcore && in __cmd_record()
2416 if (record__init_clock(rec)) in __cmd_record()
2419 record__init_features(rec); in __cmd_record()
2422 err = evlist__prepare_workload(rec->evlist, &opts->target, argv, data->is_pipe, in __cmd_record()
2437 if (data->is_pipe && rec->evlist->core.nr_entries == 1) in __cmd_record()
2438 rec->opts.sample_id = true; in __cmd_record()
2440 record__uniquify_name(rec); in __cmd_record()
2444 if (record__open(rec) != 0) { in __cmd_record()
2452 if (rec->opts.kcore) { in __cmd_record()
2474 if (rec->tool.ordered_events && !evlist__sample_id_all(rec->evlist)) { in __cmd_record()
2476 rec->tool.ordered_events = false; in __cmd_record()
2479 if (!rec->evlist->core.nr_groups) in __cmd_record()
2487 err = perf_session__write_header(session, rec->evlist, fd, false); in __cmd_record()
2493 if (!rec->no_buildid in __cmd_record()
2500 err = record__setup_sb_evlist(rec); in __cmd_record()
2504 err = record__synthesize(rec, false); in __cmd_record()
2508 if (rec->realtime_prio) { in __cmd_record()
2511 param.sched_priority = rec->realtime_prio; in __cmd_record()
2519 if (record__start_threads(rec)) in __cmd_record()
2528 evlist__enable(rec->evlist); in __cmd_record()
2551 rec->evlist->workload.pid, in __cmd_record()
2571 rec->evlist->workload.pid, in __cmd_record()
2576 evlist__start_workload(rec->evlist); in __cmd_record()
2583 evlist__enable(rec->evlist); in __cmd_record()
2588 err = event_enable_timer__start(rec->evlist->eet); in __cmd_record()
2604 err = write_finished_init(rec, false); in __cmd_record()
2620 evlist__toggle_bkw_mmap(rec->evlist, BKW_MMAP_DATA_PENDING); in __cmd_record()
2622 if (record__mmap_read_all(rec, false) < 0) { in __cmd_record()
2632 record__read_auxtrace_snapshot(rec, false); in __cmd_record()
2650 if (rec->evlist->bkw_mmap_state == BKW_MMAP_RUNNING) in __cmd_record()
2659 evlist__toggle_bkw_mmap(rec->evlist, BKW_MMAP_RUNNING); in __cmd_record()
2663 record__waking(rec)); in __cmd_record()
2665 fd = record__switch_output(rec, false); in __cmd_record()
2674 if (rec->switch_output.time) in __cmd_record()
2675 alarm(rec->switch_output.time); in __cmd_record()
2694 err = record__update_evlist_pollfd_from_thread(rec, rec->evlist, thread); in __cmd_record()
2699 if (evlist__ctlfd_process(rec->evlist, &cmd) > 0) { in __cmd_record()
2702 hit_auxtrace_snapshot_trigger(rec); in __cmd_record()
2703 evlist__ctlfd_ack(rec->evlist); in __cmd_record()
2719 err = event_enable_timer__process(rec->evlist->eet); in __cmd_record()
2734 evlist__disable(rec->evlist); in __cmd_record()
2743 record__auxtrace_snapshot_exit(rec); in __cmd_record()
2749 evlist__scnprintf_evsels(rec->evlist, sizeof(strevsels), strevsels); in __cmd_record()
2759 record__waking(rec)); in __cmd_record()
2761 write_finished_init(rec, true); in __cmd_record()
2763 if (target__none(&rec->opts.target)) in __cmd_record()
2764 record__synthesize_workload(rec, true); in __cmd_record()
2767 record__stop_threads(rec); in __cmd_record()
2768 record__mmap_read_all(rec, true); in __cmd_record()
2770 record__free_thread_data(rec); in __cmd_record()
2771 evlist__finalize_ctlfd(rec->evlist); in __cmd_record()
2772 record__aio_mmap_read_sync(rec); in __cmd_record()
2774 if (rec->session->bytes_transferred && rec->session->bytes_compressed) { in __cmd_record()
2775 ratio = (float)rec->session->bytes_transferred/(float)rec->session->bytes_compressed; in __cmd_record()
2783 kill(rec->evlist->workload.pid, SIGTERM); in __cmd_record()
2796 if (rec->off_cpu) in __cmd_record()
2797 rec->bytes_written += off_cpu_write(rec->session); in __cmd_record()
2799 record__read_lost_samples(rec); in __cmd_record()
2800 record__synthesize(rec, true); in __cmd_record()
2802 rec->samples = 0; in __cmd_record()
2805 if (!rec->timestamp_filename) { in __cmd_record()
2806 record__finish_output(rec); in __cmd_record()
2808 fd = record__switch_output(rec, true); in __cmd_record()
2820 const char *postfix = rec->timestamp_filename ? in __cmd_record()
2823 if (rec->samples && !rec->opts.full_auxtrace) in __cmd_record()
2825 " (%" PRIu64 " samples)", rec->samples); in __cmd_record()
2834 rec->session->bytes_transferred / 1024.0 / 1024.0, in __cmd_record()
2853 evlist__stop_sb_thread(rec->sb_evlist); in __cmd_record()
2917 struct record *rec = cb; in perf_record_config() local
2921 rec->no_buildid_cache = false; in perf_record_config()
2923 rec->no_buildid_cache = true; in perf_record_config()
2925 rec->no_buildid = true; in perf_record_config()
2927 rec->buildid_mmap = true; in perf_record_config()
2938 rec->opts.nr_cblocks = strtol(value, NULL, 0); in perf_record_config()
2939 if (!rec->opts.nr_cblocks) in perf_record_config()
2940 rec->opts.nr_cblocks = nr_cblocks_default; in perf_record_config()
2944 rec->debuginfod.urls = strdup(value); in perf_record_config()
2945 if (!rec->debuginfod.urls) in perf_record_config()
2947 rec->debuginfod.set = true; in perf_record_config()
2955 struct record *rec = (struct record *)opt->value; in record__parse_event_enable_time() local
2957 return evlist__parse_event_enable_time(rec->evlist, &rec->opts, str, unset); in record__parse_event_enable_time()
3130 static void switch_output_size_warn(struct record *rec) in switch_output_size_warn() argument
3132 u64 wakeup_size = evlist__mmap_size(rec->opts.mmap_pages); in switch_output_size_warn()
3133 struct switch_output *s = &rec->switch_output; in switch_output_size_warn()
3147 static int switch_output_setup(struct record *rec) in switch_output_setup() argument
3149 struct switch_output *s = &rec->switch_output; in switch_output_setup()
3171 if (rec->switch_output_event_set) { in switch_output_setup()
3172 if (record__threads_enabled(rec)) { in switch_output_setup()
3182 if (record__threads_enabled(rec)) { in switch_output_setup()
3212 rec->timestamp_filename = true; in switch_output_setup()
3215 if (s->size && !rec->opts.no_buffering) in switch_output_setup()
3216 switch_output_size_warn(rec); in switch_output_setup()
3258 struct record *rec = container_of(tool, struct record, tool); in process_timestamp_boundary() local
3260 set_timestamp_boundary(rec, sample->time); in process_timestamp_boundary()
3581 static void record__free_thread_masks(struct record *rec, int nr_threads) in record__free_thread_masks() argument
3585 if (rec->thread_masks) in record__free_thread_masks()
3587 record__thread_mask_free(&rec->thread_masks[t]); in record__free_thread_masks()
3589 zfree(&rec->thread_masks); in record__free_thread_masks()
3592 static int record__alloc_thread_masks(struct record *rec, int nr_threads, int nr_bits) in record__alloc_thread_masks() argument
3596 rec->thread_masks = zalloc(nr_threads * sizeof(*(rec->thread_masks))); in record__alloc_thread_masks()
3597 if (!rec->thread_masks) { in record__alloc_thread_masks()
3603 ret = record__thread_mask_alloc(&rec->thread_masks[t], nr_bits); in record__alloc_thread_masks()
3613 record__free_thread_masks(rec, nr_threads); in record__alloc_thread_masks()
3618 static int record__init_thread_cpu_masks(struct record *rec, struct perf_cpu_map *cpus) in record__init_thread_cpu_masks() argument
3622 ret = record__alloc_thread_masks(rec, nr_cpus, cpu__max_cpu().cpu); in record__init_thread_cpu_masks()
3626 rec->nr_threads = nr_cpus; in record__init_thread_cpu_masks()
3627 pr_debug("nr_threads: %d\n", rec->nr_threads); in record__init_thread_cpu_masks()
3629 for (t = 0; t < rec->nr_threads; t++) { in record__init_thread_cpu_masks()
3630 set_bit(perf_cpu_map__cpu(cpus, t).cpu, rec->thread_masks[t].maps.bits); in record__init_thread_cpu_masks()
3631 set_bit(perf_cpu_map__cpu(cpus, t).cpu, rec->thread_masks[t].affinity.bits); in record__init_thread_cpu_masks()
3634 mmap_cpu_mask__scnprintf(&rec->thread_masks[t].maps, "maps"); in record__init_thread_cpu_masks()
3636 mmap_cpu_mask__scnprintf(&rec->thread_masks[t].affinity, "affinity"); in record__init_thread_cpu_masks()
3643 static int record__init_thread_masks_spec(struct record *rec, struct perf_cpu_map *cpus, in record__init_thread_masks_spec() argument
3721 thread_masks = realloc(rec->thread_masks, (t + 1) * sizeof(struct thread_mask)); in record__init_thread_masks_spec()
3727 rec->thread_masks = thread_masks; in record__init_thread_masks_spec()
3728 rec->thread_masks[t] = thread_mask; in record__init_thread_masks_spec()
3731 mmap_cpu_mask__scnprintf(&rec->thread_masks[t].maps, "maps"); in record__init_thread_masks_spec()
3733 mmap_cpu_mask__scnprintf(&rec->thread_masks[t].affinity, "affinity"); in record__init_thread_masks_spec()
3742 rec->nr_threads = t; in record__init_thread_masks_spec()
3743 pr_debug("nr_threads: %d\n", rec->nr_threads); in record__init_thread_masks_spec()
3744 if (!rec->nr_threads) in record__init_thread_masks_spec()
3757 static int record__init_thread_core_masks(struct record *rec, struct perf_cpu_map *cpus) in record__init_thread_core_masks() argument
3768 ret = record__init_thread_masks_spec(rec, cpus, topo->core_cpus_list, in record__init_thread_core_masks()
3775 static int record__init_thread_package_masks(struct record *rec, struct perf_cpu_map *cpus) in record__init_thread_package_masks() argument
3786 ret = record__init_thread_masks_spec(rec, cpus, topo->package_cpus_list, in record__init_thread_package_masks()
3793 static int record__init_thread_numa_masks(struct record *rec, struct perf_cpu_map *cpus) in record__init_thread_numa_masks() argument
3815 ret = record__init_thread_masks_spec(rec, cpus, spec, spec, topo->nr); in record__init_thread_numa_masks()
3825 static int record__init_thread_user_masks(struct record *rec, struct perf_cpu_map *cpus) in record__init_thread_user_masks() argument
3832 for (t = 0, user_spec = (char *)rec->opts.threads_user_spec; ; t++, user_spec = NULL) { in record__init_thread_user_masks()
3878 ret = record__init_thread_masks_spec(rec, cpus, (const char **)maps_spec, in record__init_thread_user_masks()
3895 static int record__init_thread_default_masks(struct record *rec, struct perf_cpu_map *cpus) in record__init_thread_default_masks() argument
3899 ret = record__alloc_thread_masks(rec, 1, cpu__max_cpu().cpu); in record__init_thread_default_masks()
3903 if (record__mmap_cpu_mask_init(&rec->thread_masks->maps, cpus)) in record__init_thread_default_masks()
3906 rec->nr_threads = 1; in record__init_thread_default_masks()
3911 static int record__init_thread_masks(struct record *rec) in record__init_thread_masks() argument
3914 struct perf_cpu_map *cpus = rec->evlist->core.all_cpus; in record__init_thread_masks()
3916 if (!record__threads_enabled(rec)) in record__init_thread_masks()
3917 return record__init_thread_default_masks(rec, cpus); in record__init_thread_masks()
3919 if (evlist__per_thread(rec->evlist)) { in record__init_thread_masks()
3924 switch (rec->opts.threads_spec) { in record__init_thread_masks()
3926 ret = record__init_thread_cpu_masks(rec, cpus); in record__init_thread_masks()
3929 ret = record__init_thread_core_masks(rec, cpus); in record__init_thread_masks()
3932 ret = record__init_thread_package_masks(rec, cpus); in record__init_thread_masks()
3935 ret = record__init_thread_numa_masks(rec, cpus); in record__init_thread_masks()
3938 ret = record__init_thread_user_masks(rec, cpus); in record__init_thread_masks()
3950 struct record *rec = &record; in cmd_record() local
3982 rec->opts.affinity = PERF_AFFINITY_SYS; in cmd_record()
3984 rec->evlist = evlist__new(); in cmd_record()
3985 if (rec->evlist == NULL) in cmd_record()
3988 err = perf_config(perf_record_config, rec); in cmd_record()
4004 if (!argc && target__none(&rec->opts.target)) in cmd_record()
4005 rec->opts.target.system_wide = true; in cmd_record()
4007 if (nr_cgroups && !rec->opts.target.system_wide) { in cmd_record()
4013 if (rec->buildid_mmap) { in cmd_record()
4023 rec->opts.build_id = true; in cmd_record()
4025 rec->no_buildid = true; in cmd_record()
4028 if (rec->opts.record_cgroup && !perf_can_record_cgroup()) { in cmd_record()
4034 if (rec->opts.kcore) in cmd_record()
4035 rec->opts.text_poke = true; in cmd_record()
4037 if (rec->opts.kcore || record__threads_enabled(rec)) in cmd_record()
4038 rec->data.is_dir = true; in cmd_record()
4040 if (record__threads_enabled(rec)) { in cmd_record()
4041 if (rec->opts.affinity != PERF_AFFINITY_SYS) { in cmd_record()
4045 if (record__aio_enabled(rec)) { in cmd_record()
4051 if (rec->opts.comp_level != 0) { in cmd_record()
4053 rec->no_buildid = true; in cmd_record()
4056 if (rec->opts.record_switch_events && in cmd_record()
4064 if (switch_output_setup(rec)) { in cmd_record()
4070 if (rec->switch_output.time) { in cmd_record()
4072 alarm(rec->switch_output.time); in cmd_record()
4075 if (rec->switch_output.num_files) { in cmd_record()
4076 rec->switch_output.filenames = calloc(sizeof(char *), in cmd_record()
4077 rec->switch_output.num_files); in cmd_record()
4078 if (!rec->switch_output.filenames) { in cmd_record()
4084 if (rec->timestamp_filename && record__threads_enabled(rec)) { in cmd_record()
4085 rec->timestamp_filename = false; in cmd_record()
4097 err = record__auxtrace_init(rec); in cmd_record()
4104 err = bpf__setup_stdout(rec->evlist); in cmd_record()
4106 bpf__strerror_setup_stdout(rec->evlist, err, errbuf, sizeof(errbuf)); in cmd_record()
4114 if (rec->no_buildid_cache || rec->no_buildid) { in cmd_record()
4116 } else if (rec->switch_output.enabled) { in cmd_record()
4134 if (rec->no_buildid_set && !rec->no_buildid) in cmd_record()
4136 if (rec->no_buildid_cache_set && !rec->no_buildid_cache) in cmd_record()
4139 rec->no_buildid = true; in cmd_record()
4140 rec->no_buildid_cache = true; in cmd_record()
4148 if (rec->evlist->core.nr_entries == 0) { in cmd_record()
4150 err = evlist__add_default_hybrid(rec->evlist, in cmd_record()
4153 err = __evlist__add_default(rec->evlist, in cmd_record()
4163 if (rec->opts.target.tid && !rec->opts.no_inherit_set) in cmd_record()
4164 rec->opts.no_inherit = true; in cmd_record()
4166 err = target__validate(&rec->opts.target); in cmd_record()
4168 target__strerror(&rec->opts.target, err, errbuf, BUFSIZ); in cmd_record()
4172 err = target__parse_uid(&rec->opts.target); in cmd_record()
4176 target__strerror(&rec->opts.target, err, errbuf, BUFSIZ); in cmd_record()
4184 rec->opts.ignore_missing_thread = rec->opts.target.uid != UINT_MAX || rec->opts.target.pid; in cmd_record()
4186 if (evlist__fix_hybrid_cpus(rec->evlist, rec->opts.target.cpu_list)) { in cmd_record()
4188 rec->opts.target.cpu_list); in cmd_record()
4192 rec->opts.target.hybrid = perf_pmu__has_hybrid(); in cmd_record()
4195 arch__add_leaf_frame_record_opts(&rec->opts); in cmd_record()
4198 if (evlist__create_maps(rec->evlist, &rec->opts.target) < 0) { in cmd_record()
4199 if (rec->opts.target.pid != NULL) { in cmd_record()
4208 err = auxtrace_record__options(rec->itr, rec->evlist, &rec->opts); in cmd_record()
4217 if (rec->opts.full_auxtrace) in cmd_record()
4218 rec->buildid_all = true; in cmd_record()
4220 if (rec->opts.text_poke) { in cmd_record()
4221 err = record__config_text_poke(rec->evlist); in cmd_record()
4228 if (rec->off_cpu) { in cmd_record()
4229 err = record__config_off_cpu(rec); in cmd_record()
4236 if (record_opts__config(&rec->opts)) { in cmd_record()
4241 err = record__init_thread_masks(rec); in cmd_record()
4247 if (rec->opts.nr_cblocks > nr_cblocks_max) in cmd_record()
4248 rec->opts.nr_cblocks = nr_cblocks_max; in cmd_record()
4249 pr_debug("nr_cblocks: %d\n", rec->opts.nr_cblocks); in cmd_record()
4251 pr_debug("affinity: %s\n", affinity_tags[rec->opts.affinity]); in cmd_record()
4252 pr_debug("mmap flush: %d\n", rec->opts.mmap_flush); in cmd_record()
4254 if (rec->opts.comp_level > comp_level_max) in cmd_record()
4255 rec->opts.comp_level = comp_level_max; in cmd_record()
4256 pr_debug("comp level: %d\n", rec->opts.comp_level); in cmd_record()
4260 evlist__delete(rec->evlist); in cmd_record()
4262 auxtrace_record__free(rec->itr); in cmd_record()
4264 record__free_thread_masks(rec, rec->nr_threads); in cmd_record()
4265 rec->nr_threads = 0; in cmd_record()
4266 evlist__close_control(rec->opts.ctl_fd, rec->opts.ctl_fd_ack, &rec->opts.ctl_fd_close); in cmd_record()
4272 struct record *rec = &record; in snapshot_sig_handler() local
4274 hit_auxtrace_snapshot_trigger(rec); in snapshot_sig_handler()
4276 if (switch_output_signal(rec)) in snapshot_sig_handler()
4282 struct record *rec = &record; in alarm_sig_handler() local
4284 if (switch_output_time(rec)) in alarm_sig_handler()