| From 695378b567df1fe6631c6684fcc9eeb4257df70f Mon Sep 17 00:00:00 2001 |
| From: Leo Yan <leo.yan@linaro.org> |
| Date: Wed, 19 Feb 2020 10:18:10 +0800 |
| Subject: [PATCH 4/5] perf cs-etm: Optimize copying last branches |
| |
| If an instruction range packet can generate multiple instruction |
| samples, these samples share the same last branches; it's not necessary |
| to copy the same last branches repeatedly for these samples within the |
| same packet. |
| |
| This patch moves out the last branches copying from function |
| cs_etm__synth_instruction_sample(), and execute it prior to generating |
| instruction samples. |
| |
| Signed-off-by: Leo Yan <leo.yan@linaro.org> |
| Reviewed-by: Mathieu Poirier <mathieu.poirier@linaro.org> |
| Reviewed-by: Mike Leach <mike.leach@linaro.org> |
| Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> |
| Cc: Jiri Olsa <jolsa@redhat.com> |
| Cc: Mark Rutland <mark.rutland@arm.com> |
| Cc: Namhyung Kim <namhyung@kernel.org> |
| Cc: Peter Zijlstra <peterz@infradead.org> |
| Cc: Robert Walker <robert.walker@arm.com> |
| Cc: Suzuki Poulouse <suzuki.poulose@arm.com> |
| Cc: coresight ml <coresight@lists.linaro.org> |
| Cc: linux-arm-kernel@lists.infradead.org |
| Link: http://lore.kernel.org/lkml/20200219021811.20067-5-leo.yan@linaro.org |
| Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> |
| --- |
| tools/perf/util/cs-etm.c | 22 +++++++++++++++++----- |
| 1 file changed, 17 insertions(+), 5 deletions(-) |
| |
| diff --git a/tools/perf/util/cs-etm.c b/tools/perf/util/cs-etm.c |
| index 1ddcc67e13dd..87d9943177bc 100644 |
| --- a/tools/perf/util/cs-etm.c |
| +++ b/tools/perf/util/cs-etm.c |
| @@ -1151,10 +1151,8 @@ static int cs_etm__synth_instruction_sample(struct cs_etm_queue *etmq, |
| |
| cs_etm__copy_insn(etmq, tidq->trace_chan_id, tidq->packet, &sample); |
| |
| - if (etm->synth_opts.last_branch) { |
| - cs_etm__copy_last_branch_rb(etmq, tidq); |
| + if (etm->synth_opts.last_branch) |
| sample.branch_stack = tidq->last_branch; |
| - } |
| |
| if (etm->synth_opts.inject) { |
| ret = cs_etm__inject_event(event, &sample, |
| @@ -1431,6 +1429,10 @@ static int cs_etm__sample(struct cs_etm_queue *etmq, |
| u64 offset = etm->instructions_sample_period - instrs_prev; |
| u64 addr; |
| |
| + /* Prepare last branches for instruction sample */ |
| + if (etm->synth_opts.last_branch) |
| + cs_etm__copy_last_branch_rb(etmq, tidq); |
| + |
| while (tidq->period_instructions >= |
| etm->instructions_sample_period) { |
| /* |
| @@ -1508,6 +1510,11 @@ static int cs_etm__flush(struct cs_etm_queue *etmq, |
| |
| if (etmq->etm->synth_opts.last_branch && |
| tidq->prev_packet->sample_type == CS_ETM_RANGE) { |
| + u64 addr; |
| + |
| + /* Prepare last branches for instruction sample */ |
| + cs_etm__copy_last_branch_rb(etmq, tidq); |
| + |
| /* |
| * Generate a last branch event for the branches left in the |
| * circular buffer at the end of the trace. |
| @@ -1515,7 +1522,7 @@ static int cs_etm__flush(struct cs_etm_queue *etmq, |
| * Use the address of the end of the last reported execution |
| * range |
| */ |
| - u64 addr = cs_etm__last_executed_instr(tidq->prev_packet); |
| + addr = cs_etm__last_executed_instr(tidq->prev_packet); |
| |
| err = cs_etm__synth_instruction_sample( |
| etmq, tidq, addr, |
| @@ -1560,11 +1567,16 @@ static int cs_etm__end_block(struct cs_etm_queue *etmq, |
| */ |
| if (etmq->etm->synth_opts.last_branch && |
| tidq->prev_packet->sample_type == CS_ETM_RANGE) { |
| + u64 addr; |
| + |
| + /* Prepare last branches for instruction sample */ |
| + cs_etm__copy_last_branch_rb(etmq, tidq); |
| + |
| /* |
| * Use the address of the end of the last reported execution |
| * range. |
| */ |
| - u64 addr = cs_etm__last_executed_instr(tidq->prev_packet); |
| + addr = cs_etm__last_executed_instr(tidq->prev_packet); |
| |
| err = cs_etm__synth_instruction_sample( |
| etmq, tidq, addr, |
| -- |
| 2.32.0.272.g935e593368-goog |
| |