Messages in this thread Patch in this message | | | Date | Wed, 7 Oct 2009 07:31:39 GMT | From | tip-bot for Frederic Weisbecker <> | Subject | [tip:perf/core] perf tools: Start the perf.data mapping at data offset in perf trace |
| |
Commit-ID: b209aa1f83964d49a332a7b6b818ebede5cdc6ef Gitweb: http://git.kernel.org/tip/b209aa1f83964d49a332a7b6b818ebede5cdc6ef Author: Frederic Weisbecker <fweisbec@gmail.com> AuthorDate: Tue, 6 Oct 2009 21:21:26 +0200 Committer: Ingo Molnar <mingo@elte.hu> CommitDate: Wed, 7 Oct 2009 08:36:10 +0200
perf tools: Start the perf.data mapping at data offset in perf trace
Currently, we are mapping perf.data in the beginning of the file and use the data offset as a buffer offset.
This may exceed the mapping area if the data offset is upper than page_size * mmap_window and result in a page fault (thing that happen if we merge trace.info in perf.data).
Instead, let's start the mapping in the page that matches our data offset.
v2: Drop a junk from another patch (trace_report() removal)
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Mike Galbraith <efault@gmx.de> Cc: Paul Mackerras <paulus@samba.org> Cc: Tom Zanussi <tzanussi@gmail.com> LKML-Reference: <1254856886-10348-1-git-send-email-fweisbec@gmail.com> Signed-off-by: Ingo Molnar <mingo@elte.hu> --- tools/perf/builtin-trace.c | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletions(-)
diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index 5d4c84d..d573d4e 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c @@ -143,6 +143,7 @@ static int __cmd_trace(void) int ret, rc = EXIT_FAILURE; unsigned long offset = 0; unsigned long head = 0; + unsigned long shift; struct stat perf_stat; event_t *event; uint32_t size; @@ -180,6 +181,10 @@ static int __cmd_trace(void) return EXIT_FAILURE; } + shift = page_size * (head / page_size); + offset += shift; + head -= shift; + remap: buf = (char *)mmap(NULL, page_size * mmap_window, PROT_READ, MAP_SHARED, input, offset); @@ -192,9 +197,9 @@ more: event = (event_t *)(buf + head); if (head + event->header.size >= page_size * mmap_window) { - unsigned long shift = page_size * (head / page_size); int res; + shift = page_size * (head / page_size); res = munmap(buf, page_size * mmap_window); assert(res == 0);
| |