scheduler: cpuacct: Enable platform callbacks for cpuacct power tracking

Platform must register cpu power function that return power in
milliWatt seconds.

Change-Id: I1caa0335e316c352eee3b1ddf326fcd4942bcbe8
Signed-off-by: Mike Chan <mike@android.com>
This commit is contained in:
Mike Chan 2010-05-12 15:52:14 -07:00 committed by Colin Cross
parent c69233f554
commit be17d1d867
3 changed files with 28 additions and 3 deletions

View File

@ -44,6 +44,9 @@ cpuacct.cpufreq file gives CPU time (in nanoseconds) spent at each CPU
frequency. Platform hooks must be implemented inorder to properly track
time at each CPU frequency.
cpuacct.power file gives CPU power consumed (in milliWatt seconds). Platform
must provide and implement power callback functions.
cpuacct controller uses percpu_counter interface to collect user and
system times. This has two side effects:

View File

@ -31,7 +31,9 @@ struct cpuacct_charge_calls {
*/
void (*init) (void **cpuacct_data);
void (*charge) (void *cpuacct_data, u64 cputime, unsigned int cpu);
void (*show) (void *cpuacct_data, struct cgroup_map_cb *cb);
void (*cpufreq_show) (void *cpuacct_data, struct cgroup_map_cb *cb);
/* Returns power consumed in milliWatt seconds */
u64 (*power_usage) (void *cpuacct_data);
};
int cpuacct_charge_register(struct cpuacct_charge_calls *fn);

View File

@ -9140,12 +9140,28 @@ static int cpuacct_cpufreq_show(struct cgroup *cgrp, struct cftype *cft,
struct cgroup_map_cb *cb)
{
struct cpuacct *ca = cgroup_ca(cgrp);
if (ca->cpufreq_fn && ca->cpufreq_fn->show)
ca->cpufreq_fn->show(ca->cpuacct_data, cb);
if (ca->cpufreq_fn && ca->cpufreq_fn->cpufreq_show)
ca->cpufreq_fn->cpufreq_show(ca->cpuacct_data, cb);
return 0;
}
/* return total cpu power usage (milliWatt second) of a group */
static u64 cpuacct_powerusage_read(struct cgroup *cgrp, struct cftype *cft)
{
int i;
struct cpuacct *ca = cgroup_ca(cgrp);
u64 totalpower = 0;
if (ca->cpufreq_fn && ca->cpufreq_fn->power_usage)
for_each_present_cpu(i) {
totalpower += ca->cpufreq_fn->power_usage(
ca->cpuacct_data);
}
return totalpower;
}
static struct cftype files[] = {
{
.name = "usage",
@ -9164,6 +9180,10 @@ static struct cftype files[] = {
.name = "cpufreq",
.read_map = cpuacct_cpufreq_show,
},
{
.name = "power",
.read_u64 = cpuacct_powerusage_read
},
};
static int cpuacct_populate(struct cgroup_subsys *ss, struct cgroup *cgrp)