diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c index 6fb4694..5d35e13 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c @@ -143,15 +143,7 @@ struct perf_session *perf_session__new(const char *filename, int mode, INIT_LIST_HEAD(&self->dead_threads); self->hists_tree = RB_ROOT; self->last_match = NULL; - /* - * 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->mmap_window = 32; self->machines = RB_ROOT; self->repipe = repipe; INIT_LIST_HEAD(&self->ordered_samples.samples); @@ -949,14 +941,19 @@ 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, progress_next; + u64 head, page_offset, file_offset, file_pos; int err, mmap_prot, mmap_flags, map_idx = 0; struct ui_progress *progress; - size_t page_size, mmap_size; + size_t page_size; char *buf, *mmaps[8]; event_t *event; uint32_t size; + progress = ui_progress__new("Processing events...", session->size); + if (progress == NULL) + return -1; + + perf_event_ops__fill_defaults(ops); page_size = sysconf(_SC_PAGESIZE); @@ -968,15 +965,6 @@ 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; - memset(mmaps, 0, sizeof(mmaps)); mmap_prot = PROT_READ; @@ -987,13 +975,14 @@ int __perf_session__process_events(struct perf_session *session, mmap_flags = MAP_PRIVATE; } remap: - buf = mmap(NULL, mmap_size, mmap_prot, mmap_flags, session->fd, - file_offset); + buf = mmap(NULL, page_size * session->mmap_window, mmap_prot, + mmap_flags, session->fd, file_offset); if (buf == MAP_FAILED) { pr_err("failed to mmap file\n"); err = -errno; goto out_err; } + ui_progress__update(progress, file_offset); mmaps[map_idx] = buf; map_idx = (map_idx + 1) & (ARRAY_SIZE(mmaps) - 1); file_pos = file_offset + head; @@ -1007,9 +996,9 @@ more: if (size == 0) size = 8; - if (head + event->header.size >= mmap_size) { + if (head + event->header.size >= page_size * session->mmap_window) { if (mmaps[map_idx]) { - munmap(mmaps[map_idx], mmap_size); + munmap(mmaps[map_idx], page_size * session->mmap_window); mmaps[map_idx] = NULL; } @@ -1039,11 +1028,6 @@ 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;