lkml.org 
[lkml]   [2010]   [Dec]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH -tip 3/7] perf bts: Introduce new sub command 'perf bts trace'
    Date
    Introduce new sub command 'perf bts trace'.
    This command can parse and print bts log recorded by
    'perf bts record'.

    Usage:
    - First, record the bts log 'perf bts record <command>'
    - Second, parse and print bts log 'perf bts trace'

    Output:
    0xffffffff8146fe0e => 0x0000003806200b20
    0x0000003806200b23 => 0x0000003806204910
    0xffffffff8146fe0e => 0x0000003806204910
    0xffffffff8146fe0e => 0x0000003806204936
    0xffffffff8146fe0e => 0x000000380620493d
    0x0000003806204981 => 0x00000038062049a3
    0x00000038062049a7 => 0x0000003806204988
    ...

    Signed-off-by: Akihiro Nagai <akihiro.nagai.hw@hitachi.com>
    Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Paul Mackerras <paulus@samba.org>
    Cc: Ingo Molnar <mingo@elte.hu>
    Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
    Cc: linux-kernel@vger.kernel.org
    ---

    tools/perf/Documentation/perf-bts.txt | 14 ++++++--
    tools/perf/builtin-bts.c | 59 +++++++++++++++++++++++++++++++--
    2 files changed, 67 insertions(+), 6 deletions(-)

    diff --git a/tools/perf/Documentation/perf-bts.txt b/tools/perf/Documentation/perf-bts.txt
    index 55a2fe6..5920dcc 100644
    --- a/tools/perf/Documentation/perf-bts.txt
    +++ b/tools/perf/Documentation/perf-bts.txt
    @@ -3,22 +3,30 @@ perf-bts(1)

    NAME
    ----
    -perf-bts - Record branch-trace-store log
    +perf-bts - Record and print branch-trace-store log

    SYNOPSIS
    --------
    [verse]
    -'perf bts' record <command>
    +'perf bts' [<options>] {record|trace}

    DESCRIPTION
    -----------
    -This command can record branch-trace-store log.
    +This command can record and print branch-trace-store log.
    Branch-trace-store is a facility of processors. It can record
    address of branch to/from on every branch instruction and interrupt.

    'perf bts record <command>' records branch-trace-store log while specified
    command is executing. And, save to the file "perf.data".

    +'perf bts trace' parses recorded branch-trace-store log and prints it.
    +
    +OPTIONS
    +-------
    +-i::
    +--input=::
    + Specify input file name to analyze.
    +
    SEE ALSO
    --------
    linkperf:perf-record[1]
    diff --git a/tools/perf/builtin-bts.c b/tools/perf/builtin-bts.c
    index 587cfad..54e83af 100644
    --- a/tools/perf/builtin-bts.c
    +++ b/tools/perf/builtin-bts.c
    @@ -1,10 +1,25 @@
    #include "builtin.h"
    #include "perf.h"
    #include "util/parse-options.h"
    +#include "util/session.h"
    +#include "util/cache.h"
    +#include <inttypes.h>
    +
    +/* format string of specifying min width to print address */
    +#if __WORDSIZE == 32
    +#define FMT_ADDR_WIDTH "10" /* length of "0x" + 32bit address */
    +#else
    +#define FMT_ADDR_WIDTH "18" /* length of "0x" + 64bit address */
    +#endif
    +/* format string to print address */
    +#define FMT_ADDR "%#0" FMT_ADDR_WIDTH "llx"
    +
    +/* default input file name to analyze */
    +static const char *input_name = "perf.data";

    static const char * const bts_usage[] = {
    - "perf bts record <command>",
    - NULL,
    + "perf bts [<options>] {record|trace}",
    + NULL
    };

    /* arguments to call 'perf record' */
    @@ -16,11 +31,45 @@ static const char * const record_args[] = {
    "-d",
    };

    -/* dummy struct option to call parse_options() */
    static const struct option bts_options[] = {
    + OPT_STRING('i', "input", &input_name, "file", "input file name"),
    OPT_END()
    };

    +static int process_sample_event(event_t *event, struct perf_session *session)
    +{
    + struct sample_data data;
    +
    + memset(&data, 0, sizeof(data));
    + event__parse_sample(event, session->sample_type, &data);
    +
    + /* data.ip is 'from address', data.addr is 'to address' */
    + printf(FMT_ADDR " => " FMT_ADDR "\n", data.ip, data.addr);
    +
    + return 0;
    +}
    +
    +static struct perf_event_ops event_ops = {
    + .sample = process_sample_event,
    + .ordered_samples = false,
    +};
    +
    +static int __cmd_trace(void)
    +{
    + struct perf_session *session;
    +
    + session = perf_session__new(input_name, O_RDONLY, 0, false);
    + if (!session) {
    + fprintf(stderr, "failed to create perf_session.\n");
    + return -ENOMEM;
    + }
    +
    + perf_session__process_events(session, &event_ops);
    + perf_session__delete(session);
    +
    + return 0;
    +}
    +
    static int __cmd_record(int argc, const char **argv)
    {
    unsigned int rec_argc, i, j;
    @@ -55,6 +104,10 @@ int cmd_bts(int argc, const char **argv, const char *prefix __used)

    if (!strncmp(argv[0], "record", 6))
    return __cmd_record(argc, argv);
    + else if (!strncmp(argv[0], "trace", 5)) {
    + setup_pager();
    + return __cmd_trace();
    + }
    else
    usage_with_options(bts_usage, bts_options);



    \
     
     \ /
      Last update: 2010-12-03 05:03    [W:0.028 / U:120.012 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site