diff options
Diffstat (limited to 'tools')
-rw-r--r-- | tools/perf/util/session.c | 39 |
1 files changed, 26 insertions, 13 deletions
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c index 948327d9e92b..64500fc78799 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c | |||
@@ -960,6 +960,30 @@ out_err: | |||
960 | return err; | 960 | return err; |
961 | } | 961 | } |
962 | 962 | ||
963 | static union perf_event * | ||
964 | fetch_mmaped_event(struct perf_session *session, | ||
965 | u64 head, size_t mmap_size, char *buf) | ||
966 | { | ||
967 | union perf_event *event; | ||
968 | |||
969 | /* | ||
970 | * Ensure we have enough space remaining to read | ||
971 | * the size of the event in the headers. | ||
972 | */ | ||
973 | if (head + sizeof(event->header) > mmap_size) | ||
974 | return NULL; | ||
975 | |||
976 | event = (union perf_event *)(buf + head); | ||
977 | |||
978 | if (session->header.needs_swap) | ||
979 | perf_event_header__bswap(&event->header); | ||
980 | |||
981 | if (head + event->header.size > mmap_size) | ||
982 | return NULL; | ||
983 | |||
984 | return event; | ||
985 | } | ||
986 | |||
963 | int __perf_session__process_events(struct perf_session *session, | 987 | int __perf_session__process_events(struct perf_session *session, |
964 | u64 data_offset, u64 data_size, | 988 | u64 data_offset, u64 data_size, |
965 | u64 file_size, struct perf_event_ops *ops) | 989 | u64 file_size, struct perf_event_ops *ops) |
@@ -1014,19 +1038,8 @@ remap: | |||
1014 | file_pos = file_offset + head; | 1038 | file_pos = file_offset + head; |
1015 | 1039 | ||
1016 | more: | 1040 | more: |
1017 | /* | 1041 | event = fetch_mmaped_event(session, head, mmap_size, buf); |
1018 | * Ensure we have enough space remaining to read | 1042 | if (!event) { |
1019 | * the size of the event in the headers. | ||
1020 | */ | ||
1021 | if (head + sizeof(event->header) > mmap_size) | ||
1022 | goto remap; | ||
1023 | |||
1024 | event = (union perf_event *)(buf + head); | ||
1025 | |||
1026 | if (session->header.needs_swap) | ||
1027 | perf_event_header__bswap(&event->header); | ||
1028 | |||
1029 | if (head + event->header.size > mmap_size) { | ||
1030 | if (mmaps[map_idx]) { | 1043 | if (mmaps[map_idx]) { |
1031 | munmap(mmaps[map_idx], mmap_size); | 1044 | munmap(mmaps[map_idx], mmap_size); |
1032 | mmaps[map_idx] = NULL; | 1045 | mmaps[map_idx] = NULL; |