Commit 9ac8afd5 authored by James Clark's avatar James Clark Committed by Arnaldo Carvalho de Melo

perf cs-etm: Split setup and timestamp search functions

This refactoring has some benefits:

 * Decoding is done to find the timestamp. If we want to print errors
   when maps aren't available, then doing it from cs_etm__setup_queue()
   may cause warnings to be printed.

 * The cs_etm__setup_queue() flow is shared between timed and timeless
   modes, so it needs to be guarded by an if statement which can now
   be removed.

 * Allows moving the setup queues function earlier.

 * If data was piped in, then not all queues would be filled so it
   wouldn't have worked properly anyway. Now it waits for flush so
   data in all queues will be available.

The motivation for this is to decouple setup functions with ones that
involve decoding. That way we can move the setup function earlier when
the formatted/unformatted trace information is available.
Reviewed-by: default avatarMathieu Poirier <mathieu.poirier@linaro.org>
Signed-off-by: default avatarJames 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-3-james.clark@arm.com
Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 6f38e115
...@@ -809,29 +809,32 @@ static int cs_etm__setup_queue(struct cs_etm_auxtrace *etm, ...@@ -809,29 +809,32 @@ static int cs_etm__setup_queue(struct cs_etm_auxtrace *etm,
struct auxtrace_queue *queue, struct auxtrace_queue *queue,
unsigned int queue_nr) unsigned int queue_nr)
{ {
int ret = 0;
unsigned int cs_queue_nr;
u8 trace_chan_id;
u64 cs_timestamp;
struct cs_etm_queue *etmq = queue->priv; struct cs_etm_queue *etmq = queue->priv;
if (list_empty(&queue->head) || etmq) if (list_empty(&queue->head) || etmq)
goto out; return 0;
etmq = cs_etm__alloc_queue(etm); etmq = cs_etm__alloc_queue(etm);
if (!etmq) { if (!etmq)
ret = -ENOMEM; return -ENOMEM;
goto out;
}
queue->priv = etmq; queue->priv = etmq;
etmq->etm = etm; etmq->etm = etm;
etmq->queue_nr = queue_nr; etmq->queue_nr = queue_nr;
etmq->offset = 0; etmq->offset = 0;
if (etm->timeless_decoding) return 0;
goto out; }
static int cs_etm__queue_first_cs_timestamp(struct cs_etm_auxtrace *etm,
struct cs_etm_queue *etmq,
unsigned int queue_nr)
{
int ret = 0;
unsigned int cs_queue_nr;
u8 trace_chan_id;
u64 cs_timestamp;
/* /*
* We are under a CPU-wide trace scenario. As such we need to know * We are under a CPU-wide trace scenario. As such we need to know
...@@ -2218,13 +2221,27 @@ static int cs_etm__process_timeless_queues(struct cs_etm_auxtrace *etm, ...@@ -2218,13 +2221,27 @@ static int cs_etm__process_timeless_queues(struct cs_etm_auxtrace *etm,
static int cs_etm__process_queues(struct cs_etm_auxtrace *etm) static int cs_etm__process_queues(struct cs_etm_auxtrace *etm)
{ {
int ret = 0; int ret = 0;
unsigned int cs_queue_nr, queue_nr; unsigned int cs_queue_nr, queue_nr, i;
u8 trace_chan_id; u8 trace_chan_id;
u64 cs_timestamp; u64 cs_timestamp;
struct auxtrace_queue *queue; struct auxtrace_queue *queue;
struct cs_etm_queue *etmq; struct cs_etm_queue *etmq;
struct cs_etm_traceid_queue *tidq; struct cs_etm_traceid_queue *tidq;
/*
* Pre-populate the heap with one entry from each queue so that we can
* start processing in time order across all queues.
*/
for (i = 0; i < etm->queues.nr_queues; i++) {
etmq = etm->queues.queue_array[i].priv;
if (!etmq)
continue;
ret = cs_etm__queue_first_cs_timestamp(etm, etmq, i);
if (ret)
return ret;
}
while (1) { while (1) {
if (!etm->heap.heap_cnt) if (!etm->heap.heap_cnt)
goto out; goto out;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment