aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf
diff options
context:
space:
mode:
authorAdrian Hunter <adrian.hunter@intel.com>2015-07-17 12:33:56 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2015-08-24 16:48:06 -0400
commitb45fc0bfaf4a0b60ce2deda222f8ef2a23b89a5f (patch)
treed9553e96c218505c113a2ba1ac14db230393f25d /tools/perf
parent79b58424b821c651a4b4df9018a14684e3670f42 (diff)
perf tools: Add Intel PT support for using MTC packets
MTC packets are a new Intel PT feature. MTC packets provide finer grain timestamp information than TSC packets. Support for this feature is indicated by: /sys/bus/event_source/devices/intel_pt/caps/mtc which contains "1" if the feature is supported and "0" otherwise. MTC packets can be requested using a PMU config term e.g. perf record -e intel_pt/mtc/u sleep 1 The frequency of MTC packets can also be specified. e.g. perf record -e intel_pt/mtc,mtc_period=2/u sleep 1 The default value is 3 or the nearest lower value that is supported. 0 is always supported. Valid values are given by: /sys/bus/event_source/devices/intel_pt/caps/mtc_periods which contains a hexadecimal value, the bits of which represent valid values e.g. bit 2 set means value 2 is valid. The value is converted to the MTC frequency as: CTC-frequency / (2 ^ value) e.g. value 3 means one eighth of CTC-frequency Where CTC is the hardware crystal clock, the frequency of which can be related to TSC via values provided in cpuid leaf 0x15. If an invalid value is entered, the error message will give a list of valid values e.g. $ perf record -e intel_pt/mtc_period=15/u uname Invalid mtc_period for intel_pt. Valid values are: 0,3,6,9 tools/perf/Documentation/intel-pt.txt is updated in a later patch as there are a number of new features being added. For more information refer to the June 2015 or later Intel 64 and IA-32 Architectures SDM Chapter 36 Intel Processor Trace. Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> Cc: Jiri Olsa <jolsa@redhat.com> Link: http://lkml.kernel.org/r/1437150840-31811-22-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/arch/x86/util/intel-pt.c26
1 files changed, 25 insertions, 1 deletions
diff --git a/tools/perf/arch/x86/util/intel-pt.c b/tools/perf/arch/x86/util/intel-pt.c
index faae9289bcf6..a5de01dad868 100644
--- a/tools/perf/arch/x86/util/intel-pt.c
+++ b/tools/perf/arch/x86/util/intel-pt.c
@@ -190,17 +190,33 @@ static int intel_pt_pick_bit(int bits, int target)
190static u64 intel_pt_default_config(struct perf_pmu *intel_pt_pmu) 190static u64 intel_pt_default_config(struct perf_pmu *intel_pt_pmu)
191{ 191{
192 char buf[256]; 192 char buf[256];
193 int mtc, mtc_periods = 0, mtc_period;
193 int psb_cyc, psb_periods, psb_period; 194 int psb_cyc, psb_periods, psb_period;
194 int pos = 0; 195 int pos = 0;
195 u64 config; 196 u64 config;
196 197
197 pos += scnprintf(buf + pos, sizeof(buf) - pos, "tsc"); 198 pos += scnprintf(buf + pos, sizeof(buf) - pos, "tsc");
198 199
200 if (perf_pmu__scan_file(intel_pt_pmu, "caps/mtc", "%d",
201 &mtc) != 1)
202 mtc = 1;
203
204 if (mtc) {
205 if (perf_pmu__scan_file(intel_pt_pmu, "caps/mtc_periods", "%x",
206 &mtc_periods) != 1)
207 mtc_periods = 0;
208 if (mtc_periods) {
209 mtc_period = intel_pt_pick_bit(mtc_periods, 3);
210 pos += scnprintf(buf + pos, sizeof(buf) - pos,
211 ",mtc,mtc_period=%d", mtc_period);
212 }
213 }
214
199 if (perf_pmu__scan_file(intel_pt_pmu, "caps/psb_cyc", "%d", 215 if (perf_pmu__scan_file(intel_pt_pmu, "caps/psb_cyc", "%d",
200 &psb_cyc) != 1) 216 &psb_cyc) != 1)
201 psb_cyc = 1; 217 psb_cyc = 1;
202 218
203 if (psb_cyc) { 219 if (psb_cyc && mtc_periods) {
204 if (perf_pmu__scan_file(intel_pt_pmu, "caps/psb_periods", "%x", 220 if (perf_pmu__scan_file(intel_pt_pmu, "caps/psb_periods", "%x",
205 &psb_periods) != 1) 221 &psb_periods) != 1)
206 psb_periods = 0; 222 psb_periods = 0;
@@ -454,9 +470,17 @@ out_err:
454static int intel_pt_validate_config(struct perf_pmu *intel_pt_pmu, 470static int intel_pt_validate_config(struct perf_pmu *intel_pt_pmu,
455 struct perf_evsel *evsel) 471 struct perf_evsel *evsel)
456{ 472{
473 int err;
474
457 if (!evsel) 475 if (!evsel)
458 return 0; 476 return 0;
459 477
478 err = intel_pt_val_config_term(intel_pt_pmu, "caps/mtc_periods",
479 "mtc_period", "caps/mtc",
480 evsel->attr.config);
481 if (err)
482 return err;
483
460 return intel_pt_val_config_term(intel_pt_pmu, "caps/psb_periods", 484 return intel_pt_val_config_term(intel_pt_pmu, "caps/psb_periods",
461 "psb_period", "caps/psb_cyc", 485 "psb_period", "caps/psb_cyc",
462 evsel->attr.config); 486 evsel->attr.config);