mirror of
https://github.com/torvalds/linux.git
synced 2026-06-09 07:03:37 +02:00
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:
parent
c69233f554
commit
be17d1d867
|
|
@ -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:
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user