lkml.org 
[lkml]   [2022]   [Oct]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 11/20] perf stat: Aggregate per-thread stats using evsel->stats->aggr
    Date
    Per-thread aggregation doesn't use the CPU numbers but the logic should
    be the same. Initialize cpu_aggr_map separately for AGGR_THREAD and use
    thread map idx to aggregate counter values.

    Acked-by: Ian Rogers <irogers@google.com>
    Signed-off-by: Namhyung Kim <namhyung@kernel.org>
    ---
    tools/perf/builtin-stat.c | 31 +++++++++++++++++++++++++++++++
    tools/perf/util/stat.c | 24 ++++++++++++++++++++++--
    2 files changed, 53 insertions(+), 2 deletions(-)

    diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
    index abede56d79b6..6777fef0d56c 100644
    --- a/tools/perf/builtin-stat.c
    +++ b/tools/perf/builtin-stat.c
    @@ -1465,6 +1465,21 @@ static int perf_stat_init_aggr_mode(void)
    stat_config.aggr_get_id = aggr_mode__get_id(stat_config.aggr_mode);
    }

    + if (stat_config.aggr_mode == AGGR_THREAD) {
    + nr = perf_thread_map__nr(evsel_list->core.threads);
    + stat_config.aggr_map = cpu_aggr_map__empty_new(nr);
    + if (stat_config.aggr_map == NULL)
    + return -ENOMEM;
    +
    + for (int s = 0; s < nr; s++) {
    + struct aggr_cpu_id id = aggr_cpu_id__empty();
    +
    + id.thread_idx = s;
    + stat_config.aggr_map->map[s] = id;
    + }
    + return 0;
    + }
    +
    /*
    * The evsel_list->cpus is the base we operate on,
    * taking the highest cpu number to be the size of
    @@ -1674,6 +1689,22 @@ static int perf_stat_init_aggr_mode_file(struct perf_stat *st)
    aggr_cpu_id_get_t get_id = aggr_mode__get_aggr_file(stat_config.aggr_mode);
    bool needs_sort = stat_config.aggr_mode != AGGR_NONE;

    + if (stat_config.aggr_mode == AGGR_THREAD) {
    + int nr = perf_thread_map__nr(evsel_list->core.threads);
    +
    + stat_config.aggr_map = cpu_aggr_map__empty_new(nr);
    + if (stat_config.aggr_map == NULL)
    + return -ENOMEM;
    +
    + for (int s = 0; s < nr; s++) {
    + struct aggr_cpu_id id = aggr_cpu_id__empty();
    +
    + id.thread_idx = s;
    + stat_config.aggr_map->map[s] = id;
    + }
    + return 0;
    + }
    +
    if (!get_id)
    return 0;

    diff --git a/tools/perf/util/stat.c b/tools/perf/util/stat.c
    index dc075d5a0f72..5b04c9d16156 100644
    --- a/tools/perf/util/stat.c
    +++ b/tools/perf/util/stat.c
    @@ -422,6 +422,24 @@ process_counter_values(struct perf_stat_config *config, struct evsel *evsel,
    evsel__compute_deltas(evsel, cpu_map_idx, thread, count);
    perf_counts_values__scale(count, config->scale, NULL);

    + if (config->aggr_mode == AGGR_THREAD) {
    + struct perf_counts_values *aggr_counts = &ps->aggr[thread].counts;
    +
    + /*
    + * Skip value 0 when enabling --per-thread globally,
    + * otherwise too many 0 output.
    + */
    + if (count->val == 0 && config->system_wide)
    + return 0;
    +
    + ps->aggr[thread].nr++;
    +
    + aggr_counts->val += count->val;
    + aggr_counts->ena += count->ena;
    + aggr_counts->run += count->run;
    + goto update;
    + }
    +
    if (ps->aggr) {
    struct perf_cpu cpu = perf_cpu_map__cpu(evsel->core.cpus, cpu_map_idx);
    struct aggr_cpu_id aggr_id = config->aggr_get_id(config, cpu);
    @@ -436,8 +454,9 @@ process_counter_values(struct perf_stat_config *config, struct evsel *evsel,
    ps_aggr->nr++;

    /*
    - * When any result is bad, make them all to give
    - * consistent output in interval mode.
    + * When any result is bad, make them all to give consistent output
    + * in interval mode. But per-task counters can have 0 enabled time
    + * when some tasks are idle.
    */
    if (evsel__count_has_error(evsel, count, config) && !ps_aggr->failed) {
    ps_aggr->counts.val = 0;
    @@ -455,6 +474,7 @@ process_counter_values(struct perf_stat_config *config, struct evsel *evsel,
    }
    }

    +update:
    switch (config->aggr_mode) {
    case AGGR_THREAD:
    case AGGR_CORE:
    --
    2.38.0.413.g74048e4d9e-goog
    \
     
     \ /
      Last update: 2022-10-18 04:05    [W:4.296 / U:0.792 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site