mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: James Clark <james.clark@linaro.org>
To: Leo Yan <leo.yan@arm.com>
Cc: Ingo Molnar <mingo@kernel.org>,
	linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org,
	coresight@lists.linaro.org, linux-arm-kernel@lists.infradead.org,
	linux-doc@vger.kernel.org, Peter Zijlstra <peterz@infradead.org>,
	Ingo Molnar <mingo@redhat.com>,
	Arnaldo Carvalho de Melo <acme@kernel.org>,
	Namhyung Kim <namhyung@kernel.org>,
	Ian Rogers <irogers@google.com>,
	Adrian Hunter <adrian.hunter@intel.com>,
	Suzuki K Poulose <suzuki.poulose@arm.com>,
	Mike Leach <mike.leach@arm.com>,
	Anshuman Khandual <anshuman.khandual@arm.com>,
	Yeoreum Yun <yeoreum.yun@arm.com>,
	Jonathan Corbet <corbet@lwn.net>, Suyash Mahar <smahar@meta.com>,
	Amir Ayupov <aaupov@fb.com>
Subject: Re: [PATCH 18/25] perf cs-etm: Unify timeless buffer decoding
Date: Tue, 20 Oct 2026 15:15:05 +0100	[thread overview]
Message-ID: <6c0d378e-8186-4e81-a2e7-7277fbd1cf93@linaro.org> (raw)
In-Reply-To: <20260915-arm_cs_support_aux_sample-v1-18-35cf6f297d20@arm.com>



On 15/09/2026 16:49, Leo Yan wrote:
> Per-thread and per-CPU timeless decoding use separate loops for the same
> buffer processing. Per-thread mode already collects packets in a single
> trace ID queue, so both modes can share the queue iteration.
> 
> Use cs_etm__run_timeless_decoder() for both modes, keeping the thread
> selection in the caller. Propagate packet processing and end-of-block
> errors through the common decoding path.

This is very similar to what I've done for the JIT patches. So if we've 
decided to base these patches of that one then this one won't be 
required or will look quite different. So I'll wait for the next version 
before reviewing in much more detail. The kernel changes look good though.

