All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jiri Olsa <jolsa@redhat.com>
To: Alexey Bayduraev <alexey.v.bayduraev@linux.intel.com>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>,
	Namhyung Kim <namhyung@kernel.org>,
	Alexander Shishkin <alexander.shishkin@linux.intel.com>,
	Peter Zijlstra <peterz@infradead.org>,
	Ingo Molnar <mingo@redhat.com>,
	linux-kernel <linux-kernel@vger.kernel.org>,
	Andi Kleen <ak@linux.intel.com>,
	Adrian Hunter <adrian.hunter@intel.com>,
	Alexander Antonov <alexander.antonov@linux.intel.com>,
	Alexei Budankov <abudankov@huawei.com>,
	Riccardo Mancini <rickyman7@gmail.com>
Subject: Re: [PATCH 3/6] perf session: Introduce decompressor into reader object
Date: Mon, 4 Oct 2021 15:53:40 +0200	[thread overview]
Message-ID: <YVsHZCv6mGdO7jGv@krava> (raw)
In-Reply-To: <92dd8a7b9cf92f856cdd38114fc33eda4c5aba1a.1632900802.git.alexey.v.bayduraev@linux.intel.com>

On Wed, Sep 29, 2021 at 11:41:51AM +0300, Alexey Bayduraev wrote:
> Introduce decompressor into reader object so that decompression
> could be executed separately for each data file. Adding active_reader
> into perf_session object to select current decompressor.
> 
> 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 | 48 +++++++++++++++++++++++++++++----------
>  tools/perf/util/session.h |  2 ++
>  2 files changed, 38 insertions(+), 12 deletions(-)
> 
> diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
> index 262efc18caac..3bea0830b3b8 100644
> --- a/tools/perf/util/session.c
> +++ b/tools/perf/util/session.c
> @@ -71,6 +71,9 @@ struct reader {
>  	u64		 data_offset;
>  	reader_cb_t	 process;
>  	bool		 in_place_update;
> +	struct zstd_data zstd_data;
> +	struct decomp	 *decomp;
> +	struct decomp	 *decomp_last;

so reader and session share the same fields, I think it'd be better
if we put them to the new struct.. perhaps have something like:

  struct compress {
    struct zstd_data zstd_data;
    struct decomp    *decomp;
    struct decomp    *decomp_last;
  }

  struct session {
    ...
    struct compress *compress;   /* initialized to &compress_lcl */
    struct compress compress_lcl;
  }

  struct reader {
    ...
    struct compress compress;
  }


reader__process_events will set session->compress to &reader->compress

perf_session__process_compressed_event would always work with
compress pointer.. this would ease up following code as well

also I don't like the idea sharing the whole reader with session,
it'll be abused.. let's give up gradually ;-)

thanks,
jirka

>  	struct reader_state state;
>  };
>  
> @@ -82,7 +85,10 @@ static int perf_session__process_compressed_event(struct perf_session *session,
>  	size_t decomp_size, src_size;
>  	u64 decomp_last_rem = 0;
>  	size_t mmap_len, decomp_len = session->header.env.comp_mmap_len;
> -	struct decomp *decomp, *decomp_last = session->decomp_last;
> +	struct decomp *decomp, *decomp_last = session->active_reader ?
> +		session->active_reader->decomp_last : session->decomp_last;
> +	struct zstd_data *zstd_data = session->active_reader ?
> +		&session->active_reader->zstd_data : &session->zstd_data;
>  
>  	if (decomp_last) {
>  		decomp_last_rem = decomp_last->size - decomp_last->head;
> @@ -109,7 +115,7 @@ static int perf_session__process_compressed_event(struct perf_session *session,
>  	src = (void *)event + sizeof(struct perf_record_compressed);
>  	src_size = event->pack.header.size - sizeof(struct perf_record_compressed);
>  
> -	decomp_size = zstd_decompress_stream(&(session->zstd_data), src, src_size,
> +	decomp_size = zstd_decompress_stream(zstd_data, src, src_size,
>  				&(decomp->data[decomp_last_rem]), decomp_len - decomp_last_rem);
>  	if (!decomp_size) {
>  		munmap(decomp, mmap_len);
> @@ -119,12 +125,22 @@ static int perf_session__process_compressed_event(struct perf_session *session,
>  
>  	decomp->size += decomp_size;
>  
> -	if (session->decomp == NULL) {
> -		session->decomp = decomp;
> -		session->decomp_last = decomp;
> +	if (session->active_reader) {
> +		if (session->active_reader->decomp == NULL) {
> +			session->active_reader->decomp = decomp;
> +			session->active_reader->decomp_last = decomp;
> +		} else {
> +			session->active_reader->decomp_last->next = decomp;
> +			session->active_reader->decomp_last = decomp;
> +		}
>  	} else {
> -		session->decomp_last->next = decomp;
> -		session->decomp_last = decomp;
> +		if (session->decomp == NULL) {
> +			session->decomp = decomp;
> +			session->decomp_last = decomp;
> +		} else {
> +			session->decomp_last->next = decomp;
> +			session->decomp_last = decomp;
> +		}
>  	}
>  
>  	pr_debug("decomp (B): %zd to %zd\n", src_size, decomp_size);
> @@ -314,11 +330,11 @@ static void perf_session__delete_threads(struct perf_session *session)
>  	machine__delete_threads(&session->machines.host);
>  }
>  
> -static void perf_session__release_decomp_events(struct perf_session *session)
> +static void perf_decomp__release_events(struct decomp *next)
>  {
> -	struct decomp *next, *decomp;
> +	struct decomp *decomp;
>  	size_t mmap_len;
> -	next = session->decomp;
> +
>  	do {
>  		decomp = next;
>  		if (decomp == NULL)
> @@ -337,7 +353,7 @@ void perf_session__delete(struct perf_session *session)
>  	auxtrace_index__free(&session->auxtrace_index);
>  	perf_session__destroy_kernel_maps(session);
>  	perf_session__delete_threads(session);
> -	perf_session__release_decomp_events(session);
> +	perf_decomp__release_events(session->decomp);
>  	perf_env__exit(&session->header.env);
>  	machines__exit(&session->machines);
>  	if (session->data) {
> @@ -2155,7 +2171,8 @@ static int __perf_session__process_decomp_events(struct perf_session *session)
>  {
>  	s64 skip;
>  	u64 size, file_pos = 0;
> -	struct decomp *decomp = session->decomp_last;
> +	struct decomp *decomp = session->active_reader ?
> +		session->active_reader->decomp_last : session->decomp_last;
>  
>  	if (!decomp)
>  		return 0;
> @@ -2212,6 +2229,9 @@ reader__process_events(struct reader *rd, struct perf_session *session,
>  
>  	memset(mmaps, 0, sizeof(st->mmaps));
>  
> +	if (zstd_init(&rd->zstd_data, 0))
> +		return -1;
> +
>  	mmap_prot  = PROT_READ;
>  	mmap_flags = MAP_SHARED;
>  
> @@ -2255,6 +2275,7 @@ reader__process_events(struct reader *rd, struct perf_session *session,
>  		goto remap;
>  	}
>  
> +	session->active_reader = rd;
>  	size = event->header.size;
>  
>  	skip = -EINVAL;
> @@ -2287,6 +2308,9 @@ reader__process_events(struct reader *rd, struct perf_session *session,
>  		goto more;
>  
>  out:
> +	session->active_reader = NULL;
> +	perf_decomp__release_events(rd->decomp);
> +	zstd_fini(&rd->zstd_data);
>  	return err;
>  }
>  
> diff --git a/tools/perf/util/session.h b/tools/perf/util/session.h
> index 5d8bd14a0a39..45f9f652a12a 100644
> --- a/tools/perf/util/session.h
> +++ b/tools/perf/util/session.h
> @@ -19,6 +19,7 @@ struct thread;
>  
>  struct auxtrace;
>  struct itrace_synth_opts;
> +struct reader;
>  
>  struct perf_session {
>  	struct perf_header	header;
> @@ -41,6 +42,7 @@ struct perf_session {
>  	struct zstd_data	zstd_data;
>  	struct decomp		*decomp;
>  	struct decomp		*decomp_last;
> +	struct reader           *active_reader;
>  };
>  
>  struct decomp {
> -- 
> 2.19.0
> 


  reply	other threads:[~2021-10-04 13:53 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-09-29  8:41 [PATCH 0/6] perf session: Extend reader object to allow multiple readers Alexey Bayduraev
2021-09-29  8:41 ` [PATCH 1/6] perf session: Move reader structure to the top Alexey Bayduraev
2021-09-29  8:41 ` [PATCH 2/6] perf session: Introduce reader_state in reader object Alexey Bayduraev
2021-09-29  8:41 ` [PATCH 3/6] perf session: Introduce decompressor into " Alexey Bayduraev
2021-10-04 13:53   ` Jiri Olsa [this message]
2021-09-29  8:41 ` [PATCH 4/6] perf session: Move init/exit into reader__init/reader__exit functions Alexey Bayduraev
2021-09-29  8:41 ` [PATCH 5/6] perf session: Move map/unmap into reader__mmap function Alexey Bayduraev
2021-10-04 13:24   ` Jiri Olsa
2021-09-29  8:41 ` [PATCH 6/6] perf session: Load single file for analysis Alexey Bayduraev
2021-10-04 13:22   ` Jiri Olsa

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=YVsHZCv6mGdO7jGv@krava \
    --to=jolsa@redhat.com \
    --cc=abudankov@huawei.com \
    --cc=acme@kernel.org \
    --cc=adrian.hunter@intel.com \
    --cc=ak@linux.intel.com \
    --cc=alexander.antonov@linux.intel.com \
    --cc=alexander.shishkin@linux.intel.com \
    --cc=alexey.v.bayduraev@linux.intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@redhat.com \
    --cc=namhyung@kernel.org \
    --cc=peterz@infradead.org \
    --cc=rickyman7@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.