Skip to content

Commit

Permalink
perf session: Use sensible mmap size
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Thomas Gleixner authored and Arnaldo Carvalho de Melo committed Nov 30, 2010
1 parent d651328 commit 55b4462
Showing 1 changed file with 29 additions and 12 deletions.
41 changes: 29 additions & 12 deletions tools/perf/util/session.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand All @@ -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;

Expand All @@ -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);
Expand All @@ -788,10 +800,10 @@ int __perf_session__process_events(struct perf_session *session,
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);
Expand Down Expand Up @@ -823,6 +835,11 @@ int __perf_session__process_events(struct perf_session *session,
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;

Expand Down

0 comments on commit 55b4462

Please sign in to comment.