lkml.org 
[lkml]   [2015]   [Apr]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 20/44] perf inject: Add Instruction Tracing support
    Date
    Add support for decoding an AUX area assuming
    it contains instruction tracing data. The
    AUX area tracing events are stripped and replaced
    by synthesized events.

    Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
    ---
    tools/perf/Documentation/perf-inject.txt | 27 ++++++++++++
    tools/perf/builtin-inject.c | 71 +++++++++++++++++++++++++++++++-
    2 files changed, 96 insertions(+), 2 deletions(-)

    diff --git a/tools/perf/Documentation/perf-inject.txt b/tools/perf/Documentation/perf-inject.txt
    index dc7442c..4465519 100644
    --- a/tools/perf/Documentation/perf-inject.txt
    +++ b/tools/perf/Documentation/perf-inject.txt
    @@ -44,6 +44,33 @@ OPTIONS
    --kallsyms=<file>::
    kallsyms pathname

    +-Z::
    +--itrace::
    + Decode Instruction Tracing data, replacing it with synthesized events.
    + Options are:
    +
    + i synthesize instructions events
    + b synthesize branches events
    + c synthesize branches events (calls only)
    + r synthesize branches events (returns only)
    + e synthesize error events
    + d create a debug log
    + g synthesize a call chain for instructions events
    +
    + The default is all events i.e. the same as -Zibe
    +
    + In addition, the period (default 100000) for instructions events
    + can be specified in units of:
    +
    + i instructions
    + t ticks
    + ms milliseconds
    + us microseconds
    + ns nanoseconds (default)
    +
    + Also the call chain size (default 16, max. 1024) for instructions
    + events can be specified.
    +
    SEE ALSO
    --------
    linkperf:perf-record[1], linkperf:perf-report[1], linkperf:perf-archive[1]
    diff --git a/tools/perf/builtin-inject.c b/tools/perf/builtin-inject.c
    index d4cfa84..fc22249 100644
    --- a/tools/perf/builtin-inject.c
    +++ b/tools/perf/builtin-inject.c
    @@ -16,6 +16,7 @@
    #include "util/debug.h"
    #include "util/build-id.h"
    #include "util/data.h"
    +#include "util/auxtrace.h"

    #include "util/parse-options.h"

    @@ -30,6 +31,7 @@ struct perf_inject {
    struct perf_data_file output;
    u64 bytes_written;
    struct list_head samples;
    + struct itrace_synth_opts itrace_synth_opts;
    };

    struct event_entry {
    @@ -205,6 +207,32 @@ static int perf_event__repipe_fork(struct perf_tool *tool,
    return err;
    }

    +static int perf_event__repipe_comm(struct perf_tool *tool,
    + union perf_event *event,
    + struct perf_sample *sample,
    + struct machine *machine)
    +{
    + int err;
    +
    + err = perf_event__process_comm(tool, event, sample, machine);
    + perf_event__repipe(tool, event, sample, machine);
    +
    + return err;
    +}
    +
    +static int perf_event__repipe_exit(struct perf_tool *tool,
    + union perf_event *event,
    + struct perf_sample *sample,
    + struct machine *machine)
    +{
    + int err;
    +
    + err = perf_event__process_exit(tool, event, sample, machine);
    + perf_event__repipe(tool, event, sample, machine);
    +
    + return err;
    +}
    +
    static int perf_event__repipe_tracing_data(struct perf_tool *tool,
    union perf_event *event,
    struct perf_session *session)
    @@ -217,6 +245,18 @@ static int perf_event__repipe_tracing_data(struct perf_tool *tool,
    return err;
    }

    +static int perf_event__repipe_id_index(struct perf_tool *tool,
    + union perf_event *event,
    + struct perf_session *session)
    +{
    + int err;
    +
    + perf_event__repipe_synth(tool, event);
    + err = perf_event__process_id_index(tool, event, session);
    +
    + return err;
    +}
    +
    static int dso__read_build_id(struct dso *dso)
    {
    if (dso->has_build_id)
    @@ -401,16 +441,20 @@ static int __cmd_inject(struct perf_inject *inject)
    struct perf_session *session = inject->session;
    struct perf_data_file *file_out = &inject->output;
    int fd = perf_data_file__fd(file_out);
    + u64 output_data_offset;

    signal(SIGINT, sig_handler);

    - if (inject->build_ids || inject->sched_stat) {
    + if (inject->build_ids || inject->sched_stat ||
    + inject->itrace_synth_opts.set) {
    inject->tool.mmap = perf_event__repipe_mmap;
    inject->tool.mmap2 = perf_event__repipe_mmap2;
    inject->tool.fork = perf_event__repipe_fork;
    inject->tool.tracing_data = perf_event__repipe_tracing_data;
    }

    + output_data_offset = session->header.data_offset;
    +
    if (inject->build_ids) {
    inject->tool.sample = perf_event__inject_buildid;
    } else if (inject->sched_stat) {
    @@ -429,10 +473,22 @@ static int __cmd_inject(struct perf_inject *inject)
    else if (!strncmp(name, "sched:sched_stat_", 17))
    evsel->handler = perf_inject__sched_stat;
    }
    + } else if (inject->itrace_synth_opts.set) {
    + session->itrace_synth_opts = &inject->itrace_synth_opts;
    + inject->itrace_synth_opts.inject = true;
    + inject->tool.comm = perf_event__repipe_comm;
    + inject->tool.exit = perf_event__repipe_exit;
    + inject->tool.id_index = perf_event__repipe_id_index;
    + inject->tool.auxtrace_info = perf_event__process_auxtrace_info;
    + inject->tool.auxtrace = perf_event__process_auxtrace;
    + inject->tool.ordered_events = true;
    + inject->tool.ordering_requires_timestamps = true;
    + /* Allow space in the header for new attributes */
    + output_data_offset = 4096;
    }

    if (!file_out->is_pipe)
    - lseek(fd, session->header.data_offset, SEEK_SET);
    + lseek(fd, output_data_offset, SEEK_SET);

    ret = perf_session__process_events(session);

    @@ -440,6 +496,14 @@ static int __cmd_inject(struct perf_inject *inject)
    if (inject->build_ids)
    perf_header__set_feat(&session->header,
    HEADER_BUILD_ID);
    + /*
    + * The AUX areas have been removed and replaced with
    + * synthesized hardware events, so clear the feature flag.
    + */
    + if (inject->itrace_synth_opts.set)
    + perf_header__clear_feat(&session->header,
    + HEADER_AUXTRACE);
    + session->header.data_offset = output_data_offset;
    session->header.data_size = inject->bytes_written;
    perf_session__write_header(session, session->evlist, fd, true);
    }
    @@ -497,6 +561,9 @@ int cmd_inject(int argc, const char **argv, const char *prefix __maybe_unused)
    OPT_STRING(0, "kallsyms", &symbol_conf.kallsyms_name, "file",
    "kallsyms pathname"),
    OPT_BOOLEAN('f', "force", &file.force, "don't complain, do it"),
    + OPT_CALLBACK_OPTARG('Z', "itrace", &inject.itrace_synth_opts,
    + NULL, "opts", "Instruction Tracing options",
    + itrace_parse_synth_opts),
    OPT_END()
    };
    const char * const inject_usage[] = {
    --
    1.9.1


    \
     
     \ /
      Last update: 2015-04-09 18:42    [W:4.051 / U:0.292 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site