diff options
Diffstat (limited to 'kernel/cgroup/rstat.c')
| -rw-r--r-- | kernel/cgroup/rstat.c | 12 | 
1 files changed, 10 insertions, 2 deletions
diff --git a/kernel/cgroup/rstat.c b/kernel/cgroup/rstat.c index 2542c21b6b6d..d80d7a608141 100644 --- a/kernel/cgroup/rstat.c +++ b/kernel/cgroup/rstat.c @@ -344,6 +344,7 @@ static void cgroup_base_stat_flush(struct cgroup *cgrp, int cpu)  {  	struct cgroup_rstat_cpu *rstatc = cgroup_rstat_cpu(cgrp, cpu);  	struct cgroup *parent = cgroup_parent(cgrp); +	struct cgroup_rstat_cpu *prstatc;  	struct cgroup_base_stat delta;  	unsigned seq; @@ -357,17 +358,24 @@ static void cgroup_base_stat_flush(struct cgroup *cgrp, int cpu)  		delta = rstatc->bstat;  	} while (__u64_stats_fetch_retry(&rstatc->bsync, seq)); -	/* propagate percpu delta to global */ +	/* propagate per-cpu delta to cgroup and per-cpu global statistics */  	cgroup_base_stat_sub(&delta, &rstatc->last_bstat);  	cgroup_base_stat_add(&cgrp->bstat, &delta);  	cgroup_base_stat_add(&rstatc->last_bstat, &delta); +	cgroup_base_stat_add(&rstatc->subtree_bstat, &delta); -	/* propagate global delta to parent (unless that's root) */ +	/* propagate cgroup and per-cpu global delta to parent (unless that's root) */  	if (cgroup_parent(parent)) {  		delta = cgrp->bstat;  		cgroup_base_stat_sub(&delta, &cgrp->last_bstat);  		cgroup_base_stat_add(&parent->bstat, &delta);  		cgroup_base_stat_add(&cgrp->last_bstat, &delta); + +		delta = rstatc->subtree_bstat; +		prstatc = cgroup_rstat_cpu(parent, cpu); +		cgroup_base_stat_sub(&delta, &rstatc->last_subtree_bstat); +		cgroup_base_stat_add(&prstatc->subtree_bstat, &delta); +		cgroup_base_stat_add(&rstatc->last_subtree_bstat, &delta);  	}  }  |