From: Adrian Hunter <adrian.hunter@intel.com>
To: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: linux-kernel@vger.kernel.org, Jiri Olsa <jolsa@redhat.com>
Subject: [PATCH 1/2] perf tools: Improve Intel PT sync to sideband events
Date: Wed, 10 Jun 2015 15:42:42 +0300 [thread overview]
Message-ID: <1433940163-23949-2-git-send-email-adrian.hunter@intel.com> (raw)
In-Reply-To: <1433940163-23949-1-git-send-email-adrian.hunter@intel.com>
To help synchronize trace data with sideband events
the timestamp when returning to userspace is estimated.
That was not always being done if switch information
was not available, but it is still useful for sync'ing
to mmap changes, so simplify by doing it always when
TSC is available. Also add log prints to help debug
synchronization to sideband.
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
---
tools/perf/util/intel-pt.c | 28 ++++++++++++++--------------
1 file changed, 14 insertions(+), 14 deletions(-)
diff --git a/tools/perf/util/intel-pt.c b/tools/perf/util/intel-pt.c
index 5a59fd8e79ae..751c43a1fbcc 100644
--- a/tools/perf/util/intel-pt.c
+++ b/tools/perf/util/intel-pt.c
@@ -63,7 +63,6 @@ struct intel_pt {
bool data_queued;
bool est_tsc;
bool sync_switch;
- bool est_tsc_orig;
int have_sched_switch;
u32 pmu_type;
u64 kernel_start;
@@ -1175,8 +1174,6 @@ static int intel_pt_run_decoder(struct intel_pt_queue *ptq, u64 *timestamp)
intel_pt_log("switch_ip: %"PRIx64" ptss_ip: %"PRIx64"\n",
pt->switch_ip, pt->ptss_ip);
pt->sync_switch = true;
- pt->est_tsc_orig = pt->est_tsc;
- pt->est_tsc = false;
}
}
}
@@ -1195,7 +1192,6 @@ static int intel_pt_run_decoder(struct intel_pt_queue *ptq, u64 *timestamp)
if (pt->sync_switch &&
state->from_ip >= pt->kernel_start) {
pt->sync_switch = false;
- pt->est_tsc = pt->est_tsc_orig;
intel_pt_next_tid(pt, ptq);
}
if (pt->synth_opts.errors) {
@@ -1214,19 +1210,19 @@ static int intel_pt_run_decoder(struct intel_pt_queue *ptq, u64 *timestamp)
intel_pt_sample_flags(ptq);
/* Use estimated TSC upon return to user space */
- if (pt->est_tsc) {
- if (state->from_ip >= pt->kernel_start &&
- state->to_ip &&
- state->to_ip < pt->kernel_start)
- ptq->timestamp = state->est_timestamp;
- else if (state->timestamp > ptq->timestamp)
- ptq->timestamp = state->timestamp;
+ if (pt->est_tsc &&
+ (state->from_ip >= pt->kernel_start || !state->from_ip) &&
+ state->to_ip && state->to_ip < pt->kernel_start) {
+ intel_pt_log("TSC %"PRIx64" est. TSC %"PRIx64"\n",
+ state->timestamp, state->est_timestamp);
+ ptq->timestamp = state->est_timestamp;
/* Use estimated TSC in unknown switch state */
} else if (pt->sync_switch &&
ptq->switch_state == INTEL_PT_SS_UNKNOWN &&
- state->to_ip == pt->switch_ip &&
- (ptq->flags & PERF_IP_FLAG_CALL) &&
+ intel_pt_is_switch_ip(ptq, state->to_ip) &&
ptq->next_tid == -1) {
+ intel_pt_log("TSC %"PRIx64" est. TSC %"PRIx64"\n",
+ state->timestamp, state->est_timestamp);
ptq->timestamp = state->est_timestamp;
} else if (state->timestamp > ptq->timestamp) {
ptq->timestamp = state->timestamp;
@@ -1484,6 +1480,10 @@ static int intel_pt_process_event(struct perf_session *session,
else if (event->header.type == PERF_RECORD_ITRACE_START)
err = intel_pt_process_itrace_start(pt, event, sample);
+ intel_pt_log("event %s (%u): cpu %d time %"PRIu64" tsc %#"PRIx64"\n",
+ perf_event__name(event->header.type), event->header.type,
+ sample->cpu, sample->time, timestamp);
+
return err;
}
@@ -1806,7 +1806,7 @@ int intel_pt_process_auxtrace_info(union perf_event *event,
pt->timeless_decoding = intel_pt_timeless_decoding(pt);
pt->have_tsc = intel_pt_have_tsc(pt);
pt->sampling_mode = false;
- pt->est_tsc = pt->per_cpu_mmaps && !pt->timeless_decoding;
+ pt->est_tsc = !pt->timeless_decoding;
pt->unknown_thread = thread__new(999999999, 999999999);
if (!pt->unknown_thread) {
--
1.9.1
next prev parent reply other threads:[~2015-06-10 12:51 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-06-10 12:42 [PATCH 0/2] perf tools: A couple more Intel PT patches Adrian Hunter
2015-06-10 12:42 ` Adrian Hunter [this message]
2015-06-10 12:42 ` [PATCH 2/2] perf tools: Fix Intel PT getting stuck in a loop Adrian Hunter
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=1433940163-23949-2-git-send-email-adrian.hunter@intel.com \
--to=adrian.hunter@intel.com \
--cc=acme@kernel.org \
--cc=jolsa@redhat.com \
--cc=linux-kernel@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome