perf cs-etm: Fix corrupt inject files when only last branch option is enabled
authorJames Clark <james.clark@arm.com>
Thu, 10 Feb 2022 20:06:20 +0000 (20:06 +0000)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Wed, 16 Feb 2022 16:49:25 +0000 (13:49 -0300)
'perf inject' with Coresight data generates files that cannot be opened
when only the last branch option is specified:

  perf inject -i perf.data --itrace=l -o inject.data
  perf script -i inject.data
  0x33faa8 [0x8]: failed to process type: 9 [Bad address]

This is because cs_etm__synth_instruction_sample() is called even when
the sample type for instructions hasn't been setup. Last branch records
are attached to instruction samples so it doesn't make sense to generate
them when --itrace=i isn't specified anyway.

This change disables all calls of cs_etm__synth_instruction_sample()
unless --itrace=i is specified, resulting in a file with no samples if
only --itrace=l is provided, rather than a bad file.

Reviewed-by: Leo Yan <leo.yan@linaro.org>
Signed-off-by: James Clark <james.clark@arm.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: John Garry <john.garry@huawei.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Mathieu Poirier <mathieu.poirier@linaro.org>
Cc: Mike Leach <mike.leach@linaro.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Will Deacon <will@kernel.org>
Cc: coresight@lists.linaro.org
Cc: linux-arm-kernel@lists.infradead.org
Link: https://lore.kernel.org/r/20220210200620.1227232-2-james.clark@arm.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/cs-etm.c

index 796a065a500ed30bcb9f0fbf861b94fd08f0384e..8b95fb3c4d7b4038ca43334c9f94eea0fec54f36 100644 (file)
@@ -1553,6 +1553,7 @@ static int cs_etm__flush(struct cs_etm_queue *etmq,
                goto swap_packet;
 
        if (etmq->etm->synth_opts.last_branch &&
+           etmq->etm->synth_opts.instructions &&
            tidq->prev_packet->sample_type == CS_ETM_RANGE) {
                u64 addr;
 
@@ -1610,6 +1611,7 @@ static int cs_etm__end_block(struct cs_etm_queue *etmq,
         * the trace.
         */
        if (etmq->etm->synth_opts.last_branch &&
+           etmq->etm->synth_opts.instructions &&
            tidq->prev_packet->sample_type == CS_ETM_RANGE) {
                u64 addr;