lkml.org 
[lkml]   [2015]   [Sep]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 34/45] perf stat report: Add support to initialize aggr_map from file
    Date
    Using perf.data's perf_env data to initialize
    aggregate config.

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

    diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
    index 5a5221437208..6e84794cae00 100644
    --- a/tools/perf/builtin-stat.c
    +++ b/tools/perf/builtin-stat.c
    @@ -1194,6 +1194,89 @@ static int perf_stat_init_aggr_mode(void)
    return cpus_aggr_map ? 0 : -ENOMEM;
    }

    +static inline int perf_env__get_cpu(struct perf_env *env, struct cpu_map *map, int idx)
    +{
    + int cpu;
    +
    + if (idx > map->nr)
    + return -1;
    +
    + cpu = map->map[idx];
    +
    + if (cpu >= env->nr_cpus_online)
    + return -1;
    +
    + return cpu;
    +}
    +
    +static int perf_env__get_socket(struct cpu_map *map, int idx, void *data)
    +{
    + struct perf_env *env = data;
    + int cpu = perf_env__get_cpu(env, map, idx);
    +
    + return cpu == -1 ? -1 : env->cpu[cpu].socket_id;
    +}
    +
    +static int perf_env__get_core(struct cpu_map *map, int idx, void *data)
    +{
    + struct perf_env *env = data;
    + int cpu = perf_env__get_cpu(env, map, idx);
    +
    + return cpu == -1 ? -1 : env->cpu[cpu].core_id;
    +}
    +
    +static int perf_env__build_socket_map(struct perf_env *env, struct cpu_map *cpus,
    + struct cpu_map **sockp)
    +{
    + return cpu_map__build_map(cpus, sockp, perf_env__get_socket, env);
    +}
    +
    +static int perf_env__build_core_map(struct perf_env *env, struct cpu_map *cpus,
    + struct cpu_map **corep)
    +{
    + return cpu_map__build_map(cpus, corep, perf_env__get_core, env);
    +}
    +
    +static int perf_stat__get_socket_file(struct cpu_map *map, int idx)
    +{
    + return perf_env__get_socket(map, idx, &perf_stat.session->header.env);
    +}
    +
    +static int perf_stat__get_core_file(struct cpu_map *map, int idx)
    +{
    + return perf_env__get_core(map, idx, &perf_stat.session->header.env);
    +}
    +
    +static int perf_stat_init_aggr_mode_file(struct perf_stat *stat)
    +{
    + struct perf_env *env = &stat->session->header.env;
    +
    + switch (stat_config.aggr_mode) {
    + case AGGR_SOCKET:
    + if (perf_env__build_socket_map(env, evsel_list->cpus, &aggr_map)) {
    + perror("cannot build socket map");
    + return -1;
    + }
    + aggr_get_id = perf_stat__get_socket_file;
    + break;
    + case AGGR_CORE:
    + if (perf_env__build_core_map(env, evsel_list->cpus, &aggr_map)) {
    + perror("cannot build core map");
    + return -1;
    + }
    + aggr_get_id = perf_stat__get_core_file;
    + break;
    + case AGGR_NONE:
    + case AGGR_GLOBAL:
    + case AGGR_THREAD:
    + case AGGR_UNSET:
    + default:
    + break;
    + }
    +
    + return 0;
    +}
    +
    /*
    * Add default attributes, if there were no attributes specified or
    * if -d/--detailed, -d -d or -d -d -d is used:
    @@ -1407,7 +1490,15 @@ int process_stat_config_event(struct perf_tool *tool __maybe_unused,
    union perf_event *event,
    struct perf_session *session __maybe_unused)
    {
    + struct perf_stat *stat = container_of(tool, struct perf_stat, tool);
    +
    perf_event__read_stat_config(&stat_config, &event->stat_config);
    +
    + if (perf_stat.file.is_pipe)
    + perf_stat_init_aggr_mode();
    + else
    + perf_stat_init_aggr_mode_file(stat);
    +
    return 0;
    }

    --
    2.4.3


    \
     
     \ /
      Last update: 2015-09-30 16:41    [W:6.449 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site