diff options
Diffstat (limited to 'kernel/sched.c')
-rw-r--r-- | kernel/sched.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/kernel/sched.c b/kernel/sched.c index 59db86c915f9..ebaf432365f6 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
@@ -9196,11 +9196,12 @@ struct cgroup_subsys cpu_cgroup_subsys = { | |||
9196 | * (balbir@in.ibm.com). | 9196 | * (balbir@in.ibm.com). |
9197 | */ | 9197 | */ |
9198 | 9198 | ||
9199 | /* track cpu usage of a group of tasks */ | 9199 | /* track cpu usage of a group of tasks and its child groups */ |
9200 | struct cpuacct { | 9200 | struct cpuacct { |
9201 | struct cgroup_subsys_state css; | 9201 | struct cgroup_subsys_state css; |
9202 | /* cpuusage holds pointer to a u64-type object on every cpu */ | 9202 | /* cpuusage holds pointer to a u64-type object on every cpu */ |
9203 | u64 *cpuusage; | 9203 | u64 *cpuusage; |
9204 | struct cpuacct *parent; | ||
9204 | }; | 9205 | }; |
9205 | 9206 | ||
9206 | struct cgroup_subsys cpuacct_subsys; | 9207 | struct cgroup_subsys cpuacct_subsys; |
@@ -9234,6 +9235,9 @@ static struct cgroup_subsys_state *cpuacct_create( | |||
9234 | return ERR_PTR(-ENOMEM); | 9235 | return ERR_PTR(-ENOMEM); |
9235 | } | 9236 | } |
9236 | 9237 | ||
9238 | if (cgrp->parent) | ||
9239 | ca->parent = cgroup_ca(cgrp->parent); | ||
9240 | |||
9237 | return &ca->css; | 9241 | return &ca->css; |
9238 | } | 9242 | } |
9239 | 9243 | ||
@@ -9313,14 +9317,16 @@ static int cpuacct_populate(struct cgroup_subsys *ss, struct cgroup *cgrp) | |||
9313 | static void cpuacct_charge(struct task_struct *tsk, u64 cputime) | 9317 | static void cpuacct_charge(struct task_struct *tsk, u64 cputime) |
9314 | { | 9318 | { |
9315 | struct cpuacct *ca; | 9319 | struct cpuacct *ca; |
9320 | int cpu; | ||
9316 | 9321 | ||
9317 | if (!cpuacct_subsys.active) | 9322 | if (!cpuacct_subsys.active) |
9318 | return; | 9323 | return; |
9319 | 9324 | ||
9325 | cpu = task_cpu(tsk); | ||
9320 | ca = task_ca(tsk); | 9326 | ca = task_ca(tsk); |
9321 | if (ca) { | ||
9322 | u64 *cpuusage = percpu_ptr(ca->cpuusage, task_cpu(tsk)); | ||
9323 | 9327 | ||
9328 | for (; ca; ca = ca->parent) { | ||
9329 | u64 *cpuusage = percpu_ptr(ca->cpuusage, cpu); | ||
9324 | *cpuusage += cputime; | 9330 | *cpuusage += cputime; |
9325 | } | 9331 | } |
9326 | } | 9332 | } |