| From f1410028c762893daf353765112cf6797e4442fa Mon Sep 17 00:00:00 2001 |
| From: Leo Yan <leo.yan@linaro.org> |
| Date: Wed, 19 Feb 2020 10:18:08 +0800 |
| Subject: [PATCH 2/5] perf cs-etm: Continuously record last branch |
| |
| Every time synthesize instruction sample, the last branch recording will |
| be reset. This is fine if the instruction period is big enough, for |
| example if use the option '--itrace=i100000', the last branch array is |
| reset for every sample with 100000 instructions per period; before |
| generate the next instruction sample, there has the sufficient packets |
| coming to fill the last branch array. |
| |
| On the other hand, if set a very small period, the packets will be |
| significantly reduced between two continuous instruction samples, thus |
| the last branch array is almost empty for new instruction sample by |
| frequently resetting. |
| |
| To allow the last branches to work properly for any instruction periods, |
| this patch avoids to reset the last branch for every instruction sample |
| and only reset it when flush the trace data. The last branches will be |
| reset only for two cases, one is for trace starting, another case is for |
| discontinuous trace; other cases can keep recording last branches for |
| continuous 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-3-leo.yan@linaro.org |
| Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> |
| --- |
| tools/perf/util/cs-etm.c | 7 ++++--- |
| 1 file changed, 4 insertions(+), 3 deletions(-) |
| |
| diff --git a/tools/perf/util/cs-etm.c b/tools/perf/util/cs-etm.c |
| index 294b09cfb034..2c4156c5ed09 100644 |
| --- a/tools/perf/util/cs-etm.c |
| +++ b/tools/perf/util/cs-etm.c |
| @@ -1170,9 +1170,6 @@ static int cs_etm__synth_instruction_sample(struct cs_etm_queue *etmq, |
| "CS ETM Trace: failed to deliver instruction event, error %d\n", |
| ret); |
| |
| - if (etm->synth_opts.last_branch) |
| - cs_etm__reset_last_branch_rb(tidq); |
| - |
| return ret; |
| } |
| |
| @@ -1487,6 +1484,10 @@ static int cs_etm__flush(struct cs_etm_queue *etmq, |
| swap_packet: |
| cs_etm__packet_swap(etm, tidq); |
| |
| + /* Reset last branches after flush the trace */ |
| + if (etm->synth_opts.last_branch) |
| + cs_etm__reset_last_branch_rb(tidq); |
| + |
| return err; |
| } |
| |
| -- |
| 2.32.0.272.g935e593368-goog |
| |