static void evsel__reset_stat_priv(struct evsel *evsel)
 {
        struct perf_stat_evsel *ps = evsel->stats;
+       struct perf_stat_aggr *aggr = ps->aggr;
 
        init_stats(&ps->res_stats);
+
+       if (aggr)
+               memset(aggr, 0, sizeof(*aggr) * ps->nr_aggr);
 }
 
-static int evsel__alloc_stat_priv(struct evsel *evsel)
+
+static int evsel__alloc_stat_priv(struct evsel *evsel, int nr_aggr)
 {
-       evsel->stats = zalloc(sizeof(struct perf_stat_evsel));
-       if (evsel->stats == NULL)
+       struct perf_stat_evsel *ps;
+
+       ps = zalloc(sizeof(*ps));
+       if (ps == NULL)
                return -ENOMEM;
+
+       if (nr_aggr) {
+               ps->nr_aggr = nr_aggr;
+               ps->aggr = calloc(nr_aggr, sizeof(*ps->aggr));
+               if (ps->aggr == NULL) {
+                       free(ps);
+                       return -ENOMEM;
+               }
+       }
+
+       evsel->stats = ps;
        perf_stat_evsel_id_init(evsel);
        evsel__reset_stat_priv(evsel);
        return 0;
 {
        struct perf_stat_evsel *ps = evsel->stats;
 
-       if (ps)
+       if (ps) {
+               zfree(&ps->aggr);
                zfree(&ps->group_data);
+       }
        zfree(&evsel->stats);
 }
 
                perf_counts__reset(evsel->prev_raw_counts);
 }
 
-static int evsel__alloc_stats(struct evsel *evsel, bool alloc_raw)
+static int evsel__alloc_stats(struct evsel *evsel, int nr_aggr, bool alloc_raw)
 {
-       if (evsel__alloc_stat_priv(evsel) < 0 ||
+       if (evsel__alloc_stat_priv(evsel, nr_aggr) < 0 ||
            evsel__alloc_counts(evsel) < 0 ||
            (alloc_raw && evsel__alloc_prev_raw_counts(evsel) < 0))
                return -ENOMEM;
        struct evsel *evsel;
 
        evlist__for_each_entry(evlist, evsel) {
-               if (evsel__alloc_stats(evsel, alloc_raw))
+               if (evsel__alloc_stats(evsel, 0, alloc_raw))
                        goto out_free;
        }
 
 
 #include <sys/resource.h>
 #include "cpumap.h"
 #include "rblist.h"
+#include "counts.h"
 
 struct perf_cpu_map;
 struct perf_stat_config;
        PERF_STAT_EVSEL_ID__MAX,
 };
 
+/* hold aggregated event info */
+struct perf_stat_aggr {
+       /* aggregated values */
+       struct perf_counts_values       counts;
+       /* number of entries (CPUs) aggregated */
+       int                             nr;
+       /* whether any entry has failed to read/process event */
+       bool                            failed;
+};
+
+/* per-evsel event stats */
 struct perf_stat_evsel {
+       /* used for repeated runs */
        struct stats             res_stats;
+       /* evsel id for quick check */
        enum perf_stat_evsel_id  id;
+       /* number of allocated 'aggr' */
+       int                      nr_aggr;
+       /* aggregated event values */
+       struct perf_stat_aggr   *aggr;
+       /* used for group read */
        u64                     *group_data;
 };