> 
> Assisted-by: Codex:gpt-6
> Signed-off-by: Leo Yan <leo.yan@arm.com>
> ---
>   tools/perf/util/cs-etm.c | 68 ++++++++++++------------------------------------
>   1 file changed, 16 insertions(+), 52 deletions(-)
> 
> diff --git a/tools/perf/util/cs-etm.c b/tools/perf/util/cs-etm.c
> index baa962085dba5226d9729a0ee8039374d5fcb1a0..1a53431161e995ba6b3cfdc86e338ed26e675774 100644
> --- a/tools/perf/util/cs-etm.c
> +++ b/tools/perf/util/cs-etm.c
> @@ -2681,47 +2681,9 @@ static void cs_etm__clear_all_traceid_queues(struct cs_etm_queue *etmq)
>   	}
>   }
>   
> -static int cs_etm__run_per_thread_timeless_decoder(struct cs_etm_queue *etmq)
> +static int cs_etm__run_timeless_decoder(struct cs_etm_queue *etmq)
>   {
> -	int err = 0;
> -	struct cs_etm_traceid_queue *tidq;
> -
> -	tidq = cs_etm__etmq_get_traceid_queue(etmq, CS_ETM_PER_THREAD_TRACEID);
> -	if (!tidq)
> -		return -EINVAL;
> -
> -	/* Go through each buffer in the queue and decode them one by one */
> -	while (1) {
> -		err = cs_etm__get_data_block(etmq);
> -		if (err <= 0)
> -			return err;
> -
> -		/* Run trace decoder until buffer consumed or end of trace */
> -		do {
> -			err = cs_etm__decode_data_block(etmq);
> -			if (err)
> -				return err;
> -
> -			/*
> -			 * Process each packet in this chunk, nothing to do if
> -			 * an error occurs other than hoping the next one will
> -			 * be better.
> -			 */
> -			err = cs_etm__process_traceid_queue(etmq, tidq);
> -
> -		} while (etmq->buf_len);
> -
> -		if (err == 0)
> -			/* Flush any remaining branch stack entries */
> -			err = cs_etm__end_block(etmq, tidq);
> -	}
> -
> -	return err;
> -}
> -
> -static int cs_etm__run_per_cpu_timeless_decoder(struct cs_etm_queue *etmq)
> -{
> -	int idx, err = 0;
> +	int idx, err;
>   	struct cs_etm_traceid_queue *tidq;
>   	struct int_node *inode;
>   
> @@ -2731,23 +2693,23 @@ static int cs_etm__run_per_cpu_timeless_decoder(struct cs_etm_queue *etmq)
>   		if (err <= 0)
>   			return err;
>   
> -		/* Run trace decoder until buffer consumed or end of trace */
> +		/* Run trace decoder until the input buffer is consumed. */
>   		do {
>   			err = cs_etm__decode_data_block(etmq);
>   			if (err)
>   				return err;
>   
>   			/*
> -			 * cs_etm__run_per_thread_timeless_decoder() runs on a
> -			 * single traceID queue because each TID has a separate
> -			 * buffer. But here in per-cpu mode we need to iterate
> -			 * over each channel instead.
> +			 * Per-thread decoding uses a single traceID queue;
> +			 * formatted per-CPU buffers can contain several.
>   			 */
>   			intlist__for_each_entry(inode,
>   						etmq->traceid_queues_list) {
>   				idx = (int)(intptr_t)inode->priv;
>   				tidq = etmq->traceid_queues[idx];
> -				cs_etm__process_traceid_queue(etmq, tidq);
> +				err = cs_etm__process_traceid_queue(etmq, tidq);
> +				if (err)
> +					return err;
>   			}
>   		} while (etmq->buf_len);
>   
> @@ -2760,8 +2722,6 @@ static int cs_etm__run_per_cpu_timeless_decoder(struct cs_etm_queue *etmq)
>   				return err;
>   		}
>   	}
> -
> -	return err;
>   }
>   
>   static int cs_etm__process_timeless_queues(struct cs_etm_auxtrace *etm,
> @@ -2774,6 +2734,7 @@ static int cs_etm__process_timeless_queues(struct cs_etm_auxtrace *etm,
>   		struct auxtrace_queue *queue = &etm->queues.queue_array[i];
>   		struct cs_etm_queue *etmq = queue->priv;
>   		struct cs_etm_traceid_queue *tidq;
> +		int err;
>   
>   		if (!etmq)
>   			continue;
> @@ -2785,10 +2746,13 @@ static int cs_etm__process_timeless_queues(struct cs_etm_auxtrace *etm,
>   			if (!tidq)
>   				continue;
>   
> -			if (tid == -1 || thread__tid(tidq->frontend_thread) == tid)
> -				cs_etm__run_per_thread_timeless_decoder(etmq);
> -		} else
> -			cs_etm__run_per_cpu_timeless_decoder(etmq);
> +			if (tid != -1 && thread__tid(tidq->frontend_thread) != tid)
> +				continue;
> +		}
> +
> +		err = cs_etm__run_timeless_decoder(etmq);
> +		if (err)
> +			return err;
>   	}
>   
>   	return 0;
> 


  reply	other threads:[~2026-10-20 14:15 UTC|newest]

