Re: [PATCH 4/4] perf script: Add script to collect and display IBSsamples

From: David Ahern
Date: Thu Dec 15 2011 - 14:19:10 EST



On 12/15/2011 10:23 AM, Robert Richter wrote:
> 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@xxxxxxx>
> ---
> 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(+), 0 deletions(-)
> 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 0000000..dc5f4d2
> --- /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 <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
> index 0000000..f44e69d
> --- /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 0000000..caee32f
> --- /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 <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);
> + }
> +}

Doesn't seem like you are verifying that the tracepoints fed to this
script are actually ibs related. For example, if a user points to the
wrong perf.data which has raw data in it this script would happily parse
and display numbers.

Also, why a perl script versus the builtin dumping capability of
perf-script? e.g., add ibs to the fields and while processing the event
verify that the tracepoint is ibs related.

David
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/