Messages in this thread Patch in this message | ![/](/images/icornerl.gif) | | From | Jiri Olsa <> | Subject | [PATCH 5/5] perf session: Add reader__process_events function | Date | Wed, 26 Dec 2018 14:51:32 +0100 |
| |
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@git.kernel.org Signed-off-by: Jiri Olsa <jolsa@kernel.org> --- 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
| ![\](/images/icornerr.gif) |