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.c25
1 files changed, 18 insertions, 7 deletions
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index fff66741f18..948327d9e92 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -97,6 +97,7 @@ out:
97void perf_session__update_sample_type(struct perf_session *self) 97void perf_session__update_sample_type(struct perf_session *self)
98{ 98{
99 self->sample_type = perf_evlist__sample_type(self->evlist); 99 self->sample_type = perf_evlist__sample_type(self->evlist);
100 self->sample_size = perf_sample_size(self->sample_type);
100 self->sample_id_all = perf_evlist__sample_id_all(self->evlist); 101 self->sample_id_all = perf_evlist__sample_id_all(self->evlist);
101 perf_session__id_header_size(self); 102 perf_session__id_header_size(self);
102} 103}
@@ -479,6 +480,7 @@ static void flush_sample_queue(struct perf_session *s,
479 struct perf_sample sample; 480 struct perf_sample sample;
480 u64 limit = os->next_flush; 481 u64 limit = os->next_flush;
481 u64 last_ts = os->last_sample ? os->last_sample->timestamp : 0ULL; 482 u64 last_ts = os->last_sample ? os->last_sample->timestamp : 0ULL;
483 int ret;
482 484
483 if (!ops->ordered_samples || !limit) 485 if (!ops->ordered_samples || !limit)
484 return; 486 return;
@@ -487,9 +489,12 @@ static void flush_sample_queue(struct perf_session *s,
487 if (iter->timestamp > limit) 489 if (iter->timestamp > limit)
488 break; 490 break;
489 491
490 perf_session__parse_sample(s, iter->event, &sample); 492 ret = perf_session__parse_sample(s, iter->event, &sample);
491 perf_session_deliver_event(s, iter->event, &sample, ops, 493 if (ret)
492 iter->file_offset); 494 pr_err("Can't parse sample, err = %d\n", ret);
495 else
496 perf_session_deliver_event(s, iter->event, &sample, ops,
497 iter->file_offset);
493 498
494 os->last_flush = iter->timestamp; 499 os->last_flush = iter->timestamp;
495 list_del(&iter->list); 500 list_del(&iter->list);
@@ -805,7 +810,9 @@ static int perf_session__process_event(struct perf_session *session,
805 /* 810 /*
806 * For all kernel events we get the sample data 811 * For all kernel events we get the sample data
807 */ 812 */
808 perf_session__parse_sample(session, event, &sample); 813 ret = perf_session__parse_sample(session, event, &sample);
814 if (ret)
815 return ret;
809 816
810 /* Preprocess sample records - precheck callchains */ 817 /* Preprocess sample records - precheck callchains */
811 if (perf_session__preprocess_sample(session, event, &sample)) 818 if (perf_session__preprocess_sample(session, event, &sample))
@@ -1007,13 +1014,17 @@ remap:
1007 file_pos = file_offset + head; 1014 file_pos = file_offset + head;
1008 1015
1009more: 1016more:
1017 /*
1018 * Ensure we have enough space remaining to read
1019 * the size of the event in the headers.
1020 */
1021 if (head + sizeof(event->header) > mmap_size)
1022 goto remap;
1023
1010 event = (union perf_event *)(buf + head); 1024 event = (union perf_event *)(buf + head);
1011 1025
1012 if (session->header.needs_swap) 1026 if (session->header.needs_swap)
1013 perf_event_header__bswap(&event->header); 1027 perf_event_header__bswap(&event->header);
1014 size = event->header.size;
1015 if (size == 0)
1016 size = 8;
1017 1028
1018 if (head + event->header.size > mmap_size) { 1029 if (head + event->header.size > mmap_size) {
1019 if (mmaps[map_idx]) { 1030 if (mmaps[map_idx]) {