diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2010-11-30 17:49:46 +0000 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2010-11-30 19:59:34 -0200 |
commit | 55b44629f599a2305265ae9c77f9d9bcfd6ddc17 (patch) | |
tree | 2f6f0cacdb78c09b7fc90152bf0e2b89a47ee0d3 /tools/perf/util/session.c | |
parent | d6513281c5f728d138ba895d600b9788e51508b1 (diff) | |
download | op-kernel-dev-55b44629f599a2305265ae9c77f9d9bcfd6ddc17.zip op-kernel-dev-55b44629f599a2305265ae9c77f9d9bcfd6ddc17.tar.gz |
perf session: Use sensible mmap size
On 64bit we can map the whole file in one go, on 32bit we can at least map
32MB and not map/unmap tiny chunks of the file.
Base the progress bar on 1/16 of the data size.
Preparatory patch to get rid of the malloc/memcpy/free of trace data.
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
LKML-Reference: <20101130163820.213687773@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/util/session.c')
-rw-r--r-- | tools/perf/util/session.c | 41 |
1 files changed, 29 insertions, 12 deletions
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c index 9c806ab..752577f 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c @@ -101,7 +101,15 @@ struct perf_session *perf_session__new(const char *filename, int mode, bool forc INIT_LIST_HEAD(&self->dead_threads); self->hists_tree = RB_ROOT; self->last_match = NULL; - self->mmap_window = 32; + /* + * On 64bit we can mmap the data file in one go. No need for tiny mmap + * slices. On 32bit we use 32MB. + */ +#if BITS_PER_LONG == 64 + self->mmap_window = ULLONG_MAX; +#else + self->mmap_window = 32 * 1024 * 1024ULL; +#endif self->machines = RB_ROOT; self->repipe = repipe; INIT_LIST_HEAD(&self->ordered_samples.samples); @@ -738,18 +746,14 @@ int __perf_session__process_events(struct perf_session *session, u64 data_offset, u64 data_size, u64 file_size, struct perf_event_ops *ops) { - u64 head, page_offset, file_offset, file_pos; + u64 head, page_offset, file_offset, file_pos, progress_next; int err, mmap_prot, mmap_flags; struct ui_progress *progress; - size_t page_size; + size_t page_size, mmap_size; event_t *event; uint32_t size; char *buf; - progress = ui_progress__new("Processing events...", session->size); - if (progress == NULL) - return -1; - perf_event_ops__fill_defaults(ops); page_size = sysconf(_SC_PAGESIZE); @@ -761,6 +765,15 @@ int __perf_session__process_events(struct perf_session *session, if (data_offset + data_size < file_size) file_size = data_offset + data_size; + progress_next = file_size / 16; + progress = ui_progress__new("Processing events...", file_size); + if (progress == NULL) + return -1; + + mmap_size = session->mmap_window; + if (mmap_size > file_size) + mmap_size = file_size; + mmap_prot = PROT_READ; mmap_flags = MAP_SHARED; @@ -769,15 +782,14 @@ int __perf_session__process_events(struct perf_session *session, mmap_flags = MAP_PRIVATE; } remap: - buf = mmap(NULL, page_size * session->mmap_window, mmap_prot, - mmap_flags, session->fd, file_offset); + buf = mmap(NULL, mmap_size, mmap_prot, mmap_flags, session->fd, + file_offset); if (buf == MAP_FAILED) { pr_err("failed to mmap file\n"); err = -errno; goto out_err; } file_pos = file_offset + head; - ui_progress__update(progress, file_offset); more: event = (event_t *)(buf + head); @@ -788,10 +800,10 @@ more: if (size == 0) size = 8; - if (head + event->header.size >= page_size * session->mmap_window) { + if (head + event->header.size >= mmap_size) { int munmap_ret; - munmap_ret = munmap(buf, page_size * session->mmap_window); + munmap_ret = munmap(buf, mmap_size); assert(munmap_ret == 0); page_offset = page_size * (head / page_size); @@ -823,6 +835,11 @@ more: head += size; file_pos += size; + if (file_pos >= progress_next) { + progress_next += file_size / 16; + ui_progress__update(progress, file_pos); + } + if (file_pos < file_size) goto more; |