diff options
| author | Peter Zijlstra <a.p.zijlstra@chello.nl> | 2009-09-02 07:28:02 -0400 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2009-09-15 10:51:24 -0400 |
| commit | d6a59aa3a2b1ca8411884c833a313b33b5f76e20 (patch) | |
| tree | 9a4626d9721c79add9eec752a7ff2bd61e5b58a1 /kernel | |
| parent | b8a543ea5a5896830a9969bacfd047f9d15940b2 (diff) | |
sched: Provide arch_scale_freq_power
Provide an ach specific hook for cpufreq based scaling of
cpu_power.
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
[ego@in.ibm.com: spotting bugs]
LKML-Reference: <new-submission>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/sched.c | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/kernel/sched.c b/kernel/sched.c index f0ccb8b926c8..c210321adcb9 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
| @@ -3552,7 +3552,18 @@ static inline int check_power_save_busiest_group(struct sd_lb_stats *sds, | |||
| 3552 | } | 3552 | } |
| 3553 | #endif /* CONFIG_SCHED_MC || CONFIG_SCHED_SMT */ | 3553 | #endif /* CONFIG_SCHED_MC || CONFIG_SCHED_SMT */ |
| 3554 | 3554 | ||
| 3555 | unsigned long __weak arch_scale_smt_power(struct sched_domain *sd, int cpu) | 3555 | |
| 3556 | unsigned long default_scale_freq_power(struct sched_domain *sd, int cpu) | ||
| 3557 | { | ||
| 3558 | return SCHED_LOAD_SCALE; | ||
| 3559 | } | ||
| 3560 | |||
| 3561 | unsigned long __weak arch_scale_freq_power(struct sched_domain *sd, int cpu) | ||
| 3562 | { | ||
| 3563 | return default_scale_freq_power(sd, cpu); | ||
| 3564 | } | ||
| 3565 | |||
| 3566 | unsigned long default_scale_smt_power(struct sched_domain *sd, int cpu) | ||
| 3556 | { | 3567 | { |
| 3557 | unsigned long weight = cpumask_weight(sched_domain_span(sd)); | 3568 | unsigned long weight = cpumask_weight(sched_domain_span(sd)); |
| 3558 | unsigned long smt_gain = sd->smt_gain; | 3569 | unsigned long smt_gain = sd->smt_gain; |
| @@ -3562,6 +3573,11 @@ unsigned long __weak arch_scale_smt_power(struct sched_domain *sd, int cpu) | |||
| 3562 | return smt_gain; | 3573 | return smt_gain; |
| 3563 | } | 3574 | } |
| 3564 | 3575 | ||
| 3576 | unsigned long __weak arch_scale_smt_power(struct sched_domain *sd, int cpu) | ||
| 3577 | { | ||
| 3578 | return default_scale_smt_power(sd, cpu); | ||
| 3579 | } | ||
| 3580 | |||
| 3565 | unsigned long scale_rt_power(int cpu) | 3581 | unsigned long scale_rt_power(int cpu) |
| 3566 | { | 3582 | { |
| 3567 | struct rq *rq = cpu_rq(cpu); | 3583 | struct rq *rq = cpu_rq(cpu); |
| @@ -3586,7 +3602,8 @@ static void update_cpu_power(struct sched_domain *sd, int cpu) | |||
| 3586 | unsigned long power = SCHED_LOAD_SCALE; | 3602 | unsigned long power = SCHED_LOAD_SCALE; |
| 3587 | struct sched_group *sdg = sd->groups; | 3603 | struct sched_group *sdg = sd->groups; |
| 3588 | 3604 | ||
| 3589 | /* here we could scale based on cpufreq */ | 3605 | power *= arch_scale_freq_power(sd, cpu); |
| 3606 | power >>= SCHED_LOAD_SHIFT; | ||
| 3590 | 3607 | ||
| 3591 | if ((sd->flags & SD_SHARE_CPUPOWER) && weight > 1) { | 3608 | if ((sd->flags & SD_SHARE_CPUPOWER) && weight > 1) { |
| 3592 | power *= arch_scale_smt_power(sd, cpu); | 3609 | power *= arch_scale_smt_power(sd, cpu); |
