perf cs-etm: Use existing decoder instead of resetting it
authorJames Clark <james.clark@arm.com>
Wed, 21 Jul 2021 15:02:01 +0000 (16:02 +0100)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Mon, 2 Aug 2021 12:56:17 +0000 (09:56 -0300)
When dumping trace, the decoder is continually deleted and recreated to
decode each buffer. To support both formatted and unformatted trace in
a later commit, the decoder will be configured in advance.

This commit removes the deletion of the decoder and allows the
formatted/unformatted setting to persist.

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-6-james.clark@arm.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/cs-etm.c

index 2d07e52..760050e 100644 (file)
@@ -508,14 +508,11 @@ out:
        return ret;
 }
 
-static void cs_etm__dump_event(struct cs_etm_auxtrace *etm,
+static void cs_etm__dump_event(struct cs_etm_queue *etmq,
                               struct auxtrace_buffer *buffer)
 {
        int ret;
        const char *color = PERF_COLOR_BLUE;
-       struct cs_etm_decoder_params d_params;
-       struct cs_etm_trace_params *t_params;
-       struct cs_etm_decoder *decoder;
        size_t buffer_used = 0;
 
        fprintf(stdout, "\n");
@@ -523,29 +520,11 @@ static void cs_etm__dump_event(struct cs_etm_auxtrace *etm,
                     ". ... CoreSight ETM Trace data: size %zu bytes\n",
                     buffer->size);
 
-       /* Use metadata to fill in trace parameters for trace decoder */
-       t_params = zalloc(sizeof(*t_params) * etm->num_cpu);
-
-       if (!t_params)
-               return;
-
-       if (cs_etm__init_trace_params(t_params, etm))
-               goto out_free;
-
-       /* Set decoder parameters to simply print the trace packets */
-       if (cs_etm__init_decoder_params(&d_params, NULL,
-                                       CS_ETM_OPERATION_PRINT))
-               goto out_free;
-
-       decoder = cs_etm_decoder__new(etm->num_cpu, &d_params, t_params);
-
-       if (!decoder)
-               goto out_free;
        do {
                size_t consumed;
 
                ret = cs_etm_decoder__process_data_block(
-                               decoder, buffer->offset,
+                               etmq->decoder, buffer->offset,
                                &((u8 *)buffer->data)[buffer_used],
                                buffer->size - buffer_used, &consumed);
                if (ret)
@@ -554,10 +533,7 @@ static void cs_etm__dump_event(struct cs_etm_auxtrace *etm,
                buffer_used += consumed;
        } while (buffer_used < buffer->size);
 
-       cs_etm_decoder__free(decoder);
-
-out_free:
-       zfree(&t_params);
+       cs_etm_decoder__reset(etmq->decoder);
 }
 
 static int cs_etm__flush_events(struct perf_session *session,
@@ -769,7 +745,8 @@ static struct cs_etm_queue *cs_etm__alloc_queue(struct cs_etm_auxtrace *etm)
 
        /* Set decoder parameters to decode trace packets */
        if (cs_etm__init_decoder_params(&d_params, etmq,
-                                       CS_ETM_OPERATION_DECODE))
+                                       dump_trace ? CS_ETM_OPERATION_PRINT :
+                                                    CS_ETM_OPERATION_DECODE))
                goto out_free;
 
        etmq->decoder = cs_etm_decoder__new(etm->num_cpu, &d_params, t_params);
@@ -2422,7 +2399,7 @@ static void dump_queued_data(struct cs_etm_auxtrace *etm,
        for (i = 0; i < etm->queues.nr_queues; ++i)
                list_for_each_entry(buf, &etm->queues.queue_array[i].head, list)
                        if (buf->reference == event->reference)
-                               cs_etm__dump_event(etm, buf);
+                               cs_etm__dump_event(etm->queues.queue_array[i].priv, buf);
 }
 
 static int cs_etm__process_auxtrace_event(struct perf_session *session,
@@ -2460,7 +2437,7 @@ static int cs_etm__process_auxtrace_event(struct perf_session *session,
 
                if (dump_trace)
                        if (auxtrace_buffer__get_data(buffer, fd)) {
-                               cs_etm__dump_event(etm, buffer);
+                               cs_etm__dump_event(etm->queues.queue_array[idx].priv, buffer);
                                auxtrace_buffer__put_data(buffer);
                        }
        } else if (dump_trace)