All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mathieu Poirier <mathieu.poirier@linaro.org>
To: James Clark <james.clark@arm.com>
Cc: acme@kernel.org, coresight@lists.linaro.org, leo.yan@linaro.org,
	al.grant@arm.com, branislav.rankov@arm.com,
	suzuki.poulose@arm.com, anshuman.khandual@arm.com,
	Mike Leach <mike.leach@linaro.org>,
	Mark Rutland <mark.rutland@arm.com>,
	Alexander Shishkin <alexander.shishkin@linux.intel.com>,
	Jiri Olsa <jolsa@redhat.com>, Namhyung Kim <namhyung@kernel.org>,
	John Garry <john.garry@huawei.com>, Will Deacon <will@kernel.org>,
	linux-arm-kernel@lists.infradead.org,
	linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH 3/6] perf cs-etm: Only setup queues when they are modified
Date: Mon, 19 Jul 2021 13:38:53 -0600	[thread overview]
Message-ID: <20210719193853.GD2255168@p14s> (raw)
In-Reply-To: <20210713154008.29656-4-james.clark@arm.com>

On Tue, Jul 13, 2021 at 04:40:05PM +0100, James Clark wrote:
> Continually creating queues in cs_etm__process_event() is unnecessary.
> They only need to be created when a buffer for a new CPU or thread is
> encountered. This can be in two places, when building the queues in
> advance in cs_etm__process_auxtrace_info(), or in
> cs_etm__process_auxtrace_event() when data_queued is false and the
> index wasn't available (pipe mode).
> 
> This change will allow the 'formatted' decoder setting to applied when
> iterating over aux records in a later commit.
> 
> Signed-off-by: James Clark <james.clark@arm.com>
> ---
>  tools/perf/util/cs-etm.c | 54 +++++++++++-----------------------------
>  1 file changed, 14 insertions(+), 40 deletions(-)

Reviewed-by: Mathieu Poirier <mathieu.poirier@linaro.org>

> 
> diff --git a/tools/perf/util/cs-etm.c b/tools/perf/util/cs-etm.c
> index 426e99c07ca9..2d07e52ffd3c 100644
> --- a/tools/perf/util/cs-etm.c
> +++ b/tools/perf/util/cs-etm.c
> @@ -96,7 +96,6 @@ struct cs_etm_queue {
>  /* RB tree for quick conversion between traceID and metadata pointers */
>  static struct intlist *traceid_list;
>  
> -static int cs_etm__update_queues(struct cs_etm_auxtrace *etm);
>  static int cs_etm__process_queues(struct cs_etm_auxtrace *etm);
>  static int cs_etm__process_timeless_queues(struct cs_etm_auxtrace *etm,
>  					   pid_t tid);
> @@ -564,7 +563,6 @@ static void cs_etm__dump_event(struct cs_etm_auxtrace *etm,
>  static int cs_etm__flush_events(struct perf_session *session,
>  				struct perf_tool *tool)
>  {
> -	int ret;
>  	struct cs_etm_auxtrace *etm = container_of(session->auxtrace,
>  						   struct cs_etm_auxtrace,
>  						   auxtrace);
> @@ -574,11 +572,6 @@ static int cs_etm__flush_events(struct perf_session *session,
>  	if (!tool->ordered_events)
>  		return -EINVAL;
>  
> -	ret = cs_etm__update_queues(etm);
> -
> -	if (ret < 0)
> -		return ret;
> -
>  	if (etm->timeless_decoding)
>  		return cs_etm__process_timeless_queues(etm, -1);
>  
> @@ -898,30 +891,6 @@ static int cs_etm__queue_first_cs_timestamp(struct cs_etm_auxtrace *etm,
>  	return ret;
>  }
>  
> -static int cs_etm__setup_queues(struct cs_etm_auxtrace *etm)
> -{
> -	unsigned int i;
> -	int ret;
> -
> -	for (i = 0; i < etm->queues.nr_queues; i++) {
> -		ret = cs_etm__setup_queue(etm, &etm->queues.queue_array[i], i);
> -		if (ret)
> -			return ret;
> -	}
> -
> -	return 0;
> -}
> -
> -static int cs_etm__update_queues(struct cs_etm_auxtrace *etm)
> -{
> -	if (etm->queues.new_data) {
> -		etm->queues.new_data = false;
> -		return cs_etm__setup_queues(etm);
> -	}
> -
> -	return 0;
> -}
> -
>  static inline
>  void cs_etm__copy_last_branch_rb(struct cs_etm_queue *etmq,
>  				 struct cs_etm_traceid_queue *tidq)
> @@ -2395,7 +2364,6 @@ static int cs_etm__process_event(struct perf_session *session,
>  				 struct perf_sample *sample,
>  				 struct perf_tool *tool)
>  {
> -	int err = 0;
>  	u64 sample_kernel_timestamp;
>  	struct cs_etm_auxtrace *etm = container_of(session->auxtrace,
>  						   struct cs_etm_auxtrace,
> @@ -2414,12 +2382,6 @@ static int cs_etm__process_event(struct perf_session *session,
>  	else
>  		sample_kernel_timestamp = 0;
>  
> -	if (sample_kernel_timestamp || etm->timeless_decoding) {
> -		err = cs_etm__update_queues(etm);
> -		if (err)
> -			return err;
> -	}
> -
>  	/*
>  	 * Don't wait for cs_etm__flush_events() in per-thread/timeless mode to start the decode. We
>  	 * need the tid of the PERF_RECORD_EXIT event to assign to the synthesised samples because
> @@ -2476,6 +2438,7 @@ static int cs_etm__process_auxtrace_event(struct perf_session *session,
>  		int fd = perf_data__fd(session->data);
>  		bool is_pipe = perf_data__is_pipe(session->data);
>  		int err;
> +		int idx = event->auxtrace.idx;
>  
>  		if (is_pipe)
>  			data_offset = 0;
> @@ -2490,6 +2453,11 @@ static int cs_etm__process_auxtrace_event(struct perf_session *session,
>  		if (err)
>  			return err;
>  
> +		err = cs_etm__setup_queue(etm, &etm->queues.queue_array[idx],
> +					  idx);
> +		if (err)
> +			return err;
> +
>  		if (dump_trace)
>  			if (auxtrace_buffer__get_data(buffer, fd)) {
>  				cs_etm__dump_event(etm, buffer);
> @@ -2732,6 +2700,7 @@ static int cs_etm__queue_aux_fragment(struct perf_session *session, off_t file_o
>  	struct perf_record_auxtrace *auxtrace_event;
>  	union perf_event auxtrace_fragment;
>  	__u64 aux_offset, aux_size;
> +	__u32 idx;
>  
>  	struct cs_etm_auxtrace *etm = container_of(session->auxtrace,
>  						   struct cs_etm_auxtrace,
> @@ -2793,8 +2762,13 @@ static int cs_etm__queue_aux_fragment(struct perf_session *session, off_t file_o
>  
>  		pr_debug3("CS ETM: Queue buffer size: %#"PRI_lx64" offset: %#"PRI_lx64
>  			  " tid: %d cpu: %d\n", aux_size, aux_offset, sample->tid, sample->cpu);
> -		return auxtrace_queues__add_event(&etm->queues, session, &auxtrace_fragment,
> -						  file_offset, NULL);
> +		err = auxtrace_queues__add_event(&etm->queues, session, &auxtrace_fragment,
> +						 file_offset, NULL);
> +		if (err)
> +			return err;
> +
> +		idx = auxtrace_event->idx;
> +		return cs_etm__setup_queue(etm, &etm->queues.queue_array[idx], idx);
>  	}
>  
>  	/* Wasn't inside this buffer, but there were no parse errors. 1 == 'not found' */
> -- 
> 2.28.0
> 

WARNING: multiple messages have this Message-ID (diff)
From: Mathieu Poirier <mathieu.poirier@linaro.org>
To: James Clark <james.clark@arm.com>
Cc: acme@kernel.org, coresight@lists.linaro.org, leo.yan@linaro.org,
	al.grant@arm.com, branislav.rankov@arm.com,
	suzuki.poulose@arm.com, anshuman.khandual@arm.com,
	Mike Leach <mike.leach@linaro.org>,
	Mark Rutland <mark.rutland@arm.com>,
	Alexander Shishkin <alexander.shishkin@linux.intel.com>,
	Jiri Olsa <jolsa@redhat.com>, Namhyung Kim <namhyung@kernel.org>,
	John Garry <john.garry@huawei.com>, Will Deacon <will@kernel.org>,
	linux-arm-kernel@lists.infradead.org,
	linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH 3/6] perf cs-etm: Only setup queues when they are modified
Date: Mon, 19 Jul 2021 13:38:53 -0600	[thread overview]
Message-ID: <20210719193853.GD2255168@p14s> (raw)
In-Reply-To: <20210713154008.29656-4-james.clark@arm.com>

On Tue, Jul 13, 2021 at 04:40:05PM +0100, James Clark wrote:
> Continually creating queues in cs_etm__process_event() is unnecessary.
> They only need to be created when a buffer for a new CPU or thread is
> encountered. This can be in two places, when building the queues in
> advance in cs_etm__process_auxtrace_info(), or in
> cs_etm__process_auxtrace_event() when data_queued is false and the
> index wasn't available (pipe mode).
> 
> This change will allow the 'formatted' decoder setting to applied when
> iterating over aux records in a later commit.
> 
> Signed-off-by: James Clark <james.clark@arm.com>
> ---
>  tools/perf/util/cs-etm.c | 54 +++++++++++-----------------------------
>  1 file changed, 14 insertions(+), 40 deletions(-)

Reviewed-by: Mathieu Poirier <mathieu.poirier@linaro.org>

> 
> diff --git a/tools/perf/util/cs-etm.c b/tools/perf/util/cs-etm.c
> index 426e99c07ca9..2d07e52ffd3c 100644
> --- a/tools/perf/util/cs-etm.c
> +++ b/tools/perf/util/cs-etm.c
> @@ -96,7 +96,6 @@ struct cs_etm_queue {
>  /* RB tree for quick conversion between traceID and metadata pointers */
>  static struct intlist *traceid_list;
>  
> -static int cs_etm__update_queues(struct cs_etm_auxtrace *etm);
>  static int cs_etm__process_queues(struct cs_etm_auxtrace *etm);
>  static int cs_etm__process_timeless_queues(struct cs_etm_auxtrace *etm,
>  					   pid_t tid);
> @@ -564,7 +563,6 @@ static void cs_etm__dump_event(struct cs_etm_auxtrace *etm,
>  static int cs_etm__flush_events(struct perf_session *session,
>  				struct perf_tool *tool)
>  {
> -	int ret;
>  	struct cs_etm_auxtrace *etm = container_of(session->auxtrace,
>  						   struct cs_etm_auxtrace,
>  						   auxtrace);
> @@ -574,11 +572,6 @@ static int cs_etm__flush_events(struct perf_session *session,
>  	if (!tool->ordered_events)
>  		return -EINVAL;
>  
> -	ret = cs_etm__update_queues(etm);
> -
> -	if (ret < 0)
> -		return ret;
> -
>  	if (etm->timeless_decoding)
>  		return cs_etm__process_timeless_queues(etm, -1);
>  
> @@ -898,30 +891,6 @@ static int cs_etm__queue_first_cs_timestamp(struct cs_etm_auxtrace *etm,
>  	return ret;
>  }
>  
> -static int cs_etm__setup_queues(struct cs_etm_auxtrace *etm)
> -{
> -	unsigned int i;
> -	int ret;
> -
> -	for (i = 0; i < etm->queues.nr_queues; i++) {
> -		ret = cs_etm__setup_queue(etm, &etm->queues.queue_array[i], i);
> -		if (ret)
> -			return ret;
> -	}
> -
> -	return 0;
> -}
> -
> -static int cs_etm__update_queues(struct cs_etm_auxtrace *etm)
> -{
> -	if (etm->queues.new_data) {
> -		etm->queues.new_data = false;
> -		return cs_etm__setup_queues(etm);
> -	}
> -
> -	return 0;
> -}
> -
>  static inline
>  void cs_etm__copy_last_branch_rb(struct cs_etm_queue *etmq,
>  				 struct cs_etm_traceid_queue *tidq)
> @@ -2395,7 +2364,6 @@ static int cs_etm__process_event(struct perf_session *session,
>  				 struct perf_sample *sample,
>  				 struct perf_tool *tool)
>  {
> -	int err = 0;
>  	u64 sample_kernel_timestamp;
>  	struct cs_etm_auxtrace *etm = container_of(session->auxtrace,
>  						   struct cs_etm_auxtrace,
> @@ -2414,12 +2382,6 @@ static int cs_etm__process_event(struct perf_session *session,
>  	else
>  		sample_kernel_timestamp = 0;
>  
> -	if (sample_kernel_timestamp || etm->timeless_decoding) {
> -		err = cs_etm__update_queues(etm);
> -		if (err)
> -			return err;
> -	}
> -
>  	/*
>  	 * Don't wait for cs_etm__flush_events() in per-thread/timeless mode to start the decode. We
>  	 * need the tid of the PERF_RECORD_EXIT event to assign to the synthesised samples because
> @@ -2476,6 +2438,7 @@ static int cs_etm__process_auxtrace_event(struct perf_session *session,
>  		int fd = perf_data__fd(session->data);
>  		bool is_pipe = perf_data__is_pipe(session->data);
>  		int err;
> +		int idx = event->auxtrace.idx;
>  
>  		if (is_pipe)
>  			data_offset = 0;
> @@ -2490,6 +2453,11 @@ static int cs_etm__process_auxtrace_event(struct perf_session *session,
>  		if (err)
>  			return err;
>  
> +		err = cs_etm__setup_queue(etm, &etm->queues.queue_array[idx],
> +					  idx);
> +		if (err)
> +			return err;
> +
>  		if (dump_trace)
>  			if (auxtrace_buffer__get_data(buffer, fd)) {
>  				cs_etm__dump_event(etm, buffer);
> @@ -2732,6 +2700,7 @@ static int cs_etm__queue_aux_fragment(struct perf_session *session, off_t file_o
>  	struct perf_record_auxtrace *auxtrace_event;
>  	union perf_event auxtrace_fragment;
>  	__u64 aux_offset, aux_size;
> +	__u32 idx;
>  
>  	struct cs_etm_auxtrace *etm = container_of(session->auxtrace,
>  						   struct cs_etm_auxtrace,
> @@ -2793,8 +2762,13 @@ static int cs_etm__queue_aux_fragment(struct perf_session *session, off_t file_o
>  
>  		pr_debug3("CS ETM: Queue buffer size: %#"PRI_lx64" offset: %#"PRI_lx64
>  			  " tid: %d cpu: %d\n", aux_size, aux_offset, sample->tid, sample->cpu);
> -		return auxtrace_queues__add_event(&etm->queues, session, &auxtrace_fragment,
> -						  file_offset, NULL);
> +		err = auxtrace_queues__add_event(&etm->queues, session, &auxtrace_fragment,
> +						 file_offset, NULL);
> +		if (err)
> +			return err;
> +
> +		idx = auxtrace_event->idx;
> +		return cs_etm__setup_queue(etm, &etm->queues.queue_array[idx], idx);
>  	}
>  
>  	/* Wasn't inside this buffer, but there were no parse errors. 1 == 'not found' */
> -- 
> 2.28.0
> 

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

  reply	other threads:[~2021-07-19 23:17 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-07-13 15:40 [PATCH 0/6] perf cs-etm: Support TRBE (unformatted decoding) James Clark
2021-07-13 15:40 ` James Clark
2021-07-13 15:40 ` [PATCH 1/6] perf cs-etm: Refactor initialisation of kernel start address James Clark
2021-07-13 15:40   ` James Clark
2021-07-19 19:37   ` Mathieu Poirier
2021-07-19 19:37     ` Mathieu Poirier
2021-07-13 15:40 ` [PATCH 2/6] perf cs-etm: Split setup and timestamp search functions James Clark
2021-07-13 15:40   ` James Clark
2021-07-19 19:38   ` Mathieu Poirier
2021-07-19 19:38     ` Mathieu Poirier
2021-07-13 15:40 ` [PATCH 3/6] perf cs-etm: Only setup queues when they are modified James Clark
2021-07-13 15:40   ` James Clark
2021-07-19 19:38   ` Mathieu Poirier [this message]
2021-07-19 19:38     ` Mathieu Poirier
2021-07-13 15:40 ` [PATCH 4/6] perf cs-etm: Suppress printing when resetting decoder James Clark
2021-07-13 15:40   ` James Clark
2021-07-19 19:39   ` Mathieu Poirier
2021-07-19 19:39     ` Mathieu Poirier
2021-07-13 15:40 ` [PATCH 5/6] perf cs-etm: Use existing decoder instead of resetting it James Clark
2021-07-13 15:40   ` James Clark
2021-07-19 19:39   ` Mathieu Poirier
2021-07-19 19:39     ` Mathieu Poirier
2021-07-13 15:40 ` [PATCH 6/6] perf cs-etm: Pass unformatted flag to decoder James Clark
2021-07-13 15:40   ` James Clark
2021-07-19 19:40   ` Mathieu Poirier
2021-07-19 19:40     ` Mathieu Poirier
2021-07-20 15:45   ` Mathieu Poirier
2021-07-20 15:45     ` Mathieu Poirier
2021-07-21  8:35     ` James Clark
2021-07-21  8:35       ` James Clark

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=20210719193853.GD2255168@p14s \
    --to=mathieu.poirier@linaro.org \
    --cc=acme@kernel.org \
    --cc=al.grant@arm.com \
    --cc=alexander.shishkin@linux.intel.com \
    --cc=anshuman.khandual@arm.com \
    --cc=branislav.rankov@arm.com \
    --cc=coresight@lists.linaro.org \
    --cc=james.clark@arm.com \
    --cc=john.garry@huawei.com \
    --cc=jolsa@redhat.com \
    --cc=leo.yan@linaro.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-perf-users@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=mike.leach@linaro.org \
    --cc=namhyung@kernel.org \
    --cc=suzuki.poulose@arm.com \
    --cc=will@kernel.org \
    /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.