Lines Matching refs:rec

90 static bool switch_output_signal(struct record *rec)  in switch_output_signal()  argument
92 return rec->switch_output.signal && in switch_output_signal()
96 static bool switch_output_size(struct record *rec) in switch_output_size() argument
98 return rec->switch_output.size && in switch_output_size()
100 (rec->bytes_written >= rec->switch_output.size); in switch_output_size()
103 static bool switch_output_time(struct record *rec) in switch_output_time() argument
105 return rec->switch_output.time && in switch_output_time()
109 static int record__write(struct record *rec, void *bf, size_t size) in record__write() argument
111 if (perf_data__write(rec->session->data, bf, size) < 0) { in record__write()
116 rec->bytes_written += size; in record__write()
118 if (switch_output_size(rec)) in record__write()
129 struct record *rec = container_of(tool, struct record, tool); in process_synthesized_event() local
130 return record__write(rec, event, event->header.size); in process_synthesized_event()
135 struct record *rec = to; in record__pushfn() local
137 rec->samples++; in record__pushfn()
138 return record__write(rec, bf, size); in record__pushfn()
176 struct record *rec = container_of(tool, struct record, tool); in record__process_auxtrace() local
177 struct perf_data *data = &rec->data; in record__process_auxtrace()
189 err = auxtrace_index__auxtrace_event(&rec->session->auxtrace_index, in record__process_auxtrace()
200 record__write(rec, event, event->header.size); in record__process_auxtrace()
201 record__write(rec, data1, len1); in record__process_auxtrace()
203 record__write(rec, data2, len2); in record__process_auxtrace()
204 record__write(rec, &pad, padding); in record__process_auxtrace()
209 static int record__auxtrace_mmap_read(struct record *rec, in record__auxtrace_mmap_read() argument
214 ret = auxtrace_mmap__read(mm, rec->itr, &rec->tool, in record__auxtrace_mmap_read()
220 rec->samples++; in record__auxtrace_mmap_read()
225 static int record__auxtrace_mmap_read_snapshot(struct record *rec, in record__auxtrace_mmap_read_snapshot() argument
230 ret = auxtrace_mmap__read_snapshot(mm, rec->itr, &rec->tool, in record__auxtrace_mmap_read_snapshot()
232 rec->opts.auxtrace_snapshot_size); in record__auxtrace_mmap_read_snapshot()
237 rec->samples++; in record__auxtrace_mmap_read_snapshot()
242 static int record__auxtrace_read_snapshot_all(struct record *rec) in record__auxtrace_read_snapshot_all() argument
247 for (i = 0; i < rec->evlist->nr_mmaps; i++) { in record__auxtrace_read_snapshot_all()
249 &rec->evlist->mmap[i].auxtrace_mmap; in record__auxtrace_read_snapshot_all()
254 if (record__auxtrace_mmap_read_snapshot(rec, mm) != 0) { in record__auxtrace_read_snapshot_all()
263 static void record__read_auxtrace_snapshot(struct record *rec) in record__read_auxtrace_snapshot() argument
266 if (record__auxtrace_read_snapshot_all(rec) < 0) { in record__read_auxtrace_snapshot()
269 if (auxtrace_record__snapshot_finish(rec->itr)) in record__read_auxtrace_snapshot()
276 static int record__auxtrace_init(struct record *rec) in record__auxtrace_init() argument
280 if (!rec->itr) { in record__auxtrace_init()
281 rec->itr = auxtrace_record__init(rec->evlist, &err); in record__auxtrace_init()
286 err = auxtrace_parse_snapshot_options(rec->itr, &rec->opts, in record__auxtrace_init()
287 rec->opts.auxtrace_snapshot_opts); in record__auxtrace_init()
291 return auxtrace_parse_filters(rec->evlist); in record__auxtrace_init()
297 int record__auxtrace_mmap_read(struct record *rec __maybe_unused, in record__auxtrace_mmap_read()
304 void record__read_auxtrace_snapshot(struct record *rec __maybe_unused) in record__read_auxtrace_snapshot()
314 static int record__auxtrace_init(struct record *rec __maybe_unused) in record__auxtrace_init()
321 static int record__mmap_evlist(struct record *rec, in record__mmap_evlist() argument
324 struct record_opts *opts = &rec->opts; in record__mmap_evlist()
350 static int record__mmap(struct record *rec) in record__mmap() argument
352 return record__mmap_evlist(rec, rec->evlist); in record__mmap()
355 static int record__open(struct record *rec) in record__open() argument
359 struct perf_evlist *evlist = rec->evlist; in record__open()
360 struct perf_session *session = rec->session; in record__open()
361 struct record_opts *opts = &rec->opts; in record__open()
418 rc = record__mmap(rec); in record__open()
434 struct record *rec = container_of(tool, struct record, tool); in process_sample_event() local
436 if (rec->evlist->first_sample_time == 0) in process_sample_event()
437 rec->evlist->first_sample_time = sample->time; in process_sample_event()
439 rec->evlist->last_sample_time = sample->time; in process_sample_event()
441 if (rec->buildid_all) in process_sample_event()
444 rec->samples++; in process_sample_event()
448 static int process_buildids(struct record *rec) in process_buildids() argument
450 struct perf_data *data = &rec->data; in process_buildids()
451 struct perf_session *session = rec->session; in process_buildids()
473 if (rec->buildid_all && !rec->timestamp_boundary) in process_buildids()
474 rec->tool.sample = NULL; in process_buildids()
513 static int record__mmap_read_evlist(struct record *rec, struct perf_evlist *evlist, in record__mmap_read_evlist() argument
516 u64 bytes_written = rec->bytes_written; in record__mmap_read_evlist()
535 if (perf_mmap__push(&maps[i], rec, record__pushfn) != 0) { in record__mmap_read_evlist()
541 if (mm->base && !rec->opts.auxtrace_snapshot_mode && in record__mmap_read_evlist()
542 record__auxtrace_mmap_read(rec, mm) != 0) { in record__mmap_read_evlist()
552 if (bytes_written != rec->bytes_written) in record__mmap_read_evlist()
553 rc = record__write(rec, &finished_round_event, sizeof(finished_round_event)); in record__mmap_read_evlist()
561 static int record__mmap_read_all(struct record *rec) in record__mmap_read_all() argument
565 err = record__mmap_read_evlist(rec, rec->evlist, false); in record__mmap_read_all()
569 return record__mmap_read_evlist(rec, rec->evlist, true); in record__mmap_read_all()
572 static void record__init_features(struct record *rec) in record__init_features() argument
574 struct perf_session *session = rec->session; in record__init_features()
580 if (rec->no_buildid) in record__init_features()
583 if (!have_tracepoints(&rec->evlist->entries)) in record__init_features()
586 if (!rec->opts.branch_stack) in record__init_features()
589 if (!rec->opts.full_auxtrace) in record__init_features()
596 record__finish_output(struct record *rec) in record__finish_output() argument
598 struct perf_data *data = &rec->data; in record__finish_output()
604 rec->session->header.data_size += rec->bytes_written; in record__finish_output()
607 if (!rec->no_buildid) { in record__finish_output()
608 process_buildids(rec); in record__finish_output()
610 if (rec->buildid_all) in record__finish_output()
611 dsos__hit_all(rec->session); in record__finish_output()
613 perf_session__write_header(rec->session, rec->evlist, fd, true); in record__finish_output()
618 static int record__synthesize_workload(struct record *rec, bool tail) in record__synthesize_workload() argument
623 if (rec->opts.tail_synthesize != tail) in record__synthesize_workload()
626 thread_map = thread_map__new_by_tid(rec->evlist->workload.pid); in record__synthesize_workload()
630 err = perf_event__synthesize_thread_map(&rec->tool, thread_map, in record__synthesize_workload()
632 &rec->session->machines.host, in record__synthesize_workload()
633 rec->opts.sample_address, in record__synthesize_workload()
634 rec->opts.proc_map_timeout); in record__synthesize_workload()
639 static int record__synthesize(struct record *rec, bool tail);
642 record__switch_output(struct record *rec, bool at_exit) in record__switch_output() argument
644 struct perf_data *data = &rec->data; in record__switch_output()
650 record__synthesize(rec, true); in record__switch_output()
651 if (target__none(&rec->opts.target)) in record__switch_output()
652 record__synthesize_workload(rec, true); in record__switch_output()
654 rec->samples = 0; in record__switch_output()
655 record__finish_output(rec); in record__switch_output()
663 rec->session->header.data_offset, in record__switch_output()
666 rec->bytes_written = 0; in record__switch_output()
667 rec->session->header.data_size = 0; in record__switch_output()
676 record__synthesize(rec, false); in record__switch_output()
687 if (target__none(&rec->opts.target)) in record__switch_output()
688 record__synthesize_workload(rec, false); in record__switch_output()
733 static const struct perf_event_mmap_page *record__pick_pc(struct record *rec) in record__pick_pc() argument
737 pc = perf_evlist__pick_pc(rec->evlist); in record__pick_pc()
743 static int record__synthesize(struct record *rec, bool tail) in record__synthesize() argument
745 struct perf_session *session = rec->session; in record__synthesize()
747 struct perf_data *data = &rec->data; in record__synthesize()
748 struct record_opts *opts = &rec->opts; in record__synthesize()
749 struct perf_tool *tool = &rec->tool; in record__synthesize()
753 if (rec->opts.tail_synthesize != tail) in record__synthesize()
768 err = perf_event__synthesize_features(tool, session, rec->evlist, in record__synthesize()
775 if (have_tracepoints(&rec->evlist->entries)) { in record__synthesize()
784 err = perf_event__synthesize_tracing_data(tool, fd, rec->evlist, in record__synthesize()
790 rec->bytes_written += err; in record__synthesize()
794 err = perf_event__synth_time_conv(record__pick_pc(rec), tool, in record__synthesize()
799 if (rec->opts.full_auxtrace) { in record__synthesize()
800 err = perf_event__synthesize_auxtrace_info(rec->itr, tool, in record__synthesize()
806 if (!perf_evlist__exclude_kernel(rec->evlist)) { in record__synthesize()
825 err = perf_event__synthesize_extra_attr(&rec->tool, in record__synthesize()
826 rec->evlist, in record__synthesize()
832 err = perf_event__synthesize_thread_map2(&rec->tool, rec->evlist->threads, in record__synthesize()
840 err = perf_event__synthesize_cpu_map(&rec->tool, rec->evlist->cpus, in record__synthesize()
847 err = __machine__synthesize_threads(machine, tool, &opts->target, rec->evlist->threads, in record__synthesize()
854 static int __cmd_record(struct record *rec, int argc, const char **argv) in __cmd_record() argument
860 struct perf_tool *tool = &rec->tool; in __cmd_record()
861 struct record_opts *opts = &rec->opts; in __cmd_record()
862 struct perf_data *data = &rec->data; in __cmd_record()
873 if (rec->opts.record_namespaces) in __cmd_record()
876 if (rec->opts.auxtrace_snapshot_mode || rec->switch_output.enabled) { in __cmd_record()
878 if (rec->opts.auxtrace_snapshot_mode) in __cmd_record()
880 if (rec->switch_output.enabled) in __cmd_record()
893 rec->session = session; in __cmd_record()
895 record__init_features(rec); in __cmd_record()
898 err = perf_evlist__prepare_workload(rec->evlist, &opts->target, in __cmd_record()
914 if (data->is_pipe && rec->evlist->nr_entries == 1) in __cmd_record()
915 rec->opts.sample_id = true; in __cmd_record()
917 if (record__open(rec) != 0) { in __cmd_record()
936 if (rec->tool.ordered_events && !perf_evlist__sample_id_all(rec->evlist)) { in __cmd_record()
938 rec->tool.ordered_events = false; in __cmd_record()
941 if (!rec->evlist->nr_groups) in __cmd_record()
949 err = perf_session__write_header(session, rec->evlist, fd, false); in __cmd_record()
954 if (!rec->no_buildid in __cmd_record()
962 err = record__synthesize(rec, false); in __cmd_record()
966 if (rec->realtime_prio) { in __cmd_record()
969 param.sched_priority = rec->realtime_prio; in __cmd_record()
983 perf_evlist__enable(rec->evlist); in __cmd_record()
1006 rec->evlist->workload.pid, in __cmd_record()
1026 rec->evlist->workload.pid, in __cmd_record()
1031 perf_evlist__start_workload(rec->evlist); in __cmd_record()
1036 perf_evlist__enable(rec->evlist); in __cmd_record()
1043 unsigned long long hits = rec->samples; in __cmd_record()
1054 perf_evlist__toggle_bkw_mmap(rec->evlist, BKW_MMAP_DATA_PENDING); in __cmd_record()
1056 if (record__mmap_read_all(rec) < 0) { in __cmd_record()
1066 record__read_auxtrace_snapshot(rec); in __cmd_record()
1084 if (rec->evlist->bkw_mmap_state == BKW_MMAP_RUNNING) in __cmd_record()
1093 perf_evlist__toggle_bkw_mmap(rec->evlist, BKW_MMAP_RUNNING); in __cmd_record()
1099 fd = record__switch_output(rec, false); in __cmd_record()
1108 if (rec->switch_output.time) in __cmd_record()
1109 alarm(rec->switch_output.time); in __cmd_record()
1112 if (hits == rec->samples) { in __cmd_record()
1115 err = perf_evlist__poll(rec->evlist, -1); in __cmd_record()
1124 if (perf_evlist__filter_pollfd(rec->evlist, POLLERR | POLLHUP) == 0) in __cmd_record()
1135 perf_evlist__disable(rec->evlist); in __cmd_record()
1153 if (target__none(&rec->opts.target)) in __cmd_record()
1154 record__synthesize_workload(rec, true); in __cmd_record()
1161 kill(rec->evlist->workload.pid, SIGTERM); in __cmd_record()
1174 record__synthesize(rec, true); in __cmd_record()
1176 rec->samples = 0; in __cmd_record()
1179 if (!rec->timestamp_filename) { in __cmd_record()
1180 record__finish_output(rec); in __cmd_record()
1182 fd = record__switch_output(rec, true); in __cmd_record()
1194 const char *postfix = rec->timestamp_filename ? in __cmd_record()
1197 if (rec->samples && !rec->opts.full_auxtrace) in __cmd_record()
1199 " (%" PRIu64 " samples)", rec->samples); in __cmd_record()
1273 struct record *rec = cb; in perf_record_config() local
1277 rec->no_buildid_cache = false; in perf_record_config()
1279 rec->no_buildid_cache = true; in perf_record_config()
1281 rec->no_buildid = true; in perf_record_config()
1421 static void switch_output_size_warn(struct record *rec) in switch_output_size_warn() argument
1423 u64 wakeup_size = perf_evlist__mmap_size(rec->opts.mmap_pages); in switch_output_size_warn()
1424 struct switch_output *s = &rec->switch_output; in switch_output_size_warn()
1438 static int switch_output_setup(struct record *rec) in switch_output_setup() argument
1440 struct switch_output *s = &rec->switch_output; in switch_output_setup()
1484 rec->timestamp_filename = true; in switch_output_setup()
1487 if (s->size && !rec->opts.no_buffering) in switch_output_setup()
1488 switch_output_size_warn(rec); in switch_output_setup()
1689 struct record *rec = &record; in cmd_record() local
1715 rec->evlist = perf_evlist__new(); in cmd_record()
1716 if (rec->evlist == NULL) in cmd_record()
1719 err = perf_config(perf_record_config, rec); in cmd_record()
1729 if (!argc && target__none(&rec->opts.target)) in cmd_record()
1730 rec->opts.target.system_wide = true; in cmd_record()
1732 if (nr_cgroups && !rec->opts.target.system_wide) { in cmd_record()
1737 if (rec->opts.record_switch_events && in cmd_record()
1744 if (switch_output_setup(rec)) { in cmd_record()
1749 if (rec->switch_output.time) { in cmd_record()
1751 alarm(rec->switch_output.time); in cmd_record()
1762 err = record__auxtrace_init(rec); in cmd_record()
1769 err = bpf__setup_stdout(rec->evlist); in cmd_record()
1771 bpf__strerror_setup_stdout(rec->evlist, err, errbuf, sizeof(errbuf)); in cmd_record()
1779 if (symbol_conf.kptr_restrict && !perf_evlist__exclude_kernel(rec->evlist)) in cmd_record()
1789 if (rec->no_buildid_cache || rec->no_buildid) { in cmd_record()
1791 } else if (rec->switch_output.enabled) { in cmd_record()
1809 if (rec->no_buildid_set && !rec->no_buildid) in cmd_record()
1811 if (rec->no_buildid_cache_set && !rec->no_buildid_cache) in cmd_record()
1814 rec->no_buildid = true; in cmd_record()
1815 rec->no_buildid_cache = true; in cmd_record()
1823 if (rec->evlist->nr_entries == 0 && in cmd_record()
1824 __perf_evlist__add_default(rec->evlist, !record.opts.no_samples) < 0) { in cmd_record()
1829 if (rec->opts.target.tid && !rec->opts.no_inherit_set) in cmd_record()
1830 rec->opts.no_inherit = true; in cmd_record()
1832 err = target__validate(&rec->opts.target); in cmd_record()
1834 target__strerror(&rec->opts.target, err, errbuf, BUFSIZ); in cmd_record()
1838 err = target__parse_uid(&rec->opts.target); in cmd_record()
1842 target__strerror(&rec->opts.target, err, errbuf, BUFSIZ); in cmd_record()
1850 rec->opts.ignore_missing_thread = rec->opts.target.uid != UINT_MAX || rec->opts.target.pid; in cmd_record()
1853 if (perf_evlist__create_maps(rec->evlist, &rec->opts.target) < 0) in cmd_record()
1856 err = auxtrace_record__options(rec->itr, rec->evlist, &rec->opts); in cmd_record()
1865 if (rec->opts.full_auxtrace) in cmd_record()
1866 rec->buildid_all = true; in cmd_record()
1868 if (record_opts__config(&rec->opts)) { in cmd_record()
1875 perf_evlist__delete(rec->evlist); in cmd_record()
1877 auxtrace_record__free(rec->itr); in cmd_record()
1883 struct record *rec = &record; in snapshot_sig_handler() local
1892 if (switch_output_signal(rec)) in snapshot_sig_handler()
1898 struct record *rec = &record; in alarm_sig_handler() local
1900 if (switch_output_time(rec)) in alarm_sig_handler()