aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf
diff options
context:
space:
mode:
authorAdrian Hunter <adrian.hunter@intel.com>2017-05-26 04:17:11 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2017-06-21 10:35:48 -0400
commit839598176b0554967238234e1e92c7d1e3f0d53d (patch)
treeb924625e5f60a21534f3291379bf098b56f73329 /tools/perf
parent04194207fe6424c7a1bfd6f43ef7deb90cdf716f (diff)
perf intel-pt: Allow decoding with branch tracing disabled
The kernel now supports the disabling of branch tracing, however the decoder assumes branch tracing is always enabled. Pass through a parameter to indicate whether branch tracing is enabled and use it to avoid cases when the decoder is expecting branch packets. There are 2 such cases. First, FUP packets which can bind to an IP even when there is no branch tracing. Secondly, the decoder will try to use branch packets to find an IP to start decoding or to recover from errors. Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> Cc: Andi Kleen <ak@linux.intel.com> Link: http://lkml.kernel.org/r/1495786658-18063-11-git-send-email-adrian.hunter@intel.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf')
-rw-r--r--tools/perf/util/intel-pt-decoder/intel-pt-decoder.c13
-rw-r--r--tools/perf/util/intel-pt-decoder/intel-pt-decoder.h1
-rw-r--r--tools/perf/util/intel-pt.c14
3 files changed, 28 insertions, 0 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 cad40fe93bd2..dacb9223e743 100644
--- a/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c
+++ b/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c
@@ -106,6 +106,7 @@ struct intel_pt_decoder {
106 const unsigned char *buf; 106 const unsigned char *buf;
107 size_t len; 107 size_t len;
108 bool return_compression; 108 bool return_compression;
109 bool branch_enable;
109 bool mtc_insn; 110 bool mtc_insn;
110 bool pge; 111 bool pge;
111 bool have_tma; 112 bool have_tma;
@@ -214,6 +215,7 @@ struct intel_pt_decoder *intel_pt_decoder_new(struct intel_pt_params *params)
214 decoder->pgd_ip = params->pgd_ip; 215 decoder->pgd_ip = params->pgd_ip;
215 decoder->data = params->data; 216 decoder->data = params->data;
216 decoder->return_compression = params->return_compression; 217 decoder->return_compression = params->return_compression;
218 decoder->branch_enable = params->branch_enable;
217 219
218 decoder->period = params->period; 220 decoder->period = params->period;
219 decoder->period_type = params->period_type; 221 decoder->period_type = params->period_type;
@@ -1650,6 +1652,10 @@ next:
1650 break; 1652 break;
1651 } 1653 }
1652 intel_pt_set_last_ip(decoder); 1654 intel_pt_set_last_ip(decoder);
1655 if (!decoder->branch_enable) {
1656 decoder->ip = decoder->last_ip;
1657 break;
1658 }
1653 err = intel_pt_walk_fup(decoder); 1659 err = intel_pt_walk_fup(decoder);
1654 if (err != -EAGAIN) { 1660 if (err != -EAGAIN) {
1655 if (err) 1661 if (err)
@@ -1964,6 +1970,13 @@ static int intel_pt_sync_ip(struct intel_pt_decoder *decoder)
1964 1970
1965 decoder->set_fup_tx_flags = false; 1971 decoder->set_fup_tx_flags = false;
1966 1972
1973 if (!decoder->branch_enable) {
1974 decoder->pkt_state = INTEL_PT_STATE_IN_SYNC;
1975 decoder->overflow = false;
1976 decoder->state.type = 0; /* Do not have a sample */
1977 return 0;
1978 }
1979
1967 intel_pt_log("Scanning for full IP\n"); 1980 intel_pt_log("Scanning for full IP\n");
1968 err = intel_pt_walk_to_ip(decoder); 1981 err = intel_pt_walk_to_ip(decoder);
1969 if (err) 1982 if (err)
diff --git a/tools/perf/util/intel-pt-decoder/intel-pt-decoder.h b/tools/perf/util/intel-pt-decoder/intel-pt-decoder.h
index e90619a43c0c..add3bed58349 100644
--- a/tools/perf/util/intel-pt-decoder/intel-pt-decoder.h
+++ b/tools/perf/util/intel-pt-decoder/intel-pt-decoder.h
@@ -87,6 +87,7 @@ struct intel_pt_params {
87 bool (*pgd_ip)(uint64_t ip, void *data); 87 bool (*pgd_ip)(uint64_t ip, void *data);
88 void *data; 88 void *data;
89 bool return_compression; 89 bool return_compression;
90 bool branch_enable;
90 uint64_t period; 91 uint64_t period;
91 enum intel_pt_period_type period_type; 92 enum intel_pt_period_type period_type;
92 unsigned max_non_turbo_ratio; 93 unsigned max_non_turbo_ratio;
diff --git a/tools/perf/util/intel-pt.c b/tools/perf/util/intel-pt.c
index 4c7718f87a08..5c59b8c6a719 100644
--- a/tools/perf/util/intel-pt.c
+++ b/tools/perf/util/intel-pt.c
@@ -668,6 +668,19 @@ static bool intel_pt_return_compression(struct intel_pt *pt)
668 return true; 668 return true;
669} 669}
670 670
671static bool intel_pt_branch_enable(struct intel_pt *pt)
672{
673 struct perf_evsel *evsel;
674 u64 config;
675
676 evlist__for_each_entry(pt->session->evlist, evsel) {
677 if (intel_pt_get_config(pt, &evsel->attr, &config) &&
678 (config & 1) && !(config & 0x2000))
679 return false;
680 }
681 return true;
682}
683
671static unsigned int intel_pt_mtc_period(struct intel_pt *pt) 684static unsigned int intel_pt_mtc_period(struct intel_pt *pt)
672{ 685{
673 struct perf_evsel *evsel; 686 struct perf_evsel *evsel;
@@ -799,6 +812,7 @@ static struct intel_pt_queue *intel_pt_alloc_queue(struct intel_pt *pt,
799 params.walk_insn = intel_pt_walk_next_insn; 812 params.walk_insn = intel_pt_walk_next_insn;
800 params.data = ptq; 813 params.data = ptq;
801 params.return_compression = intel_pt_return_compression(pt); 814 params.return_compression = intel_pt_return_compression(pt);
815 params.branch_enable = intel_pt_branch_enable(pt);
802 params.max_non_turbo_ratio = pt->max_non_turbo_ratio; 816 params.max_non_turbo_ratio = pt->max_non_turbo_ratio;
803 params.mtc_period = intel_pt_mtc_period(pt); 817 params.mtc_period = intel_pt_mtc_period(pt);
804 params.tsc_ctc_ratio_n = pt->tsc_ctc_ratio_n; 818 params.tsc_ctc_ratio_n = pt->tsc_ctc_ratio_n;