diff options
-rw-r--r-- | tools/perf/util/auxtrace.h | 55 | ||||
-rw-r--r-- | tools/perf/util/session.c | 54 | ||||
-rw-r--r-- | tools/perf/util/session.h | 3 |
3 files changed, 102 insertions, 10 deletions
diff --git a/tools/perf/util/auxtrace.h b/tools/perf/util/auxtrace.h index 7ab4850703f0..199fc27b3954 100644 --- a/tools/perf/util/auxtrace.h +++ b/tools/perf/util/auxtrace.h | |||
@@ -23,6 +23,7 @@ | |||
23 | #include <linux/types.h> | 23 | #include <linux/types.h> |
24 | 24 | ||
25 | #include "../perf.h" | 25 | #include "../perf.h" |
26 | #include "session.h" | ||
26 | 27 | ||
27 | union perf_event; | 28 | union perf_event; |
28 | struct perf_session; | 29 | struct perf_session; |
@@ -32,6 +33,24 @@ struct record_opts; | |||
32 | struct auxtrace_info_event; | 33 | struct auxtrace_info_event; |
33 | 34 | ||
34 | /** | 35 | /** |
36 | * struct auxtrace - session callbacks to allow AUX area data decoding. | ||
37 | * @process_event: lets the decoder see all session events | ||
38 | * @flush_events: process any remaining data | ||
39 | * @free_events: free resources associated with event processing | ||
40 | * @free: free resources associated with the session | ||
41 | */ | ||
42 | struct auxtrace { | ||
43 | int (*process_event)(struct perf_session *session, | ||
44 | union perf_event *event, | ||
45 | struct perf_sample *sample, | ||
46 | struct perf_tool *tool); | ||
47 | int (*flush_events)(struct perf_session *session, | ||
48 | struct perf_tool *tool); | ||
49 | void (*free_events)(struct perf_session *session); | ||
50 | void (*free)(struct perf_session *session); | ||
51 | }; | ||
52 | |||
53 | /** | ||
35 | * struct auxtrace_mmap - records an mmap of the auxtrace buffer. | 54 | * struct auxtrace_mmap - records an mmap of the auxtrace buffer. |
36 | * @base: address of mapped area | 55 | * @base: address of mapped area |
37 | * @userpg: pointer to buffer's perf_event_mmap_page | 56 | * @userpg: pointer to buffer's perf_event_mmap_page |
@@ -168,4 +187,40 @@ int perf_event__synthesize_auxtrace_info(struct auxtrace_record *itr, | |||
168 | struct perf_session *session, | 187 | struct perf_session *session, |
169 | perf_event__handler_t process); | 188 | perf_event__handler_t process); |
170 | 189 | ||
190 | static inline int auxtrace__process_event(struct perf_session *session, | ||
191 | union perf_event *event, | ||
192 | struct perf_sample *sample, | ||
193 | struct perf_tool *tool) | ||
194 | { | ||
195 | if (!session->auxtrace) | ||
196 | return 0; | ||
197 | |||
198 | return session->auxtrace->process_event(session, event, sample, tool); | ||
199 | } | ||
200 | |||
201 | static inline int auxtrace__flush_events(struct perf_session *session, | ||
202 | struct perf_tool *tool) | ||
203 | { | ||
204 | if (!session->auxtrace) | ||
205 | return 0; | ||
206 | |||
207 | return session->auxtrace->flush_events(session, tool); | ||
208 | } | ||
209 | |||
210 | static inline void auxtrace__free_events(struct perf_session *session) | ||
211 | { | ||
212 | if (!session->auxtrace) | ||
213 | return; | ||
214 | |||
215 | return session->auxtrace->free_events(session); | ||
216 | } | ||
217 | |||
218 | static inline void auxtrace__free(struct perf_session *session) | ||
219 | { | ||
220 | if (!session->auxtrace) | ||
221 | return; | ||
222 | |||
223 | return session->auxtrace->free(session); | ||
224 | } | ||
225 | |||
171 | #endif | 226 | #endif |
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c index 4008dab73424..7271c6bcb2dc 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c | |||
@@ -15,12 +15,13 @@ | |||
15 | #include "cpumap.h" | 15 | #include "cpumap.h" |
16 | #include "perf_regs.h" | 16 | #include "perf_regs.h" |
17 | #include "asm/bug.h" | 17 | #include "asm/bug.h" |
18 | #include "auxtrace.h" | ||
18 | 19 | ||
19 | static int machines__deliver_event(struct machines *machines, | 20 | static int perf_session__deliver_event(struct perf_session *session, |
20 | struct perf_evlist *evlist, | 21 | union perf_event *event, |
21 | union perf_event *event, | 22 | struct perf_sample *sample, |
22 | struct perf_sample *sample, | 23 | struct perf_tool *tool, |
23 | struct perf_tool *tool, u64 file_offset); | 24 | u64 file_offset); |
24 | 25 | ||
25 | static int perf_session__open(struct perf_session *session) | 26 | static int perf_session__open(struct perf_session *session) |
26 | { | 27 | { |
@@ -105,8 +106,8 @@ static int ordered_events__deliver_event(struct ordered_events *oe, | |||
105 | return ret; | 106 | return ret; |
106 | } | 107 | } |
107 | 108 | ||
108 | return machines__deliver_event(&session->machines, session->evlist, event->event, | 109 | return perf_session__deliver_event(session, event->event, &sample, |
109 | &sample, session->tool, event->file_offset); | 110 | session->tool, event->file_offset); |
110 | } | 111 | } |
111 | 112 | ||
112 | struct perf_session *perf_session__new(struct perf_data_file *file, | 113 | struct perf_session *perf_session__new(struct perf_data_file *file, |
@@ -185,6 +186,7 @@ static void perf_session_env__delete(struct perf_session_env *env) | |||
185 | 186 | ||
186 | void perf_session__delete(struct perf_session *session) | 187 | void perf_session__delete(struct perf_session *session) |
187 | { | 188 | { |
189 | auxtrace__free(session); | ||
188 | perf_session__destroy_kernel_maps(session); | 190 | perf_session__destroy_kernel_maps(session); |
189 | perf_session__delete_threads(session); | 191 | perf_session__delete_threads(session); |
190 | perf_session_env__delete(&session->header.env); | 192 | perf_session_env__delete(&session->header.env); |
@@ -1030,6 +1032,24 @@ static int machines__deliver_event(struct machines *machines, | |||
1030 | } | 1032 | } |
1031 | } | 1033 | } |
1032 | 1034 | ||
1035 | static int perf_session__deliver_event(struct perf_session *session, | ||
1036 | union perf_event *event, | ||
1037 | struct perf_sample *sample, | ||
1038 | struct perf_tool *tool, | ||
1039 | u64 file_offset) | ||
1040 | { | ||
1041 | int ret; | ||
1042 | |||
1043 | ret = auxtrace__process_event(session, event, sample, tool); | ||
1044 | if (ret < 0) | ||
1045 | return ret; | ||
1046 | if (ret > 0) | ||
1047 | return 0; | ||
1048 | |||
1049 | return machines__deliver_event(&session->machines, session->evlist, | ||
1050 | event, sample, tool, file_offset); | ||
1051 | } | ||
1052 | |||
1033 | static s64 perf_session__process_user_event(struct perf_session *session, | 1053 | static s64 perf_session__process_user_event(struct perf_session *session, |
1034 | union perf_event *event, | 1054 | union perf_event *event, |
1035 | u64 file_offset) | 1055 | u64 file_offset) |
@@ -1190,8 +1210,8 @@ static s64 perf_session__process_event(struct perf_session *session, | |||
1190 | return ret; | 1210 | return ret; |
1191 | } | 1211 | } |
1192 | 1212 | ||
1193 | return machines__deliver_event(&session->machines, evlist, event, | 1213 | return perf_session__deliver_event(session, event, &sample, tool, |
1194 | &sample, tool, file_offset); | 1214 | file_offset); |
1195 | } | 1215 | } |
1196 | 1216 | ||
1197 | void perf_event_header__bswap(struct perf_event_header *hdr) | 1217 | void perf_event_header__bswap(struct perf_event_header *hdr) |
@@ -1350,10 +1370,14 @@ more: | |||
1350 | done: | 1370 | done: |
1351 | /* do the final flush for ordered samples */ | 1371 | /* do the final flush for ordered samples */ |
1352 | err = ordered_events__flush(oe, OE_FLUSH__FINAL); | 1372 | err = ordered_events__flush(oe, OE_FLUSH__FINAL); |
1373 | if (err) | ||
1374 | goto out_err; | ||
1375 | err = auxtrace__flush_events(session, tool); | ||
1353 | out_err: | 1376 | out_err: |
1354 | free(buf); | 1377 | free(buf); |
1355 | perf_session__warn_about_errors(session); | 1378 | perf_session__warn_about_errors(session); |
1356 | ordered_events__free(&session->ordered_events); | 1379 | ordered_events__free(&session->ordered_events); |
1380 | auxtrace__free_events(session); | ||
1357 | return err; | 1381 | return err; |
1358 | } | 1382 | } |
1359 | 1383 | ||
@@ -1496,10 +1520,14 @@ more: | |||
1496 | out: | 1520 | out: |
1497 | /* do the final flush for ordered samples */ | 1521 | /* do the final flush for ordered samples */ |
1498 | err = ordered_events__flush(oe, OE_FLUSH__FINAL); | 1522 | err = ordered_events__flush(oe, OE_FLUSH__FINAL); |
1523 | if (err) | ||
1524 | goto out_err; | ||
1525 | err = auxtrace__flush_events(session, tool); | ||
1499 | out_err: | 1526 | out_err: |
1500 | ui_progress__finish(); | 1527 | ui_progress__finish(); |
1501 | perf_session__warn_about_errors(session); | 1528 | perf_session__warn_about_errors(session); |
1502 | ordered_events__free(&session->ordered_events); | 1529 | ordered_events__free(&session->ordered_events); |
1530 | auxtrace__free_events(session); | ||
1503 | session->one_mmap = false; | 1531 | session->one_mmap = false; |
1504 | return err; | 1532 | return err; |
1505 | } | 1533 | } |
@@ -1582,7 +1610,13 @@ size_t perf_session__fprintf_dsos_buildid(struct perf_session *session, FILE *fp | |||
1582 | 1610 | ||
1583 | size_t perf_session__fprintf_nr_events(struct perf_session *session, FILE *fp) | 1611 | size_t perf_session__fprintf_nr_events(struct perf_session *session, FILE *fp) |
1584 | { | 1612 | { |
1585 | size_t ret = fprintf(fp, "Aggregated stats:\n"); | 1613 | size_t ret; |
1614 | const char *msg = ""; | ||
1615 | |||
1616 | if (perf_header__has_feat(&session->header, HEADER_AUXTRACE)) | ||
1617 | msg = " (excludes AUX area (e.g. instruction trace) decoded / synthesized events)"; | ||
1618 | |||
1619 | ret = fprintf(fp, "Aggregated stats:%s\n", msg); | ||
1586 | 1620 | ||
1587 | ret += events_stats__fprintf(&session->evlist->stats, fp); | 1621 | ret += events_stats__fprintf(&session->evlist->stats, fp); |
1588 | return ret; | 1622 | return ret; |
diff --git a/tools/perf/util/session.h b/tools/perf/util/session.h index d5fa7b7916ef..8a69d3bfafdf 100644 --- a/tools/perf/util/session.h +++ b/tools/perf/util/session.h | |||
@@ -15,10 +15,13 @@ | |||
15 | struct ip_callchain; | 15 | struct ip_callchain; |
16 | struct thread; | 16 | struct thread; |
17 | 17 | ||
18 | struct auxtrace; | ||
19 | |||
18 | struct perf_session { | 20 | struct perf_session { |
19 | struct perf_header header; | 21 | struct perf_header header; |
20 | struct machines machines; | 22 | struct machines machines; |
21 | struct perf_evlist *evlist; | 23 | struct perf_evlist *evlist; |
24 | struct auxtrace *auxtrace; | ||
22 | struct trace_event tevent; | 25 | struct trace_event tevent; |
23 | bool repipe; | 26 | bool repipe; |
24 | bool one_mmap; | 27 | bool one_mmap; |