Report usage in CFS cgroup
PATCH 1/1 Report usage in CFS cgroup
Report CPU usage in CFS Cgroup directories
Adds a cpu.usage file to the CFS cgroup that reports CPU usage in milliseconds for that cgroup's tasks
Signed-off-by Paul Menage <[email protected]>
--- kernel/sched.c | 36 +++++++++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-)
kernel/sched.c +31 -5
@@ -7005,15 +7005,41 @@ static u64 cpu_shares_read_uint(struct creturn (u64 ) tg->shares; } -static struct cftype cpu_shares = { - .name ="shares" , - .read_uint = cpu_shares_read_uint, - .write_uint = cpu_shares_write_uint, +static u64 cpu_usage_read (struct cgroup *cgrp,struct cftype *cft) +{ +struct task_group *tg =cgroup_tg (cgrp); +int i; +u64 res =0 ; +for_each_possible_cpu (i) { +unsigned long flags; +/* +* Lock to prevent races with updating 64-bit counters +* on 32-bit arches. +*/ +spin_lock_irqsave (&cpu_rq (i)->lock, flags); + res += tg->se[i]->sum_exec_runtime; +spin_unlock_irqrestore (&cpu_rq (i)->lock, flags); + } +/* Convert from ns to ms */ +do_div (res,1000000 ); +return res; +} + +static struct cftype cpu_files[] = { + { + .name ="shares" , + .read_uint = cpu_shares_read_uint, + .write_uint = cpu_shares_write_uint, + }, + { + .name ="usage" , + .read_uint = cpu_usage_read, + }, };static int cpu_cgroup_populate (struct cgroup_subsys *ss,struct cgroup *cont) { -return cgroup_add_file (cont, ss, &cpu_shares); +return cgroup_add_files (cont, ss, cpu_files,ARRAY_SIZE (cpu_files)); }struct cgroup_subsys cpu_cgroup_subsys = {