[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <8da6e8e3dadf7f6b88277a2d3bfec83ad500892d.1629186429.git.alexey.v.bayduraev@linux.intel.com>
Date: Tue, 17 Aug 2021 11:23:25 +0300
From: Alexey Bayduraev <alexey.v.bayduraev@...ux.intel.com>
To: Arnaldo Carvalho de Melo <acme@...nel.org>
Cc: Jiri Olsa <jolsa@...hat.com>, Namhyung Kim <namhyung@...nel.org>,
Alexander Shishkin <alexander.shishkin@...ux.intel.com>,
Peter Zijlstra <peterz@...radead.org>,
Ingo Molnar <mingo@...hat.com>,
linux-kernel <linux-kernel@...r.kernel.org>,
Andi Kleen <ak@...ux.intel.com>,
Adrian Hunter <adrian.hunter@...el.com>,
Alexander Antonov <alexander.antonov@...ux.intel.com>,
Alexei Budankov <abudankov@...wei.com>,
Riccardo Mancini <rickyman7@...il.com>
Subject: [PATCH v11 22/24] perf session: Move map/unmap into reader__mmap function
Moving mapping and unmapping code into reader__mmap, so the mmap
code is located together. Moving head/file_offset computation into
reader__mmap function, so all the offset computation is located
together and in one place only.
Design and implementation are based on the prototype [1], [2].
[1] git clone https://git.kernel.org/pub/scm/linux/kernel/git/jolsa/perf.git -b perf/record_threads
[2] https://lore.kernel.org/lkml/20180913125450.21342-1-jolsa@kernel.org/
Suggested-by: Jiri Olsa <jolsa@...nel.org>
Acked-by: Namhyung Kim <namhyung@...il.com>
Reviewed-by: Riccardo Mancini <rickyman7@...il.com>
Tested-by: Riccardo Mancini <rickyman7@...il.com>
Signed-off-by: Alexey Bayduraev <alexey.v.bayduraev@...ux.intel.com>
---
tools/perf/util/session.c | 60 +++++++++++++++++++++++----------------
1 file changed, 35 insertions(+), 25 deletions(-)
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index 3cb1691483f3..e9a7cba31194 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -2219,14 +2219,11 @@ static int
reader__init(struct reader *rd, bool *one_mmap)
{
struct reader_state *st = &rd->state;
- u64 page_offset;
char **mmaps = st->mmaps;
pr_debug("reader processing %s\n", rd->path);
- page_offset = page_size * (rd->data_offset / page_size);
- st->file_offset = page_offset;
- st->head = rd->data_offset - page_offset;
+ st->head = rd->data_offset;
st->data_size = rd->data_size + rd->data_offset;
@@ -2246,15 +2243,12 @@ reader__init(struct reader *rd, bool *one_mmap)
}
static int
-reader__process_events(struct reader *rd, struct perf_session *session,
- struct ui_progress *prog)
+reader__mmap(struct reader *rd, struct perf_session *session)
{
struct reader_state *st = &rd->state;
- u64 page_offset, size;
- int err = 0, mmap_prot, mmap_flags;
+ int mmap_prot, mmap_flags;
char *buf, **mmaps = st->mmaps;
- union perf_event *event;
- s64 skip;
+ u64 page_offset;
mmap_prot = PROT_READ;
mmap_flags = MAP_SHARED;
@@ -2265,20 +2259,45 @@ reader__process_events(struct reader *rd, struct perf_session *session,
mmap_prot |= PROT_WRITE;
mmap_flags = MAP_PRIVATE;
}
-remap:
+
+ if (mmaps[st->mmap_idx]) {
+ munmap(mmaps[st->mmap_idx], st->mmap_size);
+ mmaps[st->mmap_idx] = NULL;
+ }
+
+ page_offset = page_size * (st->head / page_size);
+ st->file_offset += page_offset;
+ st->head -= page_offset;
+
buf = mmap(NULL, st->mmap_size, mmap_prot, mmap_flags, rd->fd,
st->file_offset);
if (buf == MAP_FAILED) {
pr_err("failed to mmap file\n");
- err = -errno;
- goto out;
+ return -errno;
}
mmaps[st->mmap_idx] = st->mmap_cur = buf;
st->mmap_idx = (st->mmap_idx + 1) & (ARRAY_SIZE(st->mmaps) - 1);
st->file_pos = st->file_offset + st->head;
+ return 0;
+}
+
+static int
+reader__process_events(struct reader *rd, struct perf_session *session,
+ struct ui_progress *prog)
+{
+ struct reader_state *st = &rd->state;
+ u64 size;
+ int err = 0;
+ union perf_event *event;
+ s64 skip;
+
+remap:
+ err = reader__mmap(rd, session);
+ if (err)
+ goto out;
if (session->one_mmap) {
- session->one_mmap_addr = buf;
- session->one_mmap_offset = st->file_offset;
+ session->one_mmap_addr = rd->state.mmap_cur;
+ session->one_mmap_offset = rd->state.file_offset;
}
more:
@@ -2287,17 +2306,8 @@ reader__process_events(struct reader *rd, struct perf_session *session,
if (IS_ERR(event))
return PTR_ERR(event);
- if (!event) {
- if (mmaps[st->mmap_idx]) {
- munmap(mmaps[st->mmap_idx], st->mmap_size);
- mmaps[st->mmap_idx] = NULL;
- }
-
- page_offset = page_size * (st->head / page_size);
- st->file_offset += page_offset;
- st->head -= page_offset;
+ if (!event)
goto remap;
- }
session->active_reader = rd;
size = event->header.size;
--
2.19.0
Powered by blists - more mailing lists