perf-trace-perl(1)
==================

NAME
----
perf-trace-perl - Process trace data with a Perl script

SYNOPSIS
--------
[verse]
'perf trace' [-s [Perl]:script[.pl] ]

DESCRIPTION
-----------

This perf trace option is used to process perf trace data using perf's
built-in Perl interpreter.  It reads and processes the input file and
displays the results of the trace analysis implemented in the given
Perl script, if any.

STARTER SCRIPTS
---------------

You can avoid reading the rest of this document by running 'perf trace
-g perl' in the same directory as an existing perf.data trace file.
That will generate a starter script containing a handler for each of
the event types in the trace file; it simply prints every available
field for each event in the trace file.

You can also look at the existing scripts in
~/libexec/perf-core/scripts/perl for typical examples showing how to
do basic things like aggregate event data, print results, etc.  Also,
the check-perf-trace.pl script, while not interesting for its results,
attempts to exercise all of the main scripting features.

EVENT HANDLERS
--------------

When perf trace is invoked using a trace script, a user-defined
'handler function' is called for each event in the trace.  If there's
no handler function defined for a given event type, the event is
ignored (or passed to a 'trace_handled' function, see below) and the
next event is processed.

Most of the event's field values are passed as arguments to the
handler function; some of the less common ones aren't - those are
available as calls back into the perf executable (see below).

As an example, the following perf record command can be used to record
all sched_wakeup events in the system:

 # perf record -c 1 -f -a -M -R -e sched:sched_wakeup

Traces meant to be processed using a script should be recorded with
the above options: -c 1 says to sample every event, -a to enable
system-wide collection, -M to multiplex the output, and -R to collect
raw samples.

The format file for the sched_wakep event defines the following fields
(see /sys/kernel/debug/tracing/events/sched/sched_wakeup/format):

----
 format:
        field:unsigned short common_type;
        field:unsigned char common_flags;
        field:unsigned char common_preempt_count;
        field:int common_pid;
        field:int common_lock_depth;

        field:char comm[TASK_COMM_LEN];
        field:pid_t pid;
        field:int prio;
        field:int success;
        field:int target_cpu;
----

The handler function for this event would be defined as:

----
sub sched::sched_wakeup
{
   my ($event_name, $context, $common_cpu, $common_secs,
       $common_nsecs, $common_pid, $common_comm,
       $comm, $pid, $prio, $success, $target_cpu) = @_;
}
----

The handler function takes the form subsystem::event_name.

The $common_* arguments in the handler's argument list are the set of
arguments passed to all event handlers; some of the fields correspond
to the common_* fields in the format file, but some are synthesized,
and some of the common_* fields aren't common enough to to be passed
to every event as arguments but are available as library functions.

Here's a brief description of each of the invariant event args:

 $event_name 	  	    the name of the event as text
 $context		    an opaque 'cookie' used in calls back into perf
 $common_cpu		    the cpu the event occurred on
 $common_secs		    the secs portion of the event timestamp
 $common_nsecs		    the nsecs portion of the event timestamp
 $common_pid		    the pid of the current task
 $common_comm		    the name of the current process

All of the remaining fields in the event's format file have
counterparts as handler function arguments of the same name, as can be
seen in the example above.

The above provides the basics needed to directly access every field of
every event in a trace, which covers 90% of what you need to know to
write a useful trace script.  The sections below cover the rest.

SCRIPT LAYOUT
-------------

Every perf trace Perl script should start by setting up a Perl module
search path and 'use'ing a few support modules (see module
descriptions below):

----
 use lib "$ENV{'PERF_EXEC_PATH'}/scripts/perl/Perf-Trace-Util/lib";
 use lib "./Perf-Trace-Util/lib";
 use Perf::Trace::Core;
 use Perf::Trace::Context;
 use Perf::Trace::Util;
----

The rest of the script can contain handler functions and support
functions in any order.

Aside from the event handler functions discussed above, every script
can implement a set of optional functions:

*trace_begin*, if defined, is called before any event is processed and
gives scripts a chance to do setup tasks:

----
 sub trace_begin
 {
 }
----

*trace_end*, if defined, is called after all events have been
 processed and gives scripts a chance to do end-of-script tasks, such
 as display results:

----
sub trace_end
{
}
----

*trace_unhandled*, if defined, is called after for any event that
 doesn't have a handler explicitly defined for it.  The standard set
 of common arguments are passed into it:

----
sub trace_unhandled
{
    my ($event_name, $context, $common_cpu, $common_secs,
        $common_nsecs, $common_pid, $common_comm) = @_;
}
----

The remaining sections provide descriptions of each of the available
built-in perf trace Perl modules and their associated functions.

AVAILABLE MODULES AND FUNCTIONS
-------------------------------

The following sections describe the functions and variables available
via the various Perf::Trace::* Perl modules.  To use the functions and
variables from the given module, add the corresponding 'use
Perf::Trace::XXX' line to your perf trace script.

Perf::Trace::Core Module
~~~~~~~~~~~~~~~~~~~~~~~~

These functions provide some essential functions to user scripts.

The *flag_str* and *symbol_str* functions provide human-readable
strings for flag and symbolic fields.  These correspond to the strings
and values parsed from the 'print fmt' fields of the event format
files:

  flag_str($event_name, $field_name, $field_value) - returns the string represention corresponding to $field_value for the flag field $field_name of event $event_name
  symbol_str($event_name, $field_name, $field_value) - returns the string represention corresponding to $field_value for the symbolic field $field_name of event $event_name

Perf::Trace::Context Module
~~~~~~~~~~~~~~~~~~~~~~~~~~~

Some of the 'common' fields in the event format file aren't all that
common, but need to be made accessible to user scripts nonetheless.

Perf::Trace::Context defines a set of functions that can be used to
access this data in the context of the current event.  Each of these
functions expects a $context variable, which is the same as the
$context variable passed into every event handler as the second
argument.

 common_pc($context) - returns common_preempt count for the current event
 common_flags($context) - returns common_flags for the current event
 common_lock_depth($context) - returns common_lock_depth for the current event

Perf::Trace::Util Module
~~~~~~~~~~~~~~~~~~~~~~~~

Various utility functions for use with perf trace:

  nsecs($secs, $nsecs) - returns total nsecs given secs/nsecs pair
  nsecs_secs($nsecs) - returns whole secs portion given nsecs
  nsecs_nsecs($nsecs) - returns nsecs remainder given nsecs
  nsecs_str($nsecs) - returns printable string in the form secs.nsecs
  avg($total, $n) - returns average given a sum and a total number of values

SEE ALSO
--------
linkperf:perf-trace[1]
