Thread (13 messages) 13 messages, 2 authors, 2020-02-06

Re: [PATCH v3 4/5] perf cs-etm: Optimize copying last branches

From: Mike Leach <hidden>
Date: 2020-02-06 11:48:08
Also in: lkml

Reviewed by: Mike Leach [off-list ref]

On Mon, 3 Feb 2020 at 01:53, Leo Yan [off-list ref] wrote:
quoted hunk ↗ jump to hunk
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 <redacted>
---
 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 c5a05f728eac..dbddf1eec2be 100644
--- a/tools/perf/util/cs-etm.c
+++ b/tools/perf/util/cs-etm.c
@@ -1134,10 +1134,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,
@@ -1407,6 +1405,10 @@ static int cs_etm__sample(struct cs_etm_queue *etmq,
                 */
                u64 instrs_over = instrs_executed;

+               /* Prepare last branches for instruction sample */
+               if (etm->synth_opts.last_branch)
+                       cs_etm__copy_last_branch_rb(etmq, tidq);
+
                /*
                 * 'head' is the instructions number of the head in the new
                 * packet, it combines with the tail of previous packet to
@@ -1526,6 +1528,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.
@@ -1533,7 +1540,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,
@@ -1587,11 +1594,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.17.1

-- 
Mike Leach
Principal Engineer, ARM Ltd.
Manchester Design Centre. UK

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help