cs_etm__sample() validates whether the previous packet should generate a branch sample before calling cs_etm__synth_branch_sample(), while cs_etm__flush() generates branch samples unconditionally.
Move the eligibility check into cs_etm__synth_branch_sample() so that both paths apply the same rule: generate branch samples only for discontinuity packets or range packets ending in a taken branch.
Fixes: d603b4e9f9c3 ("perf cs-etm: Generate branch sample when receiving a CS_ETM_TRACE_ON packet") Signed-off-by: Leo Yan leo.yan@arm.com --- tools/perf/util/cs-etm.c | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-)
diff --git a/tools/perf/util/cs-etm.c b/tools/perf/util/cs-etm.c index 05e698f666bbe07af9caeda1a673f22d7196817a..dec50e2cc7b7857a04f631b3e0e08beb6e7e280a 100644 --- a/tools/perf/util/cs-etm.c +++ b/tools/perf/util/cs-etm.c @@ -1710,6 +1710,11 @@ static int cs_etm__synth_branch_sample(struct cs_etm_queue *etmq, !(etm->branches_filter & tidq->prev_packet->flags)) return 0;
+ /* Generate branch sample only for tracing on or taken branches */ + if (tidq->prev_packet->sample_type != CS_ETM_DISCONTINUITY && + !cs_etm__packet_has_taken_branch(tidq->prev_packet)) + return 0; + perf_sample__init(&sample, /*all=*/true); ip = cs_etm__last_executed_instr(tidq->prev_packet);
@@ -1946,21 +1951,9 @@ static int cs_etm__sample(struct cs_etm_queue *etmq, }
if (etm->synth_opts.branches) { - bool generate_sample = false; - - /* Generate sample for tracing on packet */ - if (tidq->prev_packet->sample_type == CS_ETM_DISCONTINUITY) - generate_sample = true; - - /* Generate sample for branch taken packet */ - if (cs_etm__packet_has_taken_branch(tidq->prev_packet)) - generate_sample = true; - - if (generate_sample) { - ret = cs_etm__synth_branch_sample(etmq, tidq); - if (ret) - return ret; - } + ret = cs_etm__synth_branch_sample(etmq, tidq); + if (ret) + return ret; }
cs_etm__packet_swap(etm, tidq);