|
@@ -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 = {
|
|
|
- .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);
|
|
|
+ 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 = {
|