aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tools/perf/util/auxtrace.h55
-rw-r--r--tools/perf/util/session.c54
-rw-r--r--tools/perf/util/session.h3
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
27union perf_event; 28union perf_event;
28struct perf_session; 29struct perf_session;
@@ -32,6 +33,24 @@ struct record_opts;
32struct auxtrace_info_event; 33struct 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 */
42struct 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
190static 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
201static 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
210static 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
218static 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
19static int machines__deliver_event(struct machines *machines, 20static 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
25static int perf_session__open(struct perf_session *session) 26static 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
112struct perf_session *perf_session__new(struct perf_data_file *file, 113struct 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
186void perf_session__delete(struct perf_session *session) 187void 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
1035static 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
1033static s64 perf_session__process_user_event(struct perf_session *session, 1053static 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
1197void perf_event_header__bswap(struct perf_event_header *hdr) 1217void perf_event_header__bswap(struct perf_event_header *hdr)
@@ -1350,10 +1370,14 @@ more:
1350done: 1370done:
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);
1353out_err: 1376out_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:
1496out: 1520out:
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);
1499out_err: 1526out_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
1583size_t perf_session__fprintf_nr_events(struct perf_session *session, FILE *fp) 1611size_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 @@
15struct ip_callchain; 15struct ip_callchain;
16struct thread; 16struct thread;
17 17
18struct auxtrace;
19
18struct perf_session { 20struct 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;