From ae37b620f43f6916e747d2bfb0e556e99d9727fa Mon Sep 17 00:00:00 2001 From: Robert Richter Date: Wed, 14 Dec 2011 17:16:40 +0100 Subject: [PATCH] perf script: Add script to collect and display IBS samples This patch adds a script to collect and display IBS samples. There are the following options: perf script ibs [ibs_op|ibs_fetch] [-c period] Examples for usage: perf script ibs ibs_op perf script ibs ibs_fetch perf script record ibs ibs_op -c 500000 perf script report ibs perf script record ibs ibs_op -c 500000 | perf script report ibs Signed-off-by: Robert Richter --- tools/perf/scripts/perl/bin/ibs-record | 23 +++++++++++++ tools/perf/scripts/perl/bin/ibs-report | 6 ++++ tools/perf/scripts/perl/ibs.pl | 47 ++++++++++++++++++++++++++ 3 files changed, 76 insertions(+) create mode 100644 tools/perf/scripts/perl/bin/ibs-record create mode 100644 tools/perf/scripts/perl/bin/ibs-report create mode 100644 tools/perf/scripts/perl/ibs.pl diff --git a/tools/perf/scripts/perl/bin/ibs-record b/tools/perf/scripts/perl/bin/ibs-record new file mode 100644 index 000000000000..dc5f4d272a6d --- /dev/null +++ b/tools/perf/scripts/perl/bin/ibs-record @@ -0,0 +1,23 @@ +#! /bin/bash + +while [ "${1+defined}" ]; do + case $1 in + ibs_op|ibs_fetch) + EVENT=$1 + shift + break + ;; + -*) + REC_OPT+=($1) + shift + ;; + *) + echo $0 "$@" >&2 + echo "Invalid option: $1" >&2 + echo "perf script ibs [ibs_op|ibs_fetch] [-c ]" >&2 + exit 1 + ;; + esac +done + +perf record -e ${EVENT:-ibs_op}:r0 -c 100000 -R -a "${REC_OPT[@]}" "$@" diff --git a/tools/perf/scripts/perl/bin/ibs-report b/tools/perf/scripts/perl/bin/ibs-report new file mode 100644 index 000000000000..f44e69d76e00 --- /dev/null +++ b/tools/perf/scripts/perl/bin/ibs-report @@ -0,0 +1,6 @@ +#! /bin/bash + +# description: collect and display AMD IBS samples +# args: [ibs_op|ibs_fetch] [-c period] + +perf script -s "$PERF_EXEC_PATH"/scripts/perl/ibs.pl "$@" diff --git a/tools/perf/scripts/perl/ibs.pl b/tools/perf/scripts/perl/ibs.pl new file mode 100644 index 000000000000..caee32f0c6aa --- /dev/null +++ b/tools/perf/scripts/perl/ibs.pl @@ -0,0 +1,47 @@ +# +# ibs.pl - perf script for AMD Instruction Based Sampling +# +# Copyright (C) 2011 Advanced Micro Devices, Inc., Robert Richter +# +# For licencing details see kernel-base/COPYING +# +# description: collect and display AMD IBS samples +# args: [ibs_op|ibs_fetch] [-c period] +# +# examples: +# +# perf script ibs ibs_op +# perf script ibs ibs_fetch +# perf script record ibs ibs_op -c 500000 +# perf script report ibs +# perf script record ibs ibs_op -c 500000 | perf script report ibs +# + +# Packed byte string args of process_event(): +# +# $event: union perf_event util/event.h +# $attr: struct perf_event_attr linux/perf_event.h +# $sample: struct perf_sample util/event.h +# $raw_data: perf_sample->raw_data util/event.h + +sub process_event +{ + my ($event, $attr, $sample, $raw_data) = @_; + + my ($type) = (unpack("LSS", $event))[0]; + my ($sample_type) = (unpack("LLQQQQQLLQQ", $attr))[4]; + my ($cpu, $raw_size) = (unpack("QLLQQQQQLL", $sample))[8, 9]; + my ($caps, @ibs_data) = unpack("LQ*", $raw_data); + + return if (!$raw_size); # no raw data + + if (scalar(@ibs_data) == 3) { + printf("IBS_FETCH sample on cpu%d\tIBS0: 0x%016x IBS1: 0x%016x IBS2:0x%016x\n", + $cpu, @ibs_data); + } else { + printf("IBS_OP sample on cpu%d\t" . + "\t IBS0: 0x%016x IBS1: 0x%016x IBS2: 0x%016x\n" . + "\tIBS3: 0x%016x IBS4: 0x%016x IBS5: 0x%016x IBS6: 0x%016x\n", + cpu, @ibs_data); + } +} -- 2.39.5