sched: add hierarchical accounting to cpu accounting controller

Impact: improve CPU time accounting of tasks under the cpu accounting controller

Add hierarchical accounting to cpu accounting controller and include
cpuacct documentation.

Currently, while charging the task's cputime to its accounting group,
the accounting group hierarchy isn't updated. This patch charges the cputime
of a task to its accounting group and all its parent accounting groups.

Reported-by: Srivatsa Vaddagiri <[email protected]>
Signed-off-by: Bharata B Rao <[email protected]>
Reviewed-by: Paul Menage <[email protected]>
Acked-by: Balbir Singh <[email protected]>
Acked-by: Peter Zijlstra <[email protected]>
Signed-off-by: Ingo Molnar <[email protected]>
This commit is contained in:
Bharata B Rao 2008-11-10 20:41:13 +05:30 • committed by Ingo Molnar
commit 934352f214
2 changed files with 41 additions and 3 deletions

View file

@ -9196,11 +9196,12 @@ struct cgroup_subsys cpu_cgroup_subsys = {
* (balbir@in.ibm.com).
*/
/* track cpu usage of a group of tasks */
/* track cpu usage of a group of tasks and its child groups */
struct cpuacct {
struct cgroup_subsys_state css;
/* cpuusage holds pointer to a u64-type object on every cpu */
u64 *cpuusage;
struct cpuacct *parent;
};
struct cgroup_subsys cpuacct_subsys;
@ -9234,6 +9235,9 @@ static struct cgroup_subsys_state *cpuacct_create(
return ERR_PTR(-ENOMEM);
}
if (cgrp->parent)
ca->parent = cgroup_ca(cgrp->parent);
return &ca->css;
}
@ -9313,14 +9317,16 @@ static int cpuacct_populate(struct cgroup_subsys *ss, struct cgroup *cgrp)
static void cpuacct_charge(struct task_struct *tsk, u64 cputime)
{
struct cpuacct *ca;
int cpu;
if (!cpuacct_subsys.active)
return;
cpu = task_cpu(tsk);
ca = task_ca(tsk);
if (ca) {
u64 *cpuusage = percpu_ptr(ca->cpuusage, task_cpu(tsk));
for (; ca; ca = ca->parent) {
u64 *cpuusage = percpu_ptr(ca->cpuusage, cpu);
*cpuusage += cputime;
}
}