aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/util/session.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf/util/session.c')
-rw-r--r--tools/perf/util/session.c54
1 files changed, 26 insertions, 28 deletions
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index 5c412310f266..c71ced7db152 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -27,7 +27,6 @@
27 27
28static int perf_session__deliver_event(struct perf_session *session, 28static int perf_session__deliver_event(struct perf_session *session,
29 union perf_event *event, 29 union perf_event *event,
30 struct perf_sample *sample,
31 struct perf_tool *tool, 30 struct perf_tool *tool,
32 u64 file_offset); 31 u64 file_offset);
33 32
@@ -107,17 +106,10 @@ static void perf_session__set_comm_exec(struct perf_session *session)
107static int ordered_events__deliver_event(struct ordered_events *oe, 106static int ordered_events__deliver_event(struct ordered_events *oe,
108 struct ordered_event *event) 107 struct ordered_event *event)
109{ 108{
110 struct perf_sample sample;
111 struct perf_session *session = container_of(oe, struct perf_session, 109 struct perf_session *session = container_of(oe, struct perf_session,
112 ordered_events); 110 ordered_events);
113 int ret = perf_evlist__parse_sample(session->evlist, event->event, &sample);
114
115 if (ret) {
116 pr_err("Can't parse sample, err = %d\n", ret);
117 return ret;
118 }
119 111
120 return perf_session__deliver_event(session, event->event, &sample, 112 return perf_session__deliver_event(session, event->event,
121 session->tool, event->file_offset); 113 session->tool, event->file_offset);
122} 114}
123 115
@@ -873,9 +865,9 @@ static int process_finished_round(struct perf_tool *tool __maybe_unused,
873} 865}
874 866
875int perf_session__queue_event(struct perf_session *s, union perf_event *event, 867int perf_session__queue_event(struct perf_session *s, union perf_event *event,
876 struct perf_sample *sample, u64 file_offset) 868 u64 timestamp, u64 file_offset)
877{ 869{
878 return ordered_events__queue(&s->ordered_events, event, sample, file_offset); 870 return ordered_events__queue(&s->ordered_events, event, timestamp, file_offset);
879} 871}
880 872
881static void callchain__lbr_callstack_printf(struct perf_sample *sample) 873static void callchain__lbr_callstack_printf(struct perf_sample *sample)
@@ -1328,20 +1320,26 @@ static int machines__deliver_event(struct machines *machines,
1328 1320
1329static int perf_session__deliver_event(struct perf_session *session, 1321static int perf_session__deliver_event(struct perf_session *session,
1330 union perf_event *event, 1322 union perf_event *event,
1331 struct perf_sample *sample,
1332 struct perf_tool *tool, 1323 struct perf_tool *tool,
1333 u64 file_offset) 1324 u64 file_offset)
1334{ 1325{
1326 struct perf_sample sample;
1335 int ret; 1327 int ret;
1336 1328
1337 ret = auxtrace__process_event(session, event, sample, tool); 1329 ret = perf_evlist__parse_sample(session->evlist, event, &sample);
1330 if (ret) {
1331 pr_err("Can't parse sample, err = %d\n", ret);
1332 return ret;
1333 }
1334
1335 ret = auxtrace__process_event(session, event, &sample, tool);
1338 if (ret < 0) 1336 if (ret < 0)
1339 return ret; 1337 return ret;
1340 if (ret > 0) 1338 if (ret > 0)
1341 return 0; 1339 return 0;
1342 1340
1343 return machines__deliver_event(&session->machines, session->evlist, 1341 return machines__deliver_event(&session->machines, session->evlist,
1344 event, sample, tool, file_offset); 1342 event, &sample, tool, file_offset);
1345} 1343}
1346 1344
1347static s64 perf_session__process_user_event(struct perf_session *session, 1345static s64 perf_session__process_user_event(struct perf_session *session,
@@ -1350,10 +1348,11 @@ static s64 perf_session__process_user_event(struct perf_session *session,
1350{ 1348{
1351 struct ordered_events *oe = &session->ordered_events; 1349 struct ordered_events *oe = &session->ordered_events;
1352 struct perf_tool *tool = session->tool; 1350 struct perf_tool *tool = session->tool;
1351 struct perf_sample sample = { .time = 0, };
1353 int fd = perf_data__fd(session->data); 1352 int fd = perf_data__fd(session->data);
1354 int err; 1353 int err;
1355 1354
1356 dump_event(session->evlist, event, file_offset, NULL); 1355 dump_event(session->evlist, event, file_offset, &sample);
1357 1356
1358 /* These events are processed right away */ 1357 /* These events are processed right away */
1359 switch (event->header.type) { 1358 switch (event->header.type) {
@@ -1495,7 +1494,6 @@ static s64 perf_session__process_event(struct perf_session *session,
1495{ 1494{
1496 struct perf_evlist *evlist = session->evlist; 1495 struct perf_evlist *evlist = session->evlist;
1497 struct perf_tool *tool = session->tool; 1496 struct perf_tool *tool = session->tool;
1498 struct perf_sample sample;
1499 int ret; 1497 int ret;
1500 1498
1501 if (session->header.needs_swap) 1499 if (session->header.needs_swap)
@@ -1509,21 +1507,19 @@ static s64 perf_session__process_event(struct perf_session *session,
1509 if (event->header.type >= PERF_RECORD_USER_TYPE_START) 1507 if (event->header.type >= PERF_RECORD_USER_TYPE_START)
1510 return perf_session__process_user_event(session, event, file_offset); 1508 return perf_session__process_user_event(session, event, file_offset);
1511 1509
1512 /*
1513 * For all kernel events we get the sample data
1514 */
1515 ret = perf_evlist__parse_sample(evlist, event, &sample);
1516 if (ret)
1517 return ret;
1518
1519 if (tool->ordered_events) { 1510 if (tool->ordered_events) {
1520 ret = perf_session__queue_event(session, event, &sample, file_offset); 1511 u64 timestamp = -1ULL;
1512
1513 ret = perf_evlist__parse_sample_timestamp(evlist, event, &timestamp);
1514 if (ret && ret != -1)
1515 return ret;
1516
1517 ret = perf_session__queue_event(session, event, timestamp, file_offset);
1521 if (ret != -ETIME) 1518 if (ret != -ETIME)
1522 return ret; 1519 return ret;
1523 } 1520 }
1524 1521
1525 return perf_session__deliver_event(session, event, &sample, tool, 1522 return perf_session__deliver_event(session, event, tool, file_offset);
1526 file_offset);
1527} 1523}
1528 1524
1529void perf_event_header__bswap(struct perf_event_header *hdr) 1525void perf_event_header__bswap(struct perf_event_header *hdr)
@@ -1777,7 +1773,8 @@ done:
1777 err = perf_session__flush_thread_stacks(session); 1773 err = perf_session__flush_thread_stacks(session);
1778out_err: 1774out_err:
1779 free(buf); 1775 free(buf);
1780 perf_session__warn_about_errors(session); 1776 if (!tool->no_warn)
1777 perf_session__warn_about_errors(session);
1781 ordered_events__free(&session->ordered_events); 1778 ordered_events__free(&session->ordered_events);
1782 auxtrace__free_events(session); 1779 auxtrace__free_events(session);
1783 return err; 1780 return err;
@@ -1933,7 +1930,8 @@ out:
1933 err = perf_session__flush_thread_stacks(session); 1930 err = perf_session__flush_thread_stacks(session);
1934out_err: 1931out_err:
1935 ui_progress__finish(); 1932 ui_progress__finish();
1936 perf_session__warn_about_errors(session); 1933 if (!tool->no_warn)
1934 perf_session__warn_about_errors(session);
1937 /* 1935 /*
1938 * We may switching perf.data output, make ordered_events 1936 * We may switching perf.data output, make ordered_events
1939 * reusable. 1937 * reusable.