linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: tip-bot for Leo Yan <tipbot@zytor.com>
To: linux-tip-commits@vger.kernel.org
Cc: mike.leach@linaro.org, hpa@zytor.com, robert.walker@arm.com,
	acme@redhat.com, namhyung@kernel.org, jolsa@redhat.com,
	tglx@linutronix.de, leo.yan@linaro.org, mingo@kernel.org,
	alexander.shishkin@linux.intel.com, mathieu.poirier@linaro.org,
	linux-kernel@vger.kernel.org
Subject: [tip:perf/core] perf cs-etm: Avoid stale branch samples when flush packet
Date: Thu, 20 Dec 2018 10:12:54 -0800	[thread overview]
Message-ID: <tip-24fff5eb2b937951af5dce6cdb7a1e679ac8e751@git.kernel.org> (raw)
In-Reply-To: <1544513908-16805-3-git-send-email-leo.yan@linaro.org>

Commit-ID:  24fff5eb2b937951af5dce6cdb7a1e679ac8e751
Gitweb:     https://git.kernel.org/tip/24fff5eb2b937951af5dce6cdb7a1e679ac8e751
Author:     Leo Yan <leo.yan@linaro.org>
AuthorDate: Tue, 11 Dec 2018 15:38:22 +0800
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Tue, 18 Dec 2018 12:23:59 -0300

perf cs-etm: Avoid stale branch samples when flush packet

At the end of trace buffer handling, function cs_etm__flush() is invoked
to flush any remaining branch stack entries.  As a side effect, it also
generates branch sample, because the 'etmq->packet' doesn't contains any
new coming packet but point to one stale packet after packets swapping,
so it wrongly makes synthesize branch samples with stale packet info.

We could review below detailed flow which causes issue:

  Packet1: start_addr=0xffff000008b1fbf0 end_addr=0xffff000008b1fbfc
  Packet2: start_addr=0xffff000008b1fb5c end_addr=0xffff000008b1fb6c

  step 1: cs_etm__sample():
	sample: ip=(0xffff000008b1fbfc-4) addr=0xffff000008b1fb5c

  step 2: flush packet in cs_etm__run_decoder():
	cs_etm__run_decoder()
	  `-> err = cs_etm__flush(etmq, false);
	sample: ip=(0xffff000008b1fb6c-4) addr=0xffff000008b1fbf0

Packet1 and packet2 are two continuous packets, when packet2 is the new
coming packet, cs_etm__sample() generates branch sample for these two
packets and use [packet1::end_addr - 4 => packet2::start_addr] as branch
jump flow, thus we can see the first generated branch sample in step 1.
At the end of cs_etm__sample() it swaps packets so 'etm->prev_packet'=
packet2 and 'etm->packet'=packet1, so far it's okay for branch sample.

If packet2 is the last one packet in trace buffer, even there have no
any new coming packet, cs_etm__run_decoder() invokes cs_etm__flush() to
flush branch stack entries as expected, but it also generates branch
samples by taking 'etm->packet' as a new coming packet, thus the branch
jump flow is as [packet2::end_addr - 4 =>  packet1::start_addr]; this
is the second sample which is generated in step 2.  So actually the
second sample is a stale sample and we should not generate it.

This patch introduces a new function cs_etm__end_block(), at the end of
trace block this function is invoked to only flush branch stack entries
and thus can avoid to generate branch sample for stale packet.

Signed-off-by: Leo Yan <leo.yan@linaro.org>
Reviewed-by: Mathieu Poirier <mathieu.poirier@linaro.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Leach <mike.leach@linaro.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Robert Walker <robert.walker@arm.com>
Cc: coresight@lists.linaro.org
Cc: linux-arm-kernel@lists.infradead.org
Link: http://lkml.kernel.org/r/1544513908-16805-3-git-send-email-leo.yan@linaro.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/util/cs-etm.c | 35 ++++++++++++++++++++++++++++++++++-
 1 file changed, 34 insertions(+), 1 deletion(-)

diff --git a/tools/perf/util/cs-etm.c b/tools/perf/util/cs-etm.c
index 789707bc4e9e..ffc4fe5c0b7e 100644
--- a/tools/perf/util/cs-etm.c
+++ b/tools/perf/util/cs-etm.c
@@ -1055,6 +1055,39 @@ swap_packet:
 	return err;
 }
 
+static int cs_etm__end_block(struct cs_etm_queue *etmq)
+{
+	int err;
+
+	/*
+	 * It has no new packet coming and 'etmq->packet' contains the stale
+	 * packet which was set at the previous time with packets swapping;
+	 * so skip to generate branch sample to avoid stale packet.
+	 *
+	 * For this case only flush branch stack and generate a last branch
+	 * event for the branches left in the circular buffer at the end of
+	 * the trace.
+	 */
+	if (etmq->etm->synth_opts.last_branch &&
+	    etmq->prev_packet->sample_type == CS_ETM_RANGE) {
+		/*
+		 * Use the address of the end of the last reported execution
+		 * range.
+		 */
+		u64 addr = cs_etm__last_executed_instr(etmq->prev_packet);
+
+		err = cs_etm__synth_instruction_sample(
+			etmq, addr,
+			etmq->period_instructions);
+		if (err)
+			return err;
+
+		etmq->period_instructions = 0;
+	}
+
+	return 0;
+}
+
 static int cs_etm__run_decoder(struct cs_etm_queue *etmq)
 {
 	struct cs_etm_auxtrace *etm = etmq->etm;
@@ -1137,7 +1170,7 @@ static int cs_etm__run_decoder(struct cs_etm_queue *etmq)
 
 		if (err == 0)
 			/* Flush any remaining branch stack entries */
-			err = cs_etm__flush(etmq);
+			err = cs_etm__end_block(etmq);
 	}
 
 	return err;

  reply	other threads:[~2018-12-20 18:14 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-12-11  7:38 [PATCH v3 0/8] perf cs-etm: Correct packets handling Leo Yan
2018-12-11  7:38 ` [PATCH v3 1/8] perf cs-etm: Correct packets swapping in cs_etm__flush() Leo Yan
2018-12-20 18:12   ` [tip:perf/core] " tip-bot for Leo Yan
2018-12-11  7:38 ` [PATCH v3 2/8] perf cs-etm: Avoid stale branch samples when flush packet Leo Yan
2018-12-20 18:12   ` tip-bot for Leo Yan [this message]
2018-12-11  7:38 ` [PATCH v3 3/8] perf cs-etm: Remove unused 'trace_on' in cs_etm_decoder Leo Yan
2018-12-12 18:41   ` Mathieu Poirier
2018-12-20 18:13   ` [tip:perf/core] " tip-bot for Leo Yan
2018-12-11  7:38 ` [PATCH v3 4/8] perf cs-etm: Refactor enumeration cs_etm_sample_type Leo Yan
2018-12-12 18:41   ` Mathieu Poirier
2018-12-20 18:14   ` [tip:perf/core] " tip-bot for Leo Yan
2018-12-11  7:38 ` [PATCH v3 5/8] perf cs-etm: Rename CS_ETM_TRACE_ON to CS_ETM_DISCONTINUITY Leo Yan
2018-12-20 18:14   ` [tip:perf/core] " tip-bot for Leo Yan
2018-12-11  7:38 ` [PATCH v3 6/8] perf cs-etm: Treat NO_SYNC element as trace discontinuity Leo Yan
2018-12-13 12:38   ` Arnaldo Carvalho de Melo
2018-12-13 12:41     ` Arnaldo Carvalho de Melo
2018-12-13 13:09       ` leo.yan
2018-12-13 13:21         ` Arnaldo Carvalho de Melo
2018-12-13 13:23           ` leo.yan
2018-12-13 13:26           ` Arnaldo Carvalho de Melo
2018-12-13 13:31             ` leo.yan
2018-12-20 18:15   ` [tip:perf/core] " tip-bot for Leo Yan
2018-12-11  7:38 ` [PATCH v3 7/8] perf cs-etm: Treat EO_TRACE " Leo Yan
2018-12-20 18:15   ` [tip:perf/core] " tip-bot for Leo Yan
2018-12-11  7:38 ` [PATCH v3 8/8] perf cs-etm: Generate branch sample for exception packet Leo Yan
2018-12-20 18:16   ` [tip:perf/core] " tip-bot for Leo Yan
2018-12-12 18:45 ` [PATCH v3 0/8] perf cs-etm: Correct packets handling Mathieu Poirier
2018-12-13 13:11   ` Arnaldo Carvalho de Melo

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=tip-24fff5eb2b937951af5dce6cdb7a1e679ac8e751@git.kernel.org \
    --to=tipbot@zytor.com \
    --cc=acme@redhat.com \
    --cc=alexander.shishkin@linux.intel.com \
    --cc=hpa@zytor.com \
    --cc=jolsa@redhat.com \
    --cc=leo.yan@linaro.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-tip-commits@vger.kernel.org \
    --cc=mathieu.poirier@linaro.org \
    --cc=mike.leach@linaro.org \
    --cc=mingo@kernel.org \
    --cc=namhyung@kernel.org \
    --cc=robert.walker@arm.com \
    --cc=tglx@linutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).