The perf_stat_config.aggr_map should have a correct size of the
aggregation map.  Use it to allocate aggr_counts.
Also AGGR_NONE with per-core events can be tricky because it doesn't
aggreate basically but it needs to do so for per-core events only.
So only per-core evsels will have stats->aggr data.
Note that other caller of evlist__alloc_stat() might not have
stat_config or aggr_map.
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Acked-by: Ian Rogers <irogers@google.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Athira Jajeev <atrajeev@linux.vnet.ibm.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: James Clark <james.clark@arm.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Leo Yan <leo.yan@linaro.org>
Cc: Michael Petlan <mpetlan@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Xing Zhengjun <zhengjun.xing@linux.intel.com>
Link: https://lore.kernel.org/r/20221018020227.85905-9-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
        u64 val;
 
        if (!evsel->stats)
-               evlist__alloc_stats(script->session->evlist, false);
+               evlist__alloc_stats(&stat_config, script->session->evlist, /*alloc_raw=*/false);
        if (evsel_script(leader)->gnum++ == 0)
                perf_stat__reset_shadow_stats();
        val = sample->period * evsel->scale;
 
        perf_evlist__set_maps(&evlist->core, script->cpus, script->threads);
 
-       if (evlist__alloc_stats(evlist, true))
+       if (evlist__alloc_stats(&stat_config, evlist, /*alloc_raw=*/true))
                return -ENOMEM;
 
        script->allocated = true;
 
 
        perf_evlist__set_maps(&evsel_list->core, st->cpus, st->threads);
 
-       if (evlist__alloc_stats(evsel_list, true))
+       if (evlist__alloc_stats(&stat_config, evsel_list, /*alloc_raw=*/true))
                return -ENOMEM;
 
        st->maps_allocated = true;
                goto out;
        }
 
-       if (evlist__alloc_stats(evsel_list, interval))
+       if (perf_stat_init_aggr_mode())
                goto out;
 
-       if (perf_stat_init_aggr_mode())
+       if (evlist__alloc_stats(&stat_config, evsel_list, interval))
                goto out;
 
        /*
 
        if (err)
                goto out;
 
-       err = evlist__alloc_stats(evlist, false);
+       err = evlist__alloc_stats(/*config=*/NULL, evlist, /*alloc_raw=*/false);
        if (err)
                goto out;
 
 
                goto out_err;
        }
 
-       err = evlist__alloc_stats(evlist, false);
+       err = evlist__alloc_stats(/*config=*/NULL, evlist, /*alloc_raw=*/false);
        if (err)
                goto out_err;
        /*
 
        return 0;
 }
 
-int evlist__alloc_stats(struct evlist *evlist, bool alloc_raw)
+int evlist__alloc_stats(struct perf_stat_config *config,
+                       struct evlist *evlist, bool alloc_raw)
 {
        struct evsel *evsel;
+       int nr_aggr = 0;
+
+       if (config && config->aggr_map)
+               nr_aggr = config->aggr_map->nr;
 
        evlist__for_each_entry(evlist, evsel) {
-               if (evsel__alloc_stats(evsel, 0, alloc_raw))
+               if (evsel__alloc_stats(evsel, nr_aggr, alloc_raw))
                        goto out_free;
        }
 
 
                                   struct runtime_stat *st);
 void perf_stat__collect_metric_expr(struct evlist *);
 
-int evlist__alloc_stats(struct evlist *evlist, bool alloc_raw);
+int evlist__alloc_stats(struct perf_stat_config *config,
+                       struct evlist *evlist, bool alloc_raw);
 void evlist__free_stats(struct evlist *evlist);
 void evlist__reset_stats(struct evlist *evlist);
 void evlist__reset_prev_raw_counts(struct evlist *evlist);