]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
perf script: Add script to collect and display IBS samples
authorRobert Richter <robert.richter@amd.com>
Wed, 14 Dec 2011 16:16:40 +0000 (17:16 +0100)
committerRobert Richter <robert.richter@amd.com>
Thu, 15 Dec 2011 14:17:44 +0000 (15:17 +0100)
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] <command>

Examples for usage:

 perf script ibs ibs_op <command>
 perf script ibs ibs_fetch <command>
 perf script record ibs ibs_op -c 500000 <command>
 perf script report ibs
 perf script record ibs ibs_op -c 500000 <command> | perf script report ibs

Signed-off-by: Robert Richter <robert.richter@amd.com>
tools/perf/scripts/perl/bin/ibs-record [new file with mode: 0644]
tools/perf/scripts/perl/bin/ibs-report [new file with mode: 0644]
tools/perf/scripts/perl/ibs.pl [new file with mode: 0644]

diff --git a/tools/perf/scripts/perl/bin/ibs-record b/tools/perf/scripts/perl/bin/ibs-record
new file mode 100644 (file)
index 0000000..dc5f4d2
--- /dev/null
@@ -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 <period>]" >&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 (file)
index 0000000..f44e69d
--- /dev/null
@@ -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 (file)
index 0000000..caee32f
--- /dev/null
@@ -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 <command>
+#  perf script ibs ibs_fetch <command>
+#  perf script record ibs ibs_op -c 500000 <command>
+#  perf script report ibs
+#  perf script record ibs ibs_op -c 500000 <command> | 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);
+       }
+}