lkml.org 
[lkml]   [2021]   [Oct]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: [PATCH 6/6] perf session: Load single file for analysis
On Wed, Sep 29, 2021 at 11:41:54AM +0300, Alexey Bayduraev wrote:
> Adding EOF flag to reader state and moving the check to reader__mmap.
> Separating reading code of single event into reader__read_event function.
> Adding basic reader return codes to simplify the code and introducing
> remap/read_event loop in __perf_session__process_events.
>
> Suggested-by: Jiri Olsa <jolsa@kernel.org>
> Acked-by: Namhyung Kim <namhyung@gmail.com>
> Reviewed-by: Riccardo Mancini <rickyman7@gmail.com>
> Tested-by: Riccardo Mancini <rickyman7@gmail.com>
> Signed-off-by: Alexey Bayduraev <alexey.v.bayduraev@linux.intel.com>
> ---
> tools/perf/util/session.c | 72 ++++++++++++++++++++++++---------------
> 1 file changed, 45 insertions(+), 27 deletions(-)
>
> diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
> index 5e08def72b41..9a4fe78a7a54 100644
> --- a/tools/perf/util/session.c
> +++ b/tools/perf/util/session.c
> @@ -63,6 +63,13 @@ struct reader_state {
> u64 file_offset;
> u64 data_size;
> u64 head;
> + bool eof;

what's this flag for? I can't see it being used

jirka

> +};
> +
> +enum {
> + READER_EOF,
> + READER_NODATA,
> + READER_OK,
> };
>
> struct reader {
> @@ -2242,6 +2249,11 @@ reader__mmap(struct reader *rd, struct perf_session *session)
> char *buf, **mmaps = st->mmaps;
> u64 page_offset;
>
> + if (st->file_pos >= st->data_size) {
> + st->eof = true;
> + return READER_EOF;
> + }
> +
> mmap_prot = PROT_READ;
> mmap_flags = MAP_SHARED;
>
> @@ -2270,36 +2282,26 @@ reader__mmap(struct reader *rd, struct perf_session *session)
> 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;
> + return READER_OK;
> }
>
> static int
> -reader__process_events(struct reader *rd, struct perf_session *session,
> - struct ui_progress *prog)
> +reader__read_event(struct reader *rd, struct perf_session *session,
> + struct ui_progress *prog)
> {
> struct reader_state *st = &rd->state;
> - u64 size;
> - int err = 0;
> + int err = READER_OK;
> union perf_event *event;
> + u64 size;
> s64 skip;
>
> -remap:
> - err = reader__mmap(rd, session);
> - if (err)
> - goto out;
> - if (session->one_mmap) {
> - session->one_mmap_addr = rd->state.mmap_cur;
> - session->one_mmap_offset = rd->state.file_offset;
> - }
> -
> -more:
> event = fetch_mmaped_event(st->head, st->mmap_size, st->mmap_cur,
> session->header.needs_swap);
> if (IS_ERR(event))
> return PTR_ERR(event);
>
> if (!event)
> - goto remap;
> + return READER_NODATA;
>
> session->active_reader = rd;
> size = event->header.size;
> @@ -2321,18 +2323,12 @@ reader__process_events(struct reader *rd, struct perf_session *session,
> st->head += size;
> st->file_pos += size;
>
> - err = __perf_session__process_decomp_events(session);
> - if (err)
> - goto out;
> + skip = __perf_session__process_decomp_events(session);
> + if (skip)
> + err = skip;
>
> ui_progress__update(prog, size);
>
> - if (session_done())
> - goto out;
> -
> - if (st->file_pos < st->data_size)
> - goto more;
> -
> out:
> session->active_reader = NULL;
> return err;
> @@ -2369,9 +2365,31 @@ static int __perf_session__process_events(struct perf_session *session)
> err = reader__init(&rd, &session->one_mmap);
> if (err)
> goto out_err;
> - err = reader__process_events(&rd, session, &prog);
> - if (err)
> + err = reader__mmap(&rd, session);
> + if (err != READER_OK) {
> + if (err == READER_EOF)
> + err = -EINVAL;
> goto out_err;
> + }
> + if (session->one_mmap) {
> + session->one_mmap_addr = rd.state.mmap_cur;
> + session->one_mmap_offset = rd.state.file_offset;
> + }
> +
> + while (true) {
> + if (session_done())
> + break;
> +
> + err = reader__read_event(&rd, session, &prog);
> + if (err < 0)
> + break;
> + if (err == READER_NODATA) {
> + err = reader__mmap(&rd, session);
> + if (err <= 0)
> + break;
> + }
> + }
> +
> /* do the final flush for ordered samples */
> err = ordered_events__flush(oe, OE_FLUSH__FINAL);
> if (err)
> --
> 2.19.0
>

\
 
 \ /
  Last update: 2021-10-04 15:26    [W:0.048 / U:0.904 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site