Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fe5c7cc2 authored by Paul Menage's avatar Paul Menage Committed by Ingo Molnar
Browse files

sched: 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

[ mingo@elte.hu: style cleanups. ]

Signed-off-by: default avatarPaul Menage <menage@google.com>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent ae8393e5
Loading
Loading
Loading
Loading
+33 −5
Original line number Diff line number Diff line
@@ -7211,15 +7211,43 @@ static u64 cpu_shares_read_uint(struct cgroup *cgrp, struct cftype *cft)
	return (u64) tg->shares;
}

static struct cftype cpu_shares = {
static u64 cpu_usage_read(struct cgroup *cgrp, struct cftype *cft)
{
	struct task_group *tg = cgroup_tg(cgrp);
	unsigned long flags;
	u64 res = 0;
	int i;

	for_each_possible_cpu(i) {
		/*
		 * 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 = {