Skip to content

Commit

Permalink
perf cs-etm: Pass unformatted flag to decoder
Browse files Browse the repository at this point in the history
The TRBE (Trace Buffer Extension) feature allows a separate trace buffer
for each trace source, therefore the trace wouldn't need to be
formatted. The driver was introduced in commit 3fbf7f0
("coresight: sink: Add TRBE driver").

The formatted/unformatted mode is encoded in one of the flags of the
AUX record. The first AUX record encountered for each event is used to
determine the mode, and this will persist for the remaining trace that
is either decoded or dumped.

Reviewed-by: Mathieu Poirier <mathieu.poirier@linaro.org>
Signed-off-by: James Clark <james.clark@arm.com>
Cc: Al Grant <al.grant@arm.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Anshuman Khandual <anshuman.khandual@arm.com>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: John Garry <john.garry@huawei.com>
Cc: Leo Yan <leo.yan@linaro.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Mike Leach <mike.leach@linaro.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Suzuki Poulouse <suzuki.poulose@arm.com>
Cc: Will Deacon <will@kernel.org>
Cc: coresight@lists.linaro.org
Cc: linux-arm-kernel@lists.infradead.org
Link: https //lore.kernel.org/r/20210721150202.32065-7-james.clark@arm.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
  • Loading branch information
James Clark authored and Arnaldo Carvalho de Melo committed Aug 2, 2021
1 parent 04aaad2 commit 9182f04
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 15 deletions.
4 changes: 2 additions & 2 deletions tools/perf/util/cs-etm-decoder/cs-etm-decoder.c
Original file line number Diff line number Diff line change
Expand Up @@ -687,7 +687,7 @@ cs_etm_decoder__create_etm_decoder(struct cs_etm_decoder_params *d_params,
}

struct cs_etm_decoder *
cs_etm_decoder__new(int num_cpu, struct cs_etm_decoder_params *d_params,
cs_etm_decoder__new(int decoders, struct cs_etm_decoder_params *d_params,
struct cs_etm_trace_params t_params[])
{
struct cs_etm_decoder *decoder;
Expand Down Expand Up @@ -732,7 +732,7 @@ cs_etm_decoder__new(int num_cpu, struct cs_etm_decoder_params *d_params,
/* init raw frame logging if required */
cs_etm_decoder__init_raw_frame_logging(d_params, decoder);

for (i = 0; i < num_cpu; i++) {
for (i = 0; i < decoders; i++) {
ret = cs_etm_decoder__create_etm_decoder(d_params,
&t_params[i],
decoder);
Expand Down
53 changes: 40 additions & 13 deletions tools/perf/util/cs-etm.c
Original file line number Diff line number Diff line change
Expand Up @@ -461,13 +461,14 @@ static void cs_etm__set_trace_param_etmv4(struct cs_etm_trace_params *t_params,
}

static int cs_etm__init_trace_params(struct cs_etm_trace_params *t_params,
struct cs_etm_auxtrace *etm)
struct cs_etm_auxtrace *etm,
int decoders)
{
int i;
u32 etmidr;
u64 architecture;

for (i = 0; i < etm->num_cpu; i++) {
for (i = 0; i < decoders; i++) {
architecture = etm->metadata[i][CS_ETM_MAGIC];

switch (architecture) {
Expand All @@ -488,7 +489,8 @@ static int cs_etm__init_trace_params(struct cs_etm_trace_params *t_params,

static int cs_etm__init_decoder_params(struct cs_etm_decoder_params *d_params,
struct cs_etm_queue *etmq,
enum cs_etm_decoder_operation mode)
enum cs_etm_decoder_operation mode,
bool formatted)
{
int ret = -EINVAL;

Expand All @@ -498,7 +500,7 @@ static int cs_etm__init_decoder_params(struct cs_etm_decoder_params *d_params,
d_params->packet_printer = cs_etm__packet_dump;
d_params->operation = mode;
d_params->data = etmq;
d_params->formatted = true;
d_params->formatted = formatted;
d_params->fsyncs = false;
d_params->hsyncs = false;
d_params->frame_aligned = true;
Expand Down Expand Up @@ -720,11 +722,17 @@ static u32 cs_etm__mem_access(struct cs_etm_queue *etmq, u8 trace_chan_id,
return len;
}

static struct cs_etm_queue *cs_etm__alloc_queue(struct cs_etm_auxtrace *etm)
static struct cs_etm_queue *cs_etm__alloc_queue(struct cs_etm_auxtrace *etm,
bool formatted)
{
struct cs_etm_decoder_params d_params;
struct cs_etm_trace_params *t_params = NULL;
struct cs_etm_queue *etmq;
/*
* Each queue can only contain data from one CPU when unformatted, so only one decoder is
* needed.
*/
int decoders = formatted ? etm->num_cpu : 1;

etmq = zalloc(sizeof(*etmq));
if (!etmq)
Expand All @@ -735,21 +743,23 @@ static struct cs_etm_queue *cs_etm__alloc_queue(struct cs_etm_auxtrace *etm)
goto out_free;

/* Use metadata to fill in trace parameters for trace decoder */
t_params = zalloc(sizeof(*t_params) * etm->num_cpu);
t_params = zalloc(sizeof(*t_params) * decoders);

if (!t_params)
goto out_free;

if (cs_etm__init_trace_params(t_params, etm))
if (cs_etm__init_trace_params(t_params, etm, decoders))
goto out_free;

/* Set decoder parameters to decode trace packets */
if (cs_etm__init_decoder_params(&d_params, etmq,
dump_trace ? CS_ETM_OPERATION_PRINT :
CS_ETM_OPERATION_DECODE))
CS_ETM_OPERATION_DECODE,
formatted))
goto out_free;

etmq->decoder = cs_etm_decoder__new(etm->num_cpu, &d_params, t_params);
etmq->decoder = cs_etm_decoder__new(decoders, &d_params,
t_params);

if (!etmq->decoder)
goto out_free;
Expand Down Expand Up @@ -777,14 +787,15 @@ static struct cs_etm_queue *cs_etm__alloc_queue(struct cs_etm_auxtrace *etm)

static int cs_etm__setup_queue(struct cs_etm_auxtrace *etm,
struct auxtrace_queue *queue,
unsigned int queue_nr)
unsigned int queue_nr,
bool formatted)
{
struct cs_etm_queue *etmq = queue->priv;

if (list_empty(&queue->head) || etmq)
return 0;

etmq = cs_etm__alloc_queue(etm);
etmq = cs_etm__alloc_queue(etm, formatted);

if (!etmq)
return -ENOMEM;
Expand Down Expand Up @@ -2430,8 +2441,14 @@ static int cs_etm__process_auxtrace_event(struct perf_session *session,
if (err)
return err;

/*
* Knowing if the trace is formatted or not requires a lookup of
* the aux record so only works in non-piped mode where data is
* queued in cs_etm__queue_aux_records(). Always assume
* formatted in piped mode (true).
*/
err = cs_etm__setup_queue(etm, &etm->queues.queue_array[idx],
idx);
idx, true);
if (err)
return err;

Expand Down Expand Up @@ -2678,6 +2695,7 @@ static int cs_etm__queue_aux_fragment(struct perf_session *session, off_t file_o
union perf_event auxtrace_fragment;
__u64 aux_offset, aux_size;
__u32 idx;
bool formatted;

struct cs_etm_auxtrace *etm = container_of(session->auxtrace,
struct cs_etm_auxtrace,
Expand Down Expand Up @@ -2745,7 +2763,9 @@ static int cs_etm__queue_aux_fragment(struct perf_session *session, off_t file_o
return err;

idx = auxtrace_event->idx;
return cs_etm__setup_queue(etm, &etm->queues.queue_array[idx], idx);
formatted = !(aux_event->flags & PERF_AUX_FLAG_CORESIGHT_FORMAT_RAW);
return cs_etm__setup_queue(etm, &etm->queues.queue_array[idx],
idx, formatted);
}

/* Wasn't inside this buffer, but there were no parse errors. 1 == 'not found' */
Expand Down Expand Up @@ -3034,6 +3054,13 @@ int cs_etm__process_auxtrace_info(union perf_event *event,
goto err_delete_thread;

etm->data_queued = etm->queues.populated;
/*
* Print warning in pipe mode, see cs_etm__process_auxtrace_event() and
* cs_etm__queue_aux_fragment() for details relating to limitations.
*/
if (!etm->data_queued)
pr_warning("CS ETM warning: Coresight decode and TRBE support requires random file access.\n"
"Continuing with best effort decoding in piped mode.\n\n");

return 0;

Expand Down

0 comments on commit 9182f04

Please sign in to comment.