From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Ingo Molnar <mingo@kernel.org>
Cc: linux-kernel@vger.kernel.org,
Adrian Hunter <adrian.hunter@intel.com>,
Andi Kleen <ak@linux.intel.com>,
stable@vger.kernel.org,
Arnaldo Carvalho de Melo <acme@redhat.com>
Subject: [PATCH 08/25] perf intel-pt: Improve sample timestamp
Date: Wed, 21 Jun 2017 15:02:28 -0300 [thread overview]
Message-ID: <20170621180245.23134-9-acme@kernel.org> (raw)
In-Reply-To: <20170621180245.23134-1-acme@kernel.org>
From: Adrian Hunter <adrian.hunter@intel.com>
The decoder uses its current timestamp in samples. Usually that is a
timestamp that has already passed, but in some cases it is a timestamp
for a branch that the decoder is walking towards, and consequently
hasn't reached. Improve that situation by using the pkt_state to
determine when to use the current or previous timestamp.
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: stable@vger.kernel.org
Link: http://lkml.kernel.org/r/1495786658-18063-3-git-send-email-adrian.hunter@intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
.../perf/util/intel-pt-decoder/intel-pt-decoder.c | 34 ++++++++++++++++++++--
1 file changed, 31 insertions(+), 3 deletions(-)
diff --git a/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c b/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c
index 5a9676c6e23f..d5c69e822282 100644
--- a/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c
+++ b/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c
@@ -64,6 +64,25 @@ enum intel_pt_pkt_state {
INTEL_PT_STATE_FUP_NO_TIP,
};
+static inline bool intel_pt_sample_time(enum intel_pt_pkt_state pkt_state)
+{
+ switch (pkt_state) {
+ case INTEL_PT_STATE_NO_PSB:
+ case INTEL_PT_STATE_NO_IP:
+ case INTEL_PT_STATE_ERR_RESYNC:
+ case INTEL_PT_STATE_IN_SYNC:
+ case INTEL_PT_STATE_TNT:
+ return true;
+ case INTEL_PT_STATE_TIP:
+ case INTEL_PT_STATE_TIP_PGD:
+ case INTEL_PT_STATE_FUP:
+ case INTEL_PT_STATE_FUP_NO_TIP:
+ return false;
+ default:
+ return true;
+ };
+}
+
#ifdef INTEL_PT_STRICT
#define INTEL_PT_STATE_ERR1 INTEL_PT_STATE_NO_PSB
#define INTEL_PT_STATE_ERR2 INTEL_PT_STATE_NO_PSB
@@ -99,6 +118,7 @@ struct intel_pt_decoder {
uint64_t timestamp;
uint64_t tsc_timestamp;
uint64_t ref_timestamp;
+ uint64_t sample_timestamp;
uint64_t ret_addr;
uint64_t ctc_timestamp;
uint64_t ctc_delta;
@@ -139,6 +159,7 @@ struct intel_pt_decoder {
unsigned int fup_tx_flags;
unsigned int tx_flags;
uint64_t timestamp_insn_cnt;
+ uint64_t sample_insn_cnt;
uint64_t stuck_ip;
int no_progress;
int stuck_ip_prd;
@@ -898,6 +919,7 @@ static int intel_pt_walk_insn(struct intel_pt_decoder *decoder,
decoder->tot_insn_cnt += insn_cnt;
decoder->timestamp_insn_cnt += insn_cnt;
+ decoder->sample_insn_cnt += insn_cnt;
decoder->period_insn_cnt += insn_cnt;
if (err) {
@@ -2069,7 +2091,7 @@ static int intel_pt_sync(struct intel_pt_decoder *decoder)
static uint64_t intel_pt_est_timestamp(struct intel_pt_decoder *decoder)
{
- uint64_t est = decoder->timestamp_insn_cnt << 1;
+ uint64_t est = decoder->sample_insn_cnt << 1;
if (!decoder->cbr || !decoder->max_non_turbo_ratio)
goto out;
@@ -2077,7 +2099,7 @@ static uint64_t intel_pt_est_timestamp(struct intel_pt_decoder *decoder)
est *= decoder->max_non_turbo_ratio;
est /= decoder->cbr;
out:
- return decoder->timestamp + est;
+ return decoder->sample_timestamp + est;
}
const struct intel_pt_state *intel_pt_decode(struct intel_pt_decoder *decoder)
@@ -2133,11 +2155,17 @@ const struct intel_pt_state *intel_pt_decode(struct intel_pt_decoder *decoder)
if (err) {
decoder->state.err = intel_pt_ext_err(err);
decoder->state.from_ip = decoder->ip;
+ decoder->sample_timestamp = decoder->timestamp;
+ decoder->sample_insn_cnt = decoder->timestamp_insn_cnt;
} else {
decoder->state.err = 0;
+ if (intel_pt_sample_time(decoder->pkt_state)) {
+ decoder->sample_timestamp = decoder->timestamp;
+ decoder->sample_insn_cnt = decoder->timestamp_insn_cnt;
+ }
}
- decoder->state.timestamp = decoder->timestamp;
+ decoder->state.timestamp = decoder->sample_timestamp;
decoder->state.est_timestamp = intel_pt_est_timestamp(decoder);
decoder->state.cr3 = decoder->cr3;
decoder->state.tot_insn_cnt = decoder->tot_insn_cnt;
--
2.9.4
next prev parent reply other threads:[~2017-06-21 18:07 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-06-21 18:02 [GIT PULL 00/25] perf/core improvements and fixes Arnaldo Carvalho de Melo
2017-06-21 18:02 ` [PATCH 01/25] perf evsel: Adopt find_process() Arnaldo Carvalho de Melo
2017-06-21 18:02 ` [PATCH 02/25] perf tools: Do parameter validation earlier on fetch_kernel_version() Arnaldo Carvalho de Melo
2017-06-21 18:02 ` [PATCH 03/25] perf tools: Remove unused _ALL_SOURCE define Arnaldo Carvalho de Melo
2017-06-21 18:02 ` [PATCH 04/25] tools lib api fs: Add sysfs__write_int function Arnaldo Carvalho de Melo
2017-06-21 18:02 ` [PATCH 05/25] perf stat: Add support to measure SMI cost Arnaldo Carvalho de Melo
2017-06-21 18:02 ` [PATCH 06/25] perf unwind: Support for powerpc Arnaldo Carvalho de Melo
2017-06-21 18:02 ` [PATCH 07/25] perf intel-pt: Move decoder error setting into one condition Arnaldo Carvalho de Melo
2017-06-21 18:02 ` Arnaldo Carvalho de Melo [this message]
2017-06-21 18:02 ` [PATCH 09/25] perf intel-pt: Fix missing stack clear Arnaldo Carvalho de Melo
2017-06-21 18:02 ` [PATCH 10/25] perf intel-pt: Ensure IP is zero when state is INTEL_PT_STATE_NO_IP Arnaldo Carvalho de Melo
2017-06-21 18:02 ` [PATCH 11/25] perf intel-pt: Fix last_ip usage Arnaldo Carvalho de Melo
2017-06-21 18:02 ` [PATCH 12/25] perf intel-pt: Ensure never to set 'last_ip' when packet 'count' is zero Arnaldo Carvalho de Melo
2017-06-21 18:02 ` [PATCH 13/25] perf intel-pt: Use FUP always when scanning for an IP Arnaldo Carvalho de Melo
2017-06-21 18:02 ` [PATCH 14/25] perf intel-pt: Clear FUP flag on error Arnaldo Carvalho de Melo
2017-06-21 18:02 ` [PATCH 15/25] perf intel-pt: Add missing __fallthrough Arnaldo Carvalho de Melo
2017-06-21 18:02 ` [PATCH 16/25] perf intel-pt: Allow decoding with branch tracing disabled Arnaldo Carvalho de Melo
2017-06-21 18:02 ` [PATCH 17/25] perf intel-pt: Add default config for pass-through branch enable Arnaldo Carvalho de Melo
2017-06-21 18:02 ` [PATCH 18/25] perf intel-pt: Add documentation for new config terms Arnaldo Carvalho de Melo
2017-06-21 18:02 ` [PATCH 19/25] perf intel-pt: Add decoder support for ptwrite and power event packets Arnaldo Carvalho de Melo
2017-06-21 18:02 ` [PATCH 20/25] perf intel-pt: Add reserved byte to CBR packet payload Arnaldo Carvalho de Melo
2017-06-21 18:02 ` [PATCH 21/25] perf intel-pt: Add decoder support for CBR events Arnaldo Carvalho de Melo
2017-06-21 18:02 ` [PATCH 22/25] perf intel-pt: Remove redundant initial_skip checks Arnaldo Carvalho de Melo
2017-06-21 18:02 ` [PATCH 23/25] perf intel-pt: Fix transactions_sample_type Arnaldo Carvalho de Melo
2017-06-21 18:02 ` [PATCH 24/25] perf tools: Fix message because cpu list option is -C not -c Arnaldo Carvalho de Melo
2017-06-21 18:02 ` [PATCH 25/25] perf script: Fix message because field list option is -F not -f Arnaldo Carvalho de Melo
2017-06-21 18:13 ` [GIT PULL 00/25] perf/core improvements and fixes Ingo Molnar
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=20170621180245.23134-9-acme@kernel.org \
--to=acme@kernel.org \
--cc=acme@redhat.com \
--cc=adrian.hunter@intel.com \
--cc=ak@linux.intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=stable@vger.kernel.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.