diff options
Diffstat (limited to 'tools/perf/util/session.c')
-rw-r--r-- | tools/perf/util/session.c | 27 |
1 files changed, 11 insertions, 16 deletions
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c index 752577fdb16e..c98958314102 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c | |||
@@ -418,7 +418,6 @@ static void flush_sample_queue(struct perf_session *s, | |||
418 | 418 | ||
419 | os->last_flush = iter->timestamp; | 419 | os->last_flush = iter->timestamp; |
420 | list_del(&iter->list); | 420 | list_del(&iter->list); |
421 | free(iter->event); | ||
422 | free(iter); | 421 | free(iter); |
423 | } | 422 | } |
424 | 423 | ||
@@ -531,7 +530,6 @@ static int queue_sample_event(event_t *event, struct sample_data *data, | |||
531 | u64 timestamp = data->time; | 530 | u64 timestamp = data->time; |
532 | struct sample_queue *new; | 531 | struct sample_queue *new; |
533 | 532 | ||
534 | |||
535 | if (timestamp < s->ordered_samples.last_flush) { | 533 | if (timestamp < s->ordered_samples.last_flush) { |
536 | printf("Warning: Timestamp below last timeslice flush\n"); | 534 | printf("Warning: Timestamp below last timeslice flush\n"); |
537 | return -EINVAL; | 535 | return -EINVAL; |
@@ -542,14 +540,7 @@ static int queue_sample_event(event_t *event, struct sample_data *data, | |||
542 | return -ENOMEM; | 540 | return -ENOMEM; |
543 | 541 | ||
544 | new->timestamp = timestamp; | 542 | new->timestamp = timestamp; |
545 | 543 | new->event = event; | |
546 | new->event = malloc(event->header.size); | ||
547 | if (!new->event) { | ||
548 | free(new); | ||
549 | return -ENOMEM; | ||
550 | } | ||
551 | |||
552 | memcpy(new->event, event, event->header.size); | ||
553 | 544 | ||
554 | __queue_sample_event(new, s); | 545 | __queue_sample_event(new, s); |
555 | 546 | ||
@@ -747,12 +738,12 @@ int __perf_session__process_events(struct perf_session *session, | |||
747 | u64 file_size, struct perf_event_ops *ops) | 738 | u64 file_size, struct perf_event_ops *ops) |
748 | { | 739 | { |
749 | u64 head, page_offset, file_offset, file_pos, progress_next; | 740 | u64 head, page_offset, file_offset, file_pos, progress_next; |
750 | int err, mmap_prot, mmap_flags; | 741 | int err, mmap_prot, mmap_flags, map_idx = 0; |
751 | struct ui_progress *progress; | 742 | struct ui_progress *progress; |
752 | size_t page_size, mmap_size; | 743 | size_t page_size, mmap_size; |
744 | char *buf, *mmaps[8]; | ||
753 | event_t *event; | 745 | event_t *event; |
754 | uint32_t size; | 746 | uint32_t size; |
755 | char *buf; | ||
756 | 747 | ||
757 | perf_event_ops__fill_defaults(ops); | 748 | perf_event_ops__fill_defaults(ops); |
758 | 749 | ||
@@ -774,6 +765,8 @@ int __perf_session__process_events(struct perf_session *session, | |||
774 | if (mmap_size > file_size) | 765 | if (mmap_size > file_size) |
775 | mmap_size = file_size; | 766 | mmap_size = file_size; |
776 | 767 | ||
768 | memset(mmaps, 0, sizeof(mmaps)); | ||
769 | |||
777 | mmap_prot = PROT_READ; | 770 | mmap_prot = PROT_READ; |
778 | mmap_flags = MAP_SHARED; | 771 | mmap_flags = MAP_SHARED; |
779 | 772 | ||
@@ -789,6 +782,8 @@ remap: | |||
789 | err = -errno; | 782 | err = -errno; |
790 | goto out_err; | 783 | goto out_err; |
791 | } | 784 | } |
785 | mmaps[map_idx] = buf; | ||
786 | map_idx = (map_idx + 1) & (ARRAY_SIZE(mmaps) - 1); | ||
792 | file_pos = file_offset + head; | 787 | file_pos = file_offset + head; |
793 | 788 | ||
794 | more: | 789 | more: |
@@ -801,10 +796,10 @@ more: | |||
801 | size = 8; | 796 | size = 8; |
802 | 797 | ||
803 | if (head + event->header.size >= mmap_size) { | 798 | if (head + event->header.size >= mmap_size) { |
804 | int munmap_ret; | 799 | if (mmaps[map_idx]) { |
805 | 800 | munmap(mmaps[map_idx], mmap_size); | |
806 | munmap_ret = munmap(buf, mmap_size); | 801 | mmaps[map_idx] = NULL; |
807 | assert(munmap_ret == 0); | 802 | } |
808 | 803 | ||
809 | page_offset = page_size * (head / page_size); | 804 | page_offset = page_size * (head / page_size); |
810 | file_offset += page_offset; | 805 | file_offset += page_offset; |