Thread overview: 48+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-15 15:48 [PATCH 00/25] CoreSight / perf: Support AUX sampling Leo Yan
2026-09-15 15:48 ` [PATCH 01/25] perf/core: Reject non-positive AUX snapshot sizes Leo Yan
2026-10-16 13:14   ` James Clark
2026-09-15 15:48 ` [PATCH 02/25] perf/core: Prevent AUX sampling from racing with pause/resume Leo Yan
2026-10-16 13:29   ` James Clark
2026-09-15 15:48 ` [PATCH 03/25] perf/core: Export output copy helpers for CoreSight Leo Yan
2026-10-16 13:30   ` James Clark
2026-09-15 15:48 ` [PATCH 04/25] coresight: perf: End AUX output when an event is throttled Leo Yan
2026-10-16 13:46   ` James Clark
2026-09-15 15:48 ` [PATCH 05/25] coresight: perf: Extract AUX buffer update helper Leo Yan
2026-10-16 13:53   ` James Clark
2026-09-15 15:48 ` [PATCH 06/25] coresight: perf: Simplify flow for CPUs without a path Leo Yan
2026-10-16 13:59   ` James Clark
2026-09-15 15:48 ` [PATCH 07/25] coresight: perf: Validate the live context through its path Leo Yan
2026-10-19  9:25   ` James Clark
2026-09-15 15:48 ` [PATCH 08/25] coresight: perf: Validate context before resuming trace Leo Yan
2026-10-19  9:27   ` James Clark
2026-09-15 15:48 ` [PATCH 09/25] coresight: perf: Improve hardware state transitions Leo Yan
2026-10-19  9:33   ` James Clark
2026-10-19  9:35   ` James Clark
2026-09-15 15:48 ` [PATCH 10/25] coresight: trbe: Pad snapshot buffers Leo Yan
2026-10-19  9:45   ` James Clark
2026-09-15 15:48 ` [PATCH 11/25] coresight: trbe: Use circular buffer mode for snapshots Leo Yan
2026-10-19 10:13   ` James Clark
2026-09-15 15:48 ` [PATCH 12/25] coresight: trbe: Track per-CPU sink interrupt handling Leo Yan
2026-10-19 11:54   ` James Clark
2026-09-15 15:48 ` [PATCH 13/25] coresight: trbe: Handle an already disabled sink Leo Yan
2026-10-19 12:44   ` James Clark
2026-09-15 15:49 ` [PATCH 14/25] coresight: perf: Look up the trace path in etm_event_pause() Leo Yan
2026-10-19 12:46   ` James Clark
2026-09-15 15:49 ` [PATCH 15/25] coresight: perf: Serialize AUX pause and resume with event stops Leo Yan
2026-10-19 13:02   ` James Clark
2026-09-15 15:49 ` [PATCH 16/25] coresight: perf: Support AUX sampling with per-CPU sinks Leo Yan
2026-10-20 13:21   ` James Clark
2026-09-15 15:49 ` [PATCH 17/25] perf cs-etm: Allow history collection for samples with zero IP Leo Yan
2026-10-20 13:23   ` James Clark
2026-09-15 15:49 ` [PATCH 18/25] perf cs-etm: Unify timeless buffer decoding Leo Yan
2026-10-20 14:15   ` James Clark [this message]
2026-09-15 15:49 ` [PATCH 19/25] perf cs-etm: Propagate errors from trace queue flushing Leo Yan
2026-09-15 15:49 ` [PATCH 20/25] perf cs-etm: Drain pending packets before finishing trace blocks Leo Yan
2026-09-15 15:49 ` [PATCH 21/25] perf cs-etm: Complete packet draining with end of trace Leo Yan
2026-09-15 15:49 ` [PATCH 22/25] perf cs-etm: Centralize sample history collection Leo Yan
2026-09-15 15:49 ` [PATCH 23/25] perf cs-etm: Decode AUX samples into callchains and branch stacks Leo Yan
2026-10-20 14:13   ` James Clark
2026-09-15 15:49 ` [PATCH 24/25] perf test: Add CoreSight AUX sample decoding test Leo Yan
2026-10-20 14:35   ` James Clark
2026-09-15 15:49 ` [PATCH 25/25] Documentation: coresight: Document AUX sample decoding Leo Yan
2026-10-20 14:26   ` 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=6c0d378e-8186-4e81-a2e7-7277fbd1cf93@linaro.org \
    --to=james.clark@linaro.org \
    --cc=aaupov@fb.com \
    --cc=acme@kernel.org \
    --cc=adrian.hunter@intel.com \
    --cc=anshuman.khandual@arm.com \
    --cc=corbet@lwn.net \
    --cc=coresight@lists.linaro.org \
    --cc=irogers@google.com \
    --cc=leo.yan@arm.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-perf-users@vger.kernel.org \
    --cc=mike.leach@arm.com \
    --cc=mingo@kernel.org \
    --cc=mingo@redhat.com \
    --cc=namhyung@kernel.org \
    --cc=peterz@infradead.org \
    --cc=smahar@meta.com \
    --cc=suzuki.poulose@arm.com \
    --cc=yeoreum.yun@arm.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®