lkml.org 
[lkml]   [2015]   [Jul]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 41/47] perf script: Process cpu/threads maps
    Date
    Adding processing of cpu/threads maps. Configuring session's
    evlist with these maps.

    Link: http://lkml.kernel.org/n/tip-s3txa1u2qv3bi8uspp4hi7al@git.kernel.org
    Signed-off-by: Jiri Olsa <jolsa@kernel.org>
    ---
    tools/perf/builtin-script.c | 65 +++++++++++++++++++++++++++++++++++++++++++++
    1 file changed, 65 insertions(+)

    diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c
    index 308c022ae918..051177d5daed 100644
    --- a/tools/perf/builtin-script.c
    +++ b/tools/perf/builtin-script.c
    @@ -17,7 +17,10 @@
    #include "util/sort.h"
    #include "util/data.h"
    #include "util/auxtrace.h"
    +#include "util/cpumap.h"
    +#include "util/thread_map.h"
    #include <linux/bitmap.h>
    +#include "asm/bug.h"

    static char const *script_name;
    static char const *generate_script_lang;
    @@ -623,6 +626,9 @@ struct perf_script {
    struct perf_session *session;
    bool show_task_events;
    bool show_mmap_events;
    + bool allocated;
    + struct cpu_map *cpus;
    + struct thread_map *threads;
    };

    static int process_attr(struct perf_tool *tool, union perf_event *event,
    @@ -1535,6 +1541,62 @@ static int have_cmd(int argc, const char **argv)
    return 0;
    }

    +static int set_maps(struct perf_script *script)
    +{
    + struct perf_evlist *evlist = script->session->evlist;
    +
    + if (!script->cpus || !script->threads)
    + return 0;
    +
    + if (WARN_ONCE(script->allocated, "stats double allocation\n"))
    + return -EINVAL;
    +
    + if (perf_evlist__set_maps(evlist, script->cpus, script->threads) ||
    + perf_evlist__alloc_stats(evlist, true))
    + return -ENOMEM;
    +
    + script->allocated = true;
    + return 0;
    +}
    +
    +static
    +int process_thread_map_event(struct perf_tool *tool,
    + union perf_event *event,
    + struct perf_session *session __maybe_unused)
    +{
    + struct perf_script *script = container_of(tool, struct perf_script, tool);
    +
    + if (script->threads) {
    + pr_warning("Extra thread map event, ignoring.\n");
    + return 0;
    + }
    +
    + script->threads = thread_map__new_event(&event->thread_map);
    + if (!script->threads)
    + return -ENOMEM;
    +
    + return set_maps(script);
    +}
    +
    +static
    +int process_cpu_map_event(struct perf_tool *tool __maybe_unused,
    + union perf_event *event,
    + struct perf_session *session __maybe_unused)
    +{
    + struct perf_script *script = container_of(tool, struct perf_script, tool);
    +
    + if (script->cpus) {
    + pr_warning("Extra cpu map event, ignoring.\n");
    + return 0;
    + }
    +
    + script->cpus = cpu_map__new_event(&event->cpu_map);
    + if (!script->cpus)
    + return -ENOMEM;
    +
    + return set_maps(script);
    +}
    +
    int cmd_script(int argc, const char **argv, const char *prefix __maybe_unused)
    {
    bool show_full_info = false;
    @@ -1563,6 +1625,8 @@ int cmd_script(int argc, const char **argv, const char *prefix __maybe_unused)
    .auxtrace_info = perf_event__process_auxtrace_info,
    .auxtrace = perf_event__process_auxtrace,
    .auxtrace_error = perf_event__process_auxtrace_error,
    + .thread_map = process_thread_map_event,
    + .cpu_map = process_cpu_map_event,
    .ordered_events = true,
    .ordering_requires_timestamps = true,
    },
    @@ -1892,6 +1956,7 @@ int cmd_script(int argc, const char **argv, const char *prefix __maybe_unused)
    flush_scripting();

    out_delete:
    + perf_evlist__free_stats(session->evlist);
    perf_session__delete(session);

    if (script_started)
    --
    2.4.3


    \
     
     \ /
      Last update: 2015-07-21 14:41    [W:2.317 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site