• Tom Zanussi's avatar
    perf trace: Add scripting ops · 956ffd02
    Tom Zanussi authored
    Adds an interface, scripting_ops, that when implemented for a
    particular scripting language enables built-in support for trace
    stream processing using that language.
    
    The interface is designed to enable full-fledged language
    interpreters to be embedded inside the perf executable and
    thereby make the full capabilities of the supported languages
    available for trace processing.
    
    See below for details on the interface.
    
    This patch also adds a couple command-line options to 'perf
    trace':
    
    The -s option option is used to specify the script to be run.
    Script names that can be used with -s take the form:
    
    [language spec:]scriptname[.ext]
    
    Scripting languages register a set of 'language specs' that can
    be used to specify scripts for the registered languages.  The
    specs can be used either as prefixes or extensions.
    
    If [language spec:] is used, the script is taken as a script of
    the matching language regardless of any extension it might have.
     If [language spec:] is not used, [.ext] is used to look up the
    language it corresponds to.  Language specs are case
    insensitive.
    
    e.g. Perl scripts can be specified in the following ways:
    
    Perl:scriptname
    pl:scriptname.py # extension ignored
    PL:scriptname
    scriptname.pl
    scriptname.perl
    
    The -g [language spec] option gives users an easy starting point
    for writing scripts in the specified language.  Scripting
    support for a particular language can implement a
    generate_script() scripting op that outputs an empty (or
    near-empty) set of handlers for all the events contained in a
    given perf.data trace file - this option gives users a direct
    way to access that.
    
    Adding support for a scripting language
    ---------------------------------------
    
    The main thing that needs to be done do add support for a new
    language is to implement the scripting_ops interface:
    
    It consists of the following four functions:
    
        start_script()
        stop_script()
        process_event()
        generate_script()
    
    start_script() is called before any events are processed, and is
    meant to give the scripting language support an opportunity to
    set things up to receive events e.g. create and initialize an
    instance of a language interpreter.
    
    stop_script() is called after all events are processed, and is
    meant to give the scripting language support an opportunity to
    clean up e.g. destroy the interpreter instance, etc.
    
    process_event() is called once for each event and takes as its
    main parameter a pointer to the binary trace event record to be
    processed. The implementation is responsible for picking out the
    binary fields from the event record and sending them to the
    script handler function associated with that event e.g. a
    function derived from the event name it's meant to handle e.g.
    'sched::sched_switch()'.  The 'format' information for trace
    events can be used to parse the binary data and map it into a
    form usable by a given scripting language; see the Perl
    implemention in subsequent patches for one possible way to
    leverage the existing trace format parsing code in perf and map
    that info into specific scripting language types.
    
    generate_script() should generate a ready-to-run script for the
    current set of events in the trace, preferably with bodies that
    print out every field for each event.  Again, look at the Perl
    implementation for clues as to how that can be done.  This is an
    optional, but very useful op.
    
    Support for a given language should also add a language-specific
    setup function and call it from setup_scripting().  The
    language-specific setup function associates the the scripting
    ops for that language with one or more 'language specifiers'
    (see below) using script_spec_register().  When a script name is
    specified on the command line, the scripting ops associated with
    the specified language are used to instantiate and use the
    appropriate interpreter to process the trace stream.
    
    In general, it should be relatively easy to add support for a
    new language, especially if the language implementation supports
    an interface allowing an interpreter to be 'embedded' inside
    another program (in this case the containing program will be
    'perf trace'). If so, it should be relatively straightforward to
    translate trace events into invocations of user-defined script
    functions where e.g. the function name corresponds to the event
    type and the function parameters correspond to the event fields.
     The event and field type information exported by the event
    tracing infrastructure (via the event 'format' files) should be
    enough to parse and send any piece of trace data to the user
    script.  The easiest way to see how this can be done would be to
    look at the Perl implementation contained in
    perf/util/trace-event-perl.c/.h.
    
    There are a couple of other things that aren't covered by the
    scripting_ops or setup interface and are technically optional,
    but should be implemented if possible.  One of these is support
    for 'flag' and 'symbolic' fields e.g. being able to use more
    human-readable values such as 'GFP_KERNEL' or
    HI/BLOCK_IOPOLL/TASKLET in place of raw flag values.  See the
    Perl implementation to see how this can be done. The other thing
    is support for 'calling back' into the perf executable to access
    e.g. uncommon fields not passed by default into handler
    functions, or any metadata the implementation might want to make
    available to users via the language interface.  Again, see the
    Perl implementation for examples.
    Signed-off-by: default avatarTom Zanussi <tzanussi@gmail.com>
    Cc: fweisbec@gmail.com
    Cc: rostedt@goodmis.org
    Cc: anton@samba.org
    Cc: hch@infradead.org
    LKML-Reference: <1259133352-23685-2-git-send-email-tzanussi@gmail.com>
    Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
    956ffd02
builtin-trace.c 7.65 KB