|
@@ -960,6 +960,30 @@ out_err:
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
+static union perf_event *
|
|
|
+fetch_mmaped_event(struct perf_session *session,
|
|
|
+ u64 head, size_t mmap_size, char *buf)
|
|
|
+{
|
|
|
+ union perf_event *event;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Ensure we have enough space remaining to read
|
|
|
+ * the size of the event in the headers.
|
|
|
+ */
|
|
|
+ if (head + sizeof(event->header) > mmap_size)
|
|
|
+ return NULL;
|
|
|
+
|
|
|
+ event = (union perf_event *)(buf + head);
|
|
|
+
|
|
|
+ if (session->header.needs_swap)
|
|
|
+ perf_event_header__bswap(&event->header);
|
|
|
+
|
|
|
+ if (head + event->header.size > mmap_size)
|
|
|
+ return NULL;
|
|
|
+
|
|
|
+ return event;
|
|
|
+}
|
|
|
+
|
|
|
int __perf_session__process_events(struct perf_session *session,
|
|
|
u64 data_offset, u64 data_size,
|
|
|
u64 file_size, struct perf_event_ops *ops)
|
|
@@ -1014,19 +1038,8 @@ remap:
|
|
|
file_pos = file_offset + head;
|
|
|
|
|
|
more:
|
|
|
- /*
|
|
|
- * Ensure we have enough space remaining to read
|
|
|
- * the size of the event in the headers.
|
|
|
- */
|
|
|
- if (head + sizeof(event->header) > mmap_size)
|
|
|
- goto remap;
|
|
|
-
|
|
|
- event = (union perf_event *)(buf + head);
|
|
|
-
|
|
|
- if (session->header.needs_swap)
|
|
|
- perf_event_header__bswap(&event->header);
|
|
|
-
|
|
|
- if (head + event->header.size > mmap_size) {
|
|
|
+ event = fetch_mmaped_event(session, head, mmap_size, buf);
|
|
|
+ if (!event) {
|
|
|
if (mmaps[map_idx]) {
|
|
|
munmap(mmaps[map_idx], mmap_size);
|
|
|
mmaps[map_idx] = NULL;
|