-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
perf intel-pt: Add example script for power events and PTWRITE
Add script intel-pt-events.py that provides an example of how to unpack the raw data for power events and PTWRITE. Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> Cc: Andi Kleen <ak@linux.intel.com> Link: http://lkml.kernel.org/r/1495786658-18063-35-git-send-email-adrian.hunter@intel.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
- Loading branch information
Adrian Hunter
authored and
Arnaldo Carvalho de Melo
committed
Jun 30, 2017
1 parent
3797307
commit cc89272
Showing
3 changed files
with
144 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
#!/bin/bash | ||
|
||
# | ||
# print Intel PT Power Events and PTWRITE. The intel_pt PMU event needs | ||
# to be specified with appropriate config terms. | ||
# | ||
if ! echo "$@" | grep -q intel_pt ; then | ||
echo "Options must include the Intel PT event e.g. -e intel_pt/pwr_evt,ptw/" | ||
echo "and for power events it probably needs to be system wide i.e. -a option" | ||
echo "For example: -a -e intel_pt/pwr_evt,branch=0/ sleep 1" | ||
exit 1 | ||
fi | ||
perf record $@ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
#!/bin/bash | ||
# description: print Intel PT Power Events and PTWRITE | ||
perf script $@ -s "$PERF_EXEC_PATH"/scripts/python/intel-pt-events.py |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,128 @@ | ||
# intel-pt-events.py: Print Intel PT Power Events and PTWRITE | ||
# Copyright (c) 2017, Intel Corporation. | ||
# | ||
# This program is free software; you can redistribute it and/or modify it | ||
# under the terms and conditions of the GNU General Public License, | ||
# version 2, as published by the Free Software Foundation. | ||
# | ||
# This program is distributed in the hope it will be useful, but WITHOUT | ||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
# more details. | ||
|
||
import os | ||
import sys | ||
import struct | ||
|
||
sys.path.append(os.environ['PERF_EXEC_PATH'] + \ | ||
'/scripts/python/Perf-Trace-Util/lib/Perf/Trace') | ||
|
||
# These perf imports are not used at present | ||
#from perf_trace_context import * | ||
#from Core import * | ||
|
||
def trace_begin(): | ||
print "Intel PT Power Events and PTWRITE" | ||
|
||
def trace_end(): | ||
print "End" | ||
|
||
def trace_unhandled(event_name, context, event_fields_dict): | ||
print ' '.join(['%s=%s'%(k,str(v))for k,v in sorted(event_fields_dict.items())]) | ||
|
||
def print_ptwrite(raw_buf): | ||
data = struct.unpack_from("<IQ", raw_buf) | ||
flags = data[0] | ||
payload = data[1] | ||
exact_ip = flags & 1 | ||
print "IP: %u payload: %#x" % (exact_ip, payload), | ||
|
||
def print_cbr(raw_buf): | ||
data = struct.unpack_from("<BBBBII", raw_buf) | ||
cbr = data[0] | ||
f = (data[4] + 500) / 1000 | ||
p = ((cbr * 1000 / data[2]) + 5) / 10 | ||
print "%3u freq: %4u MHz (%3u%%)" % (cbr, f, p), | ||
|
||
def print_mwait(raw_buf): | ||
data = struct.unpack_from("<IQ", raw_buf) | ||
payload = data[1] | ||
hints = payload & 0xff | ||
extensions = (payload >> 32) & 0x3 | ||
print "hints: %#x extensions: %#x" % (hints, extensions), | ||
|
||
def print_pwre(raw_buf): | ||
data = struct.unpack_from("<IQ", raw_buf) | ||
payload = data[1] | ||
hw = (payload >> 7) & 1 | ||
cstate = (payload >> 12) & 0xf | ||
subcstate = (payload >> 8) & 0xf | ||
print "hw: %u cstate: %u sub-cstate: %u" % (hw, cstate, subcstate), | ||
|
||
def print_exstop(raw_buf): | ||
data = struct.unpack_from("<I", raw_buf) | ||
flags = data[0] | ||
exact_ip = flags & 1 | ||
print "IP: %u" % (exact_ip), | ||
|
||
def print_pwrx(raw_buf): | ||
data = struct.unpack_from("<IQ", raw_buf) | ||
payload = data[1] | ||
deepest_cstate = payload & 0xf | ||
last_cstate = (payload >> 4) & 0xf | ||
wake_reason = (payload >> 8) & 0xf | ||
print "deepest cstate: %u last cstate: %u wake reason: %#x" % (deepest_cstate, last_cstate, wake_reason), | ||
|
||
def print_common_start(comm, sample, name): | ||
ts = sample["time"] | ||
cpu = sample["cpu"] | ||
pid = sample["pid"] | ||
tid = sample["tid"] | ||
print "%16s %5u/%-5u [%03u] %9u.%09u %7s:" % (comm, pid, tid, cpu, ts / 1000000000, ts %1000000000, name), | ||
|
||
def print_common_ip(sample, symbol, dso): | ||
ip = sample["ip"] | ||
print "%16x %s (%s)" % (ip, symbol, dso) | ||
|
||
def process_event(param_dict): | ||
event_attr = param_dict["attr"] | ||
sample = param_dict["sample"] | ||
raw_buf = param_dict["raw_buf"] | ||
comm = param_dict["comm"] | ||
name = param_dict["ev_name"] | ||
|
||
# Symbol and dso info are not always resolved | ||
if (param_dict.has_key("dso")): | ||
dso = param_dict["dso"] | ||
else: | ||
dso = "[unknown]" | ||
|
||
if (param_dict.has_key("symbol")): | ||
symbol = param_dict["symbol"] | ||
else: | ||
symbol = "[unknown]" | ||
|
||
if name == "ptwrite": | ||
print_common_start(comm, sample, name) | ||
print_ptwrite(raw_buf) | ||
print_common_ip(sample, symbol, dso) | ||
elif name == "cbr": | ||
print_common_start(comm, sample, name) | ||
print_cbr(raw_buf) | ||
print_common_ip(sample, symbol, dso) | ||
elif name == "mwait": | ||
print_common_start(comm, sample, name) | ||
print_mwait(raw_buf) | ||
print_common_ip(sample, symbol, dso) | ||
elif name == "pwre": | ||
print_common_start(comm, sample, name) | ||
print_pwre(raw_buf) | ||
print_common_ip(sample, symbol, dso) | ||
elif name == "exstop": | ||
print_common_start(comm, sample, name) | ||
print_exstop(raw_buf) | ||
print_common_ip(sample, symbol, dso) | ||
elif name == "pwrx": | ||
print_common_start(comm, sample, name) | ||
print_pwrx(raw_buf) | ||
print_common_ip(sample, symbol, dso) |