Lines Matching defs:session
25 #include "session.h"
43 static int perf_session__deliver_event(struct perf_session *session,
49 static int perf_session__open(struct perf_session *session)
51 struct perf_data *data = session->data;
53 if (perf_session__read_header(session) < 0) {
58 if (perf_header__has_feat(&session->header, HEADER_AUXTRACE)) {
66 if (perf_header__has_feat(&session->header, HEADER_STAT))
69 if (!evlist__valid_sample_type(session->evlist)) {
74 if (!evlist__valid_sample_id_all(session->evlist)) {
79 if (!evlist__valid_read_format(session->evlist)) {
87 void perf_session__set_id_hdr_size(struct perf_session *session)
89 u16 id_hdr_size = evlist__id_hdr_size(session->evlist);
91 machines__set_id_hdr_size(&session->machines, id_hdr_size);
94 int perf_session__create_kernel_maps(struct perf_session *session)
96 int ret = machine__create_kernel_maps(&session->machines.host);
99 ret = machines__create_guest_kernel_maps(&session->machines);
103 static void perf_session__destroy_kernel_maps(struct perf_session *session)
105 machines__destroy_kernel_maps(&session->machines);
108 static bool perf_session__has_comm_exec(struct perf_session *session)
112 evlist__for_each_entry(session->evlist, evsel) {
120 static void perf_session__set_comm_exec(struct perf_session *session)
122 bool comm_exec = perf_session__has_comm_exec(session);
124 machines__set_comm_exec(&session->machines, comm_exec);
130 struct perf_session *session = container_of(oe, struct perf_session,
133 return perf_session__deliver_event(session, event->event,
134 session->tool, event->file_offset,
143 struct perf_session *session = zalloc(sizeof(*session));
145 if (!session)
148 session->trace_event_repipe = trace_event_repipe;
149 session->tool = tool;
150 session->decomp_data.zstd_decomp = &session->zstd_data;
151 session->active_decomp = &session->decomp_data;
152 INIT_LIST_HEAD(&session->auxtrace_index);
153 machines__init(&session->machines);
154 ordered_events__init(&session->ordered_events,
157 perf_env__init(&session->header.env);
163 session->data = data;
166 ret = perf_session__open(session);
171 * set session attributes that are present in perf.data
175 perf_session__set_id_hdr_size(session);
176 perf_session__set_comm_exec(session);
179 evlist__init_trace_event_sample_raw(session->evlist);
193 session->machines.host.env = &perf_env;
196 session->machines.host.single_address_space =
197 perf_env__single_address_space(session->machines.host.env);
204 if (perf_session__create_kernel_maps(session) < 0)
213 tool->ordered_events && !evlist__sample_id_all(session->evlist)) {
218 return session;
221 perf_session__delete(session);
241 void perf_session__delete(struct perf_session *session)
243 if (session == NULL)
245 auxtrace__free(session);
246 auxtrace_index__free(&session->auxtrace_index);
248 perf_session__destroy_kernel_maps(session);
249 perf_decomp__release_events(session->decomp_data.decomp);
250 perf_env__exit(&session->header.env);
251 machines__exit(&session->machines);
252 if (session->data) {
253 if (perf_data__is_read(session->data))
254 evlist__delete(session->evlist);
255 perf_data__close(session->data);
258 trace_event__cleanup(&session->tevent);
260 free(session);
1347 static int perf_session__deliver_event(struct perf_session *session,
1354 int ret = evlist__parse_sample(session->evlist, event, &sample);
1361 ret = auxtrace__process_event(session, event, &sample, tool);
1367 ret = machines__deliver_event(&session->machines, session->evlist,
1371 auxtrace__dump_auxtrace_sample(session, &sample);
1376 static s64 perf_session__process_user_event(struct perf_session *session,
1381 struct ordered_events *oe = &session->ordered_events;
1382 const struct perf_tool *tool = session->tool;
1384 int fd = perf_data__fd(session->data);
1388 dump_event(session->evlist, event, file_offset, &sample, file_path);
1393 err = tool->attr(tool, event, &session->evlist);
1395 perf_session__set_id_hdr_size(session);
1396 perf_session__set_comm_exec(session);
1400 return tool->event_update(tool, event, &session->evlist);
1413 if (!perf_data__is_pipe(session->data))
1415 return tool->tracing_data(session, event);
1417 return tool->build_id(session, event);
1421 return tool->id_index(session, event);
1423 return tool->auxtrace_info(session, event);
1430 if (!perf_data__is_pipe(session->data))
1432 return tool->auxtrace(session, event);
1434 perf_session__auxtrace_error_inc(session, event);
1435 return tool->auxtrace_error(session, event);
1437 return tool->thread_map(session, event);
1439 return tool->cpu_map(session, event);
1441 return tool->stat_config(session, event);
1443 return tool->stat(session, event);
1445 return tool->stat_round(session, event);
1447 session->time_conv = event->time_conv;
1448 return tool->time_conv(session, event);
1450 return tool->feature(session, event);
1452 err = tool->compressed(session, event, file_offset, file_path);
1454 dump_event(session->evlist, event, file_offset, &sample, file_path);
1457 return tool->finished_init(session, event);
1463 int perf_session__deliver_synth_event(struct perf_session *session,
1467 struct evlist *evlist = session->evlist;
1468 const struct perf_tool *tool = session->tool;
1473 return perf_session__process_user_event(session, event, 0, NULL);
1475 return machines__deliver_event(&session->machines, evlist, event, sample, tool, 0, NULL);
1478 int perf_session__deliver_synth_attr_event(struct perf_session *session,
1499 return perf_session__deliver_synth_event(session, &ev.ev, NULL);
1511 int perf_session__peek_event(struct perf_session *session, off_t file_offset,
1520 if (session->one_mmap && !session->header.needs_swap) {
1521 event = file_offset - session->one_mmap_offset +
1522 session->one_mmap_addr;
1526 if (perf_data__is_pipe(session->data))
1529 fd = perf_data__fd(session->data);
1541 if (session->header.needs_swap)
1553 if (session->header.needs_swap)
1554 event_swap(event, evlist__sample_id_all(session->evlist));
1559 evlist__parse_sample(session->evlist, event, sample))
1567 int perf_session__peek_events(struct perf_session *session, u64 offset,
1576 err = perf_session__peek_event(session, offset, buf,
1582 err = cb(session, event, offset, data);
1595 static s64 perf_session__process_event(struct perf_session *session,
1599 struct evlist *evlist = session->evlist;
1600 const struct perf_tool *tool = session->tool;
1603 if (session->header.needs_swap)
1612 return perf_session__process_user_event(session, event, file_offset, file_path);
1621 ret = perf_session__queue_event(session, event, timestamp, file_offset, file_path);
1626 return perf_session__deliver_event(session, event, tool, file_offset, file_path);
1636 struct thread *perf_session__findnew(struct perf_session *session, pid_t pid)
1638 return machine__findnew_thread(&session->machines.host, -1, pid);
1641 int perf_session__register_idle_thread(struct perf_session *session)
1643 struct thread *thread = machine__idle_thread(&session->machines.host);
1651 perf_session__warn_order(const struct perf_session *session)
1653 const struct ordered_events *oe = &session->ordered_events;
1657 evlist__for_each_entry(session->evlist, evsel) {
1668 static void perf_session__warn_about_errors(const struct perf_session *session)
1670 const struct events_stats *stats = &session->evlist->stats;
1672 if (session->tool->lost == perf_event__process_lost &&
1680 if (session->tool->lost_samples == perf_event__process_lost_samples) {
1692 if (session->tool->aux == perf_event__process_aux &&
1699 if (session->tool->aux == perf_event__process_aux &&
1716 if (session->tool->aux == perf_event__process_aux &&
1751 perf_session__warn_order(session);
1773 static int perf_session__flush_thread_stacks(struct perf_session *session)
1775 return machines__for_each_thread(&session->machines,
1782 static int __perf_session__process_decomp_events(struct perf_session *session);
1784 static int __perf_session__process_pipe_events(struct perf_session *session)
1786 struct ordered_events *oe = &session->ordered_events;
1787 const struct perf_tool *tool = session->tool;
1803 if (strcmp(session->data->path, "-") && session->data->file.size) {
1804 ui_progress__init_size(&prog, session->data->file.size,
1818 err = perf_data__read(session->data, event,
1828 if (session->header.needs_swap)
1851 err = perf_data__read(session->data, p,
1864 if ((skip = perf_session__process_event(session, event, head, "pipe")) < 0) {
1876 err = __perf_session__process_decomp_events(session);
1890 err = auxtrace__flush_events(session, tool);
1893 err = perf_session__flush_thread_stacks(session);
1899 perf_session__warn_about_errors(session);
1900 ordered_events__free(&session->ordered_events);
1901 auxtrace__free_events(session);
1956 static int __perf_session__process_decomp_events(struct perf_session *session)
1960 struct decomp *decomp = session->active_decomp->decomp_last;
1967 session->header.needs_swap);
1975 (skip = perf_session__process_event(session, event, decomp->file_pos,
2005 typedef s64 (*reader_cb_t)(struct perf_session *session,
2063 reader__mmap(struct reader *rd, struct perf_session *session)
2074 } else if (session->header.needs_swap) {
2097 if (session->one_mmap) {
2098 session->one_mmap_addr = buf;
2099 session->one_mmap_offset = rd->file_offset;
2111 reader__read_event(struct reader *rd, struct perf_session *session,
2120 session->header.needs_swap);
2132 (skip = rd->process(session, event, rd->file_pos, rd->path)) < 0) {
2147 err = __perf_session__process_decomp_events(session);
2164 reader__process_events(struct reader *rd, struct perf_session *session,
2169 err = reader__init(rd, &session->one_mmap);
2173 session->active_decomp = &rd->decomp_data;
2176 err = reader__mmap(rd, session);
2181 err = reader__read_event(rd, session, prog);
2194 session->active_decomp = &session->decomp_data;
2198 static s64 process_simple(struct perf_session *session,
2203 return perf_session__process_event(session, event, file_offset, file_path);
2206 static int __perf_session__process_events(struct perf_session *session)
2209 .fd = perf_data__fd(session->data),
2210 .path = session->data->file.path,
2211 .data_size = session->header.data_size,
2212 .data_offset = session->header.data_offset,
2214 .in_place_update = session->data->in_place_update,
2216 struct ordered_events *oe = &session->ordered_events;
2217 const struct perf_tool *tool = session->tool;
2226 err = reader__process_events(&rd, session, &prog);
2233 err = auxtrace__flush_events(session, tool);
2236 err = perf_session__flush_thread_stacks(session);
2240 perf_session__warn_about_errors(session);
2245 ordered_events__reinit(&session->ordered_events);
2246 auxtrace__free_events(session);
2248 session->one_mmap = false;
2264 static int __perf_session__process_dir_events(struct perf_session *session)
2266 struct perf_data *data = session->data;
2267 const struct perf_tool *tool = session->tool;
2270 u64 total_size = perf_data__size(session->data);
2286 .fd = perf_data__fd(session->data),
2287 .path = session->data->file.path,
2288 .data_size = session->header.data_size,
2289 .data_offset = session->header.data_offset,
2291 .in_place_update = session->data->in_place_update,
2296 ret = reader__mmap(&rd[0], session);
2310 .in_place_update = session->data->in_place_update,
2315 ret = reader__mmap(&rd[readers], session);
2336 session->active_decomp = &rd[i].decomp_data;
2337 ret = reader__read_event(&rd[i], session, &prog);
2341 ret = reader__mmap(&rd[i], session);
2352 ret = ordered_events__flush(&session->ordered_events, OE_FLUSH__FINAL);
2356 ret = perf_session__flush_thread_stacks(session);
2361 perf_session__warn_about_errors(session);
2367 ordered_events__reinit(&session->ordered_events);
2369 session->one_mmap = false;
2371 session->active_decomp = &session->decomp_data;
2379 int perf_session__process_events(struct perf_session *session)
2381 if (perf_session__register_idle_thread(session) < 0)
2384 if (perf_data__is_pipe(session->data))
2385 return __perf_session__process_pipe_events(session);
2387 if (perf_data__is_dir(session->data) && session->data->dir.nr)
2388 return __perf_session__process_dir_events(session);
2390 return __perf_session__process_events(session);
2393 bool perf_session__has_traces(struct perf_session *session, const char *msg)
2397 evlist__for_each_entry(session->evlist, evsel) {
2435 size_t perf_session__fprintf_dsos(struct perf_session *session, FILE *fp)
2437 return machines__fprintf_dsos(&session->machines, fp);
2440 size_t perf_session__fprintf_dsos_buildid(struct perf_session *session, FILE *fp,
2443 return machines__fprintf_dsos_buildid(&session->machines, fp, skip, parm);
2446 size_t perf_session__fprintf_nr_events(struct perf_session *session, FILE *fp)
2451 if (perf_header__has_feat(&session->header, HEADER_AUXTRACE))
2456 ret += events_stats__fprintf(&session->evlist->stats, fp);
2460 size_t perf_session__fprintf(struct perf_session *session, FILE *fp)
2464 * session, not just the host...
2466 return machine__fprintf(&session->machines.host, fp);
2469 void perf_session__dump_kmaps(struct perf_session *session)
2476 maps__fprintf(machine__kernel_maps(&session->machines.host), stderr);
2480 struct evsel *perf_session__find_first_evtype(struct perf_session *session,
2485 evlist__for_each_entry(session->evlist, pos) {
2492 int perf_session__cpu_bitmap(struct perf_session *session,
2497 int nr_cpus = min(session->header.env.nr_cpus_avail, MAX_NR_CPUS);
2503 evsel = perf_session__find_first_evtype(session, i);
2537 void perf_session__fprintf_info(struct perf_session *session, FILE *fp,
2540 if (session == NULL || fp == NULL)
2544 perf_header__fprintf_info(session, fp, full);
2548 static int perf_session__register_guest(struct perf_session *session, pid_t machine_pid)
2550 struct machine *machine = machines__findnew(&session->machines, machine_pid);
2556 machine->single_address_space = session->machines.host.single_address_space;
2563 machine->kallsyms_filename = perf_data__guest_kallsyms_name(session->data, machine_pid);
2568 static int perf_session__set_guest_cpu(struct perf_session *session, pid_t pid,
2571 struct machine *machine = &session->machines.host;
2582 int perf_event__process_id_index(struct perf_session *session,
2585 struct evlist *evlist = session->evlist;
2652 ret = perf_session__register_guest(session, sid->machine_pid);
2659 ret = perf_session__set_guest_cpu(session, sid->machine_pid, e->tid, e2->vcpu);
2666 int perf_session__dsos_hit_all(struct perf_session *session)
2671 err = machine__hit_all_dsos(&session->machines.host);
2675 for (nd = rb_first_cached(&session->machines.guests); nd;