diff options
Diffstat (limited to 'tools')
| -rw-r--r-- | tools/perf/util/session.c | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c index 3c140daba63a..9c806ab565ea 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c | |||
| @@ -738,7 +738,7 @@ int __perf_session__process_events(struct perf_session *session, | |||
| 738 | u64 data_offset, u64 data_size, | 738 | u64 data_offset, u64 data_size, |
| 739 | u64 file_size, struct perf_event_ops *ops) | 739 | u64 file_size, struct perf_event_ops *ops) |
| 740 | { | 740 | { |
| 741 | u64 head, page_offset, file_offset; | 741 | u64 head, page_offset, file_offset, file_pos; |
| 742 | int err, mmap_prot, mmap_flags; | 742 | int err, mmap_prot, mmap_flags; |
| 743 | struct ui_progress *progress; | 743 | struct ui_progress *progress; |
| 744 | size_t page_size; | 744 | size_t page_size; |
| @@ -758,6 +758,9 @@ int __perf_session__process_events(struct perf_session *session, | |||
| 758 | file_offset = page_offset; | 758 | file_offset = page_offset; |
| 759 | head = data_offset - page_offset; | 759 | head = data_offset - page_offset; |
| 760 | 760 | ||
| 761 | if (data_offset + data_size < file_size) | ||
| 762 | file_size = data_offset + data_size; | ||
| 763 | |||
| 761 | mmap_prot = PROT_READ; | 764 | mmap_prot = PROT_READ; |
| 762 | mmap_flags = MAP_SHARED; | 765 | mmap_flags = MAP_SHARED; |
| 763 | 766 | ||
| @@ -773,6 +776,7 @@ remap: | |||
| 773 | err = -errno; | 776 | err = -errno; |
| 774 | goto out_err; | 777 | goto out_err; |
| 775 | } | 778 | } |
| 779 | file_pos = file_offset + head; | ||
| 776 | ui_progress__update(progress, file_offset); | 780 | ui_progress__update(progress, file_offset); |
| 777 | 781 | ||
| 778 | more: | 782 | more: |
| @@ -799,10 +803,10 @@ more: | |||
| 799 | size = event->header.size; | 803 | size = event->header.size; |
| 800 | 804 | ||
| 801 | dump_printf("\n%#Lx [%#x]: event: %d\n", | 805 | dump_printf("\n%#Lx [%#x]: event: %d\n", |
| 802 | file_offset + head, event->header.size, event->header.type); | 806 | file_pos, event->header.size, event->header.type); |
| 803 | 807 | ||
| 804 | if (size == 0 || perf_session__process_event(session, event, ops, | 808 | if (size == 0 || |
| 805 | file_offset + head) < 0) { | 809 | perf_session__process_event(session, event, ops, file_pos) < 0) { |
| 806 | dump_printf("%#Lx [%#x]: skipping unknown header type: %d\n", | 810 | dump_printf("%#Lx [%#x]: skipping unknown header type: %d\n", |
| 807 | file_offset + head, event->header.size, | 811 | file_offset + head, event->header.size, |
| 808 | event->header.type); | 812 | event->header.type); |
| @@ -817,13 +821,11 @@ more: | |||
| 817 | } | 821 | } |
| 818 | 822 | ||
| 819 | head += size; | 823 | head += size; |
| 824 | file_pos += size; | ||
| 820 | 825 | ||
| 821 | if (file_offset + head >= data_offset + data_size) | 826 | if (file_pos < file_size) |
| 822 | goto done; | ||
| 823 | |||
| 824 | if (file_offset + head < file_size) | ||
| 825 | goto more; | 827 | goto more; |
| 826 | done: | 828 | |
| 827 | err = 0; | 829 | err = 0; |
| 828 | /* do the final flush for ordered samples */ | 830 | /* do the final flush for ordered samples */ |
| 829 | session->ordered_samples.next_flush = ULLONG_MAX; | 831 | session->ordered_samples.next_flush = ULLONG_MAX; |
