From 2d844e912d2419e4bd03c6ae2dc127fd3af026d4 Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Tue, 30 Nov 2010 17:49:49 +0000 Subject: [PATCH] --- yaml --- r: 223855 b: refs/heads/master c: fe17420784a6d3602e98f798731369fa05936cbe h: refs/heads/master i: 223853: 966e6ebe55dc45e9db6925456e842efdae629fd5 223851: 8423a6de79669ba95577c45d65825a776e6281db 223847: 2a9c4e2cf32cc9f2068927b5719b1a1cc4f17b74 223839: 0d8a73091ed92efe0a3a5af401e863b69894fd8d v: v3 --- [refs] | 2 +- trunk/tools/perf/util/session.c | 27 +++++++++++---------------- 2 files changed, 12 insertions(+), 17 deletions(-) diff --git a/[refs] b/[refs] index dc2e71240cf7..547e4a0fc6f5 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 55b44629f599a2305265ae9c77f9d9bcfd6ddc17 +refs/heads/master: fe17420784a6d3602e98f798731369fa05936cbe diff --git a/trunk/tools/perf/util/session.c b/trunk/tools/perf/util/session.c index 752577fdb16e..c98958314102 100644 --- a/trunk/tools/perf/util/session.c +++ b/trunk/tools/perf/util/session.c @@ -418,7 +418,6 @@ static void flush_sample_queue(struct perf_session *s, os->last_flush = iter->timestamp; list_del(&iter->list); - free(iter->event); free(iter); } @@ -531,7 +530,6 @@ static int queue_sample_event(event_t *event, struct sample_data *data, u64 timestamp = data->time; struct sample_queue *new; - if (timestamp < s->ordered_samples.last_flush) { printf("Warning: Timestamp below last timeslice flush\n"); return -EINVAL; @@ -542,14 +540,7 @@ static int queue_sample_event(event_t *event, struct sample_data *data, return -ENOMEM; new->timestamp = timestamp; - - new->event = malloc(event->header.size); - if (!new->event) { - free(new); - return -ENOMEM; - } - - memcpy(new->event, event, event->header.size); + new->event = event; __queue_sample_event(new, s); @@ -747,12 +738,12 @@ int __perf_session__process_events(struct perf_session *session, u64 file_size, struct perf_event_ops *ops) { u64 head, page_offset, file_offset, file_pos, progress_next; - int err, mmap_prot, mmap_flags; + int err, mmap_prot, mmap_flags, map_idx = 0; struct ui_progress *progress; size_t page_size, mmap_size; + char *buf, *mmaps[8]; event_t *event; uint32_t size; - char *buf; perf_event_ops__fill_defaults(ops); @@ -774,6 +765,8 @@ int __perf_session__process_events(struct perf_session *session, if (mmap_size > file_size) mmap_size = file_size; + memset(mmaps, 0, sizeof(mmaps)); + mmap_prot = PROT_READ; mmap_flags = MAP_SHARED; @@ -789,6 +782,8 @@ int __perf_session__process_events(struct perf_session *session, err = -errno; goto out_err; } + mmaps[map_idx] = buf; + map_idx = (map_idx + 1) & (ARRAY_SIZE(mmaps) - 1); file_pos = file_offset + head; more: @@ -801,10 +796,10 @@ int __perf_session__process_events(struct perf_session *session, size = 8; if (head + event->header.size >= mmap_size) { - int munmap_ret; - - munmap_ret = munmap(buf, mmap_size); - assert(munmap_ret == 0); + if (mmaps[map_idx]) { + munmap(mmaps[map_idx], mmap_size); + mmaps[map_idx] = NULL; + } page_offset = page_size * (head / page_size); file_offset += page_offset;