#include "evlist.h"
 #include "expr.h"
 #include "metricgroup.h"
+#include "cgroup.h"
 #include <linux/zalloc.h>
 
 /*
        enum stat_type type;
        int ctx;
        int cpu;
+       struct cgroup *cgrp;
        struct runtime_stat *stat;
        struct stats stats;
        u64 metric_total;
        if (a->ctx != b->ctx)
                return a->ctx - b->ctx;
 
+       if (a->cgrp != b->cgrp)
+               return (char *)a->cgrp < (char *)b->cgrp ? -1 : +1;
+
        if (a->evsel == NULL && b->evsel == NULL) {
                if (a->stat == b->stat)
                        return 0;
                                              bool create,
                                              enum stat_type type,
                                              int ctx,
-                                             struct runtime_stat *st)
+                                             struct runtime_stat *st,
+                                             struct cgroup *cgrp)
 {
        struct rblist *rblist;
        struct rb_node *nd;
                .type = type,
                .ctx = ctx,
                .stat = st,
+               .cgrp = cgrp,
        };
 
        rblist = &st->value_list;
 
 struct runtime_stat_data {
        int ctx;
+       struct cgroup *cgrp;
 };
 
 static void update_runtime_stat(struct runtime_stat *st,
                                struct runtime_stat_data *rsd)
 {
        struct saved_value *v = saved_value_lookup(NULL, cpu, true, type,
-                                                  rsd->ctx, st);
+                                                  rsd->ctx, st, rsd->cgrp);
 
        if (v)
                update_stats(&v->stats, count);
        struct saved_value *v;
        struct runtime_stat_data rsd = {
                .ctx = evsel_context(counter),
+               .cgrp = counter->cgrp,
        };
 
        count *= counter->scale;
                update_runtime_stat(st, STAT_APERF, cpu, count, &rsd);
 
        if (counter->collect_stat) {
-               v = saved_value_lookup(counter, cpu, true, STAT_NONE, 0, st);
+               v = saved_value_lookup(counter, cpu, true, STAT_NONE, 0, st,
+                                      rsd.cgrp);
                update_stats(&v->stats, count);
                if (counter->metric_leader)
                        v->metric_total += count;
        } else if (counter->metric_leader) {
                v = saved_value_lookup(counter->metric_leader,
-                                      cpu, true, STAT_NONE, 0, st);
+                                      cpu, true, STAT_NONE, 0, st, rsd.cgrp);
                v->metric_total += count;
                v->metric_other++;
        }
 {
        struct saved_value *v;
 
-       v = saved_value_lookup(NULL, cpu, false, type, rsd->ctx, st);
+       v = saved_value_lookup(NULL, cpu, false, type, rsd->ctx, st, rsd->cgrp);
        if (!v)
                return 0.0;
 
 {
        struct saved_value *v;
 
-       v = saved_value_lookup(NULL, cpu, false, type, rsd->ctx, st);
+       v = saved_value_lookup(NULL, cpu, false, type, rsd->ctx, st, rsd->cgrp);
        if (!v)
                return 0.0;
 
                        scale = 1e-9;
                } else {
                        v = saved_value_lookup(metric_events[i], cpu, false,
-                                              STAT_NONE, 0, st);
+                                              STAT_NONE, 0, st,
+                                              metric_events[i]->cgrp);
                        if (!v)
                                break;
                        stats = &v->stats;
        const char *color = NULL;
        struct runtime_stat_data rsd = {
                .ctx = evsel_context(evsel),
+               .cgrp = evsel->cgrp,
        };
        struct metric_event *me;
        int num = 1;