Lines Matching full:session

27 #include "session.h"
45 static int perf_session__deliver_event(struct perf_session *session,
51 static int perf_session__open(struct perf_session *session)
53 struct perf_data *data = session->data;
55 if (perf_session__read_header(session) < 0) {
60 if (perf_header__has_feat(&session->header, HEADER_AUXTRACE)) {
68 if (perf_header__has_feat(&session->header, HEADER_STAT))
71 if (!evlist__valid_sample_type(session->evlist)) {
76 if (!evlist__valid_sample_id_all(session->evlist)) {
81 if (!evlist__valid_read_format(session->evlist)) {
89 void perf_session__set_id_hdr_size(struct perf_session *session)
91 u16 id_hdr_size = evlist__id_hdr_size(session->evlist);
93 machines__set_id_hdr_size(&session->machines, id_hdr_size);
96 int perf_session__create_kernel_maps(struct perf_session *session)
98 int ret = machine__create_kernel_maps(&session->machines.host);
101 ret = machines__create_guest_kernel_maps(&session->machines);
105 static void perf_session__destroy_kernel_maps(struct perf_session *session)
107 machines__destroy_kernel_maps(&session->machines);
110 static bool perf_session__has_comm_exec(struct perf_session *session)
114 evlist__for_each_entry(session->evlist, evsel) {
122 static void perf_session__set_comm_exec(struct perf_session *session)
124 bool comm_exec = perf_session__has_comm_exec(session);
126 machines__set_comm_exec(&session->machines, comm_exec);
132 struct perf_session *session = container_of(oe, struct perf_session,
134 int ret = perf_session__deliver_event(session, event->event,
135 session->tool, event->file_offset,
153 struct perf_session *session = zalloc(sizeof(*session));
155 if (!session)
158 session->trace_event_repipe = trace_event_repipe;
159 session->tool = tool;
160 session->decomp_data.zstd_decomp = &session->zstd_data;
161 session->active_decomp = &session->decomp_data;
162 INIT_LIST_HEAD(&session->auxtrace_index);
163 machines__init(&session->machines);
164 ordered_events__init(&session->ordered_events,
167 perf_env__init(&session->header.env);
173 session->data = data;
176 ret = perf_session__open(session);
181 * set session attributes that are present in perf.data
185 perf_session__set_id_hdr_size(session);
186 perf_session__set_comm_exec(session);
189 evlist__init_trace_event_sample_raw(session->evlist, &session->header.env);
204 session->machines.host.env = host_env;
206 if (session->evlist)
207 session->evlist->session = session;
209 session->machines.host.single_address_space =
210 perf_env__single_address_space(session->machines.host.env);
217 if (perf_session__create_kernel_maps(session) < 0)
226 tool->ordered_events && !evlist__sample_id_all(session->evlist)) {
231 return session;
234 perf_session__delete(session);
254 void perf_session__delete(struct perf_session *session)
256 if (session == NULL)
258 auxtrace__free(session);
259 auxtrace_index__free(&session->auxtrace_index);
261 perf_session__destroy_kernel_maps(session);
262 perf_decomp__release_events(session->decomp_data.decomp);
263 perf_env__exit(&session->header.env);
264 machines__exit(&session->machines);
265 if (session->data) {
266 if (perf_data__is_read(session->data))
267 evlist__delete(session->evlist);
268 perf_data__close(session->data);
271 trace_event__cleanup(&session->tevent);
273 free(session);
1417 * This is called at the end of the data processing for the session. Flush the
1420 static int session__flush_deferred_samples(struct perf_session *session,
1423 struct evlist *evlist = session->evlist;
1424 struct machine *machine = &session->machines.host;
1569 static int perf_session__deliver_event(struct perf_session *session,
1579 ret = evlist__parse_sample(session->evlist, event, &sample);
1585 ret = auxtrace__process_event(session, event, &sample, tool);
1593 ret = machines__deliver_event(&session->machines, session->evlist,
1597 auxtrace__dump_auxtrace_sample(session, &sample);
1603 static s64 perf_session__process_user_event(struct perf_session *session,
1608 struct ordered_events *oe = &session->ordered_events;
1609 const struct perf_tool *tool = session->tool;
1611 int fd = perf_data__fd(session->data);
1618 dump_event(session->evlist, event, file_offset, &sample, file_path);
1623 err = tool->attr(tool, event, &session->evlist);
1625 perf_session__set_id_hdr_size(session);
1626 perf_session__set_comm_exec(session);
1630 err = tool->event_update(tool, event, &session->evlist);
1645 if (!perf_data__is_pipe(session->data))
1647 err = tool->tracing_data(tool, session, event);
1650 err = tool->build_id(tool, session, event);
1656 err = tool->id_index(tool, session, event);
1659 err = tool->auxtrace_info(tool, session, event);
1667 if (!perf_data__is_pipe(session->data))
1669 err = tool->auxtrace(tool, session, event);
1672 perf_session__auxtrace_error_inc(session, event);
1673 err = tool->auxtrace_error(tool, session, event);
1676 err = tool->thread_map(tool, session, event);
1679 err = tool->cpu_map(tool, session, event);
1682 err = tool->stat_config(tool, session, event);
1685 err = tool->stat(tool, session, event);
1688 err = tool->stat_round(tool, session, event);
1691 session->time_conv = event->time_conv;
1692 err = tool->time_conv(tool, session, event);
1695 err = tool->feature(tool, session, event);
1699 err = tool->compressed(tool, session, event, file_offset, file_path);
1701 dump_event(session->evlist, event, file_offset, &sample, file_path);
1704 err = tool->finished_init(tool, session, event);
1707 err = tool->bpf_metadata(tool, session, event);
1710 err = tool->schedstat_cpu(tool, session, event);
1713 err = tool->schedstat_domain(tool, session, event);
1723 int perf_session__deliver_synth_event(struct perf_session *session,
1727 struct evlist *evlist = session->evlist;
1728 const struct perf_tool *tool = session->tool;
1733 return perf_session__process_user_event(session, event, 0, NULL);
1735 return machines__deliver_event(&session->machines, evlist, event, sample, tool, 0, NULL);
1738 int perf_session__deliver_synth_attr_event(struct perf_session *session,
1759 return perf_session__deliver_synth_event(session, &ev.ev, NULL);
1771 int perf_session__peek_event(struct perf_session *session, off_t file_offset,
1780 if (session->one_mmap && !session->header.needs_swap) {
1781 event = file_offset - session->one_mmap_offset +
1782 session->one_mmap_addr;
1786 if (perf_data__is_pipe(session->data))
1789 fd = perf_data__fd(session->data);
1801 if (session->header.needs_swap)
1813 if (session->header.needs_swap)
1814 event_swap(event, evlist__sample_id_all(session->evlist));
1819 evlist__parse_sample(session->evlist, event, sample))
1827 int perf_session__peek_events(struct perf_session *session, u64 offset,
1836 err = perf_session__peek_event(session, offset, buf,
1842 err = cb(session, event, offset, data);
1855 static s64 perf_session__process_event(struct perf_session *session,
1859 struct evlist *evlist = session->evlist;
1860 const struct perf_tool *tool = session->tool;
1863 if (session->header.needs_swap)
1881 return perf_session__process_user_event(session, event, file_offset, file_path);
1890 ret = perf_session__queue_event(session, event, timestamp, file_offset, file_path);
1895 return perf_session__deliver_event(session, event, tool, file_offset, file_path);
1905 struct thread *perf_session__findnew(struct perf_session *session, pid_t pid)
1907 return machine__findnew_thread(&session->machines.host, -1, pid);
1910 int perf_session__register_idle_thread(struct perf_session *session)
1912 struct thread *thread = machine__idle_thread(&session->machines.host);
1920 perf_session__warn_order(const struct perf_session *session)
1922 const struct ordered_events *oe = &session->ordered_events;
1926 evlist__for_each_entry(session->evlist, evsel) {
1937 static void perf_session__warn_about_errors(const struct perf_session *session)
1939 const struct events_stats *stats = &session->evlist->stats;
1941 if (session->tool->lost == perf_event__process_lost &&
1949 if (session->tool->lost_samples == perf_event__process_lost_samples) {
1961 if (session->tool->aux == perf_event__process_aux &&
1968 if (session->tool->aux == perf_event__process_aux &&
1985 if (session->tool->aux == perf_event__process_aux &&
2020 perf_session__warn_order(session);
2042 static int perf_session__flush_thread_stacks(struct perf_session *session)
2044 return machines__for_each_thread(&session->machines,
2051 static int __perf_session__process_decomp_events(struct perf_session *session);
2053 static int __perf_session__process_pipe_events(struct perf_session *session)
2055 struct ordered_events *oe = &session->ordered_events;
2056 const struct perf_tool *tool = session->tool;
2072 if (strcmp(session->data->path, "-") && session->data->file.size) {
2073 ui_progress__init_size(&prog, session->data->file.size,
2087 err = perf_data__read(session->data, event,
2097 if (session->header.needs_swap)
2120 err = perf_data__read(session->data, p,
2133 if ((skip = perf_session__process_event(session, event, head, "pipe")) < 0) {
2147 err = __perf_session__process_decomp_events(session);
2161 err = session__flush_deferred_samples(session, tool);
2164 err = auxtrace__flush_events(session, tool);
2167 err = perf_session__flush_thread_stacks(session);
2173 perf_session__warn_about_errors(session);
2174 ordered_events__free(&session->ordered_events);
2175 auxtrace__free_events(session);
2230 static int __perf_session__process_decomp_events(struct perf_session *session)
2234 struct decomp *decomp = session->active_decomp->decomp_last;
2241 session->header.needs_swap);
2249 (skip = perf_session__process_event(session, event, decomp->file_pos,
2281 typedef s64 (*reader_cb_t)(struct perf_session *session,
2339 reader__mmap(struct reader *rd, struct perf_session *session)
2350 } else if (session->header.needs_swap) {
2373 if (session->one_mmap) {
2374 session->one_mmap_addr = buf;
2375 session->one_mmap_offset = rd->file_offset;
2387 reader__read_event(struct reader *rd, struct perf_session *session,
2396 session->header.needs_swap);
2408 (skip = rd->process(session, event, rd->file_pos, rd->path)) < 0) {
2425 err = __perf_session__process_decomp_events(session);
2442 reader__process_events(struct reader *rd, struct perf_session *session,
2447 err = reader__init(rd, &session->one_mmap);
2451 session->active_decomp = &rd->decomp_data;
2454 err = reader__mmap(rd, session);
2459 err = reader__read_event(rd, session, prog);
2472 session->active_decomp = &session->decomp_data;
2476 static s64 process_simple(struct perf_session *session,
2481 return perf_session__process_event(session, event, file_offset, file_path);
2484 static int __perf_session__process_events(struct perf_session *session)
2487 .fd = perf_data__fd(session->data),
2488 .path = session->data->file.path,
2489 .data_size = session->header.data_size,
2490 .data_offset = session->header.data_offset,
2492 .in_place_update = session->data->in_place_update,
2494 struct ordered_events *oe = &session->ordered_events;
2495 const struct perf_tool *tool = session->tool;
2504 err = reader__process_events(&rd, session, &prog);
2511 err = auxtrace__flush_events(session, tool);
2514 err = session__flush_deferred_samples(session, tool);
2517 err = perf_session__flush_thread_stacks(session);
2521 perf_session__warn_about_errors(session);
2526 ordered_events__reinit(&session->ordered_events);
2527 auxtrace__free_events(session);
2529 session->one_mmap = false;
2545 static int __perf_session__process_dir_events(struct perf_session *session)
2547 struct perf_data *data = session->data;
2548 const struct perf_tool *tool = session->tool;
2551 u64 total_size = perf_data__size(session->data);
2567 .fd = perf_data__fd(session->data),
2568 .path = session->data->file.path,
2569 .data_size = session->header.data_size,
2570 .data_offset = session->header.data_offset,
2572 .in_place_update = session->data->in_place_update,
2577 ret = reader__mmap(&rd[0], session);
2591 .in_place_update = session->data->in_place_update,
2596 ret = reader__mmap(&rd[readers], session);
2617 session->active_decomp = &rd[i].decomp_data;
2618 ret = reader__read_event(&rd[i], session, &prog);
2622 ret = reader__mmap(&rd[i], session);
2633 ret = ordered_events__flush(&session->ordered_events, OE_FLUSH__FINAL);
2637 ret = session__flush_deferred_samples(session, tool);
2641 ret = perf_session__flush_thread_stacks(session);
2646 perf_session__warn_about_errors(session);
2652 ordered_events__reinit(&session->ordered_events);
2654 session->one_mmap = false;
2656 session->active_decomp = &session->decomp_data;
2664 int perf_session__process_events(struct perf_session *session)
2666 if (perf_session__register_idle_thread(session) < 0)
2669 if (perf_data__is_pipe(session->data))
2670 return __perf_session__process_pipe_events(session);
2672 if (perf_data__is_dir(session->data) && session->data->dir.nr)
2673 return __perf_session__process_dir_events(session);
2675 return __perf_session__process_events(session);
2678 bool perf_session__has_traces(struct perf_session *session, const char *msg)
2682 evlist__for_each_entry(session->evlist, evsel) {
2691 bool perf_session__has_switch_events(struct perf_session *session)
2695 evlist__for_each_entry(session->evlist, evsel) {
2732 size_t perf_session__fprintf_dsos(struct perf_session *session, FILE *fp)
2734 return machines__fprintf_dsos(&session->machines, fp);
2737 size_t perf_session__fprintf_dsos_buildid(struct perf_session *session, FILE *fp,
2740 return machines__fprintf_dsos_buildid(&session->machines, fp, skip, parm);
2743 size_t perf_session__fprintf_nr_events(struct perf_session *session, FILE *fp)
2748 if (perf_header__has_feat(&session->header, HEADER_AUXTRACE))
2753 ret += events_stats__fprintf(&session->evlist->stats, fp);
2757 size_t perf_session__fprintf(struct perf_session *session, FILE *fp)
2759 size_t ret = machine__fprintf(&session->machines.host, fp);
2761 for (struct rb_node *nd = rb_first_cached(&session->machines.guests); nd; nd = rb_next(nd)) {
2769 void perf_session__dump_kmaps(struct perf_session *session)
2776 maps__fprintf(machine__kernel_maps(&session->machines.host), stderr);
2780 struct evsel *perf_session__find_first_evtype(struct perf_session *session,
2785 evlist__for_each_entry(session->evlist, pos) {
2792 int perf_session__cpu_bitmap(struct perf_session *session,
2798 int nr_cpus = min(perf_session__env(session)->nr_cpus_avail, MAX_NR_CPUS);
2804 evsel = perf_session__find_first_evtype(session, i);
2838 void perf_session__fprintf_info(struct perf_session *session, FILE *fp,
2841 if (session == NULL || fp == NULL)
2845 perf_header__fprintf_info(session, fp, full);
2849 static int perf_session__register_guest(struct perf_session *session, pid_t machine_pid)
2851 struct machine *machine = machines__findnew(&session->machines, machine_pid);
2857 machine->single_address_space = session->machines.host.single_address_space;
2864 machine->kallsyms_filename = perf_data__guest_kallsyms_name(session->data, machine_pid);
2869 static int perf_session__set_guest_cpu(struct perf_session *session, pid_t pid,
2872 struct machine *machine = &session->machines.host;
2884 struct perf_session *session,
2887 struct evlist *evlist = session->evlist;
2954 ret = perf_session__register_guest(session, sid->machine_pid);
2961 ret = perf_session__set_guest_cpu(session, sid->machine_pid, e->tid, e2->vcpu);
2968 int perf_session__dsos_hit_all(struct perf_session *session)
2973 err = machine__hit_all_dsos(&session->machines.host);
2977 for (nd = rb_first_cached(&session->machines.guests); nd;
2989 struct perf_env *perf_session__env(struct perf_session *session)
2991 return &session->header.env;
3011 uint16_t perf_session__e_machine(struct perf_session *session, uint32_t *e_flags)
3018 if (!session) {
3026 env = perf_session__env(session);
3034 machines__for_each_thread(&session->machines,