diff options
Diffstat (limited to 'tools/perf/util/session.c')
-rw-r--r-- | tools/perf/util/session.c | 25 |
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: | |||
97 | void perf_session__update_sample_type(struct perf_session *self) | 97 | void 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 | ||
1009 | more: | 1016 | more: |
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]) { |