[PATCH 5/5] perf session: Add reader__process_events function

From: Jiri Olsa
Date: Wed Dec 26 2018 - 08:51:55 EST


Adding reader__process_events function to readers data.

The reader object is defined by file's fd, data offset
and data size.

Now we can simply define reader object for arbitrary file
data portion and pass it to reader__process_events function
to process its data.

Link: http://lkml.kernel.org/n/tip-sh3yfoavlzr2f45rf8g6145j@xxxxxxxxxxxxxx
Signed-off-by: Jiri Olsa <jolsa@xxxxxxxxxx>
---
tools/perf/util/session.c | 62 ++++++++++++++++++++++++---------------
1 file changed, 38 insertions(+), 24 deletions(-)

diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index bc2a4f80535c..6a9dc5f0675c 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -1819,36 +1819,25 @@ struct reader {
u64 data_offset;
};

-static int __perf_session__process_events(struct perf_session *session)
+static int
+reader__process_events(struct reader *rd, struct perf_session *session,
+ struct ui_progress *prog)
{
- struct reader rd = {
- .fd = perf_data__fd(session->data),
- .data_size = session->header.data_size,
- .data_offset = session->header.data_offset,
- };
- struct ordered_events *oe = &session->ordered_events;
- struct perf_tool *tool = session->tool;
- u64 data_size = rd.data_size;
+ u64 data_size = rd->data_size;
u64 head, page_offset, file_offset, file_pos, size;
- int err, mmap_prot, mmap_flags, map_idx = 0;
+ int err = 0, mmap_prot, mmap_flags, map_idx = 0;
size_t mmap_size;
char *buf, *mmaps[NUM_MMAPS];
union perf_event *event;
- struct ui_progress prog;
s64 skip;

- perf_tool__fill_defaults(tool);
-
- page_offset = page_size * (rd.data_offset / page_size);
+ page_offset = page_size * (rd->data_offset / page_size);
file_offset = page_offset;
- head = rd.data_offset - page_offset;
+ head = rd->data_offset - page_offset;

- if (data_size == 0)
- goto out;
+ ui_progress__init_size(prog, data_size, "Processing events...");

- ui_progress__init_size(&prog, data_size, "Processing events...");
-
- data_size += rd.data_offset;
+ data_size += rd->data_offset;

mmap_size = MMAP_SIZE;
if (mmap_size > data_size) {
@@ -1866,12 +1855,12 @@ static int __perf_session__process_events(struct perf_session *session)
mmap_flags = MAP_PRIVATE;
}
remap:
- buf = mmap(NULL, mmap_size, mmap_prot, mmap_flags, rd.fd,
+ buf = mmap(NULL, mmap_size, mmap_prot, mmap_flags, rd->fd,
file_offset);
if (buf == MAP_FAILED) {
pr_err("failed to mmap file\n");
err = -errno;
- goto out_err;
+ goto out;
}
mmaps[map_idx] = buf;
map_idx = (map_idx + 1) & (ARRAY_SIZE(mmaps) - 1);
@@ -1903,7 +1892,7 @@ static int __perf_session__process_events(struct perf_session *session)
file_offset + head, event->header.size,
event->header.type);
err = -EINVAL;
- goto out_err;
+ goto out;
}

if (skip)
@@ -1912,7 +1901,7 @@ static int __perf_session__process_events(struct perf_session *session)
head += size;
file_pos += size;

- ui_progress__update(&prog, size);
+ ui_progress__update(prog, size);

if (session_done())
goto out;
@@ -1921,6 +1910,31 @@ static int __perf_session__process_events(struct perf_session *session)
goto more;

out:
+ return err;
+}
+
+static int __perf_session__process_events(struct perf_session *session)
+{
+ struct reader rd = {
+ .fd = perf_data__fd(session->data),
+ .data_size = session->header.data_size,
+ .data_offset = session->header.data_offset,
+ };
+ struct ordered_events *oe = &session->ordered_events;
+ struct perf_tool *tool = session->tool;
+ struct ui_progress prog;
+ int err;
+
+ perf_tool__fill_defaults(tool);
+
+ if (rd.data_size == 0)
+ return -1;
+
+ ui_progress__init_size(&prog, rd.data_size, "Processing events...");
+
+ err = reader__process_events(&rd, session, &prog);
+ if (err)
+ goto out_err;
/* do the final flush for ordered samples */
err = ordered_events__flush(oe, OE_FLUSH__FINAL);
if (err)
--
2.17.2