| Peter Zijlstra | 47fe38f | 2009-09-02 13:49:18 +0200 | [diff] [blame] | 1 | #include <linux/sched.h> | 
|  | 2 | #include <linux/math64.h> | 
|  | 3 | #include <linux/percpu.h> | 
|  | 4 | #include <linux/irqflags.h> | 
|  | 5 |  | 
|  | 6 | #include <asm/cpufeature.h> | 
|  | 7 | #include <asm/processor.h> | 
|  | 8 |  | 
|  | 9 | #ifdef CONFIG_SMP | 
|  | 10 |  | 
| Peter Zijlstra | 7c423e9 | 2009-09-16 09:38:24 +0200 | [diff] [blame] | 11 | static DEFINE_PER_CPU(struct aperfmperf, old_perf_sched); | 
| Peter Zijlstra | 47fe38f | 2009-09-02 13:49:18 +0200 | [diff] [blame] | 12 |  | 
|  | 13 | static unsigned long scale_aperfmperf(void) | 
|  | 14 | { | 
| Peter Zijlstra | 7c423e9 | 2009-09-16 09:38:24 +0200 | [diff] [blame] | 15 | struct aperfmperf val, *old = &__get_cpu_var(old_perf_sched); | 
| Peter Zijlstra | 47fe38f | 2009-09-02 13:49:18 +0200 | [diff] [blame] | 16 | unsigned long ratio, flags; | 
|  | 17 |  | 
|  | 18 | local_irq_save(flags); | 
|  | 19 | get_aperfmperf(&val); | 
|  | 20 | local_irq_restore(flags); | 
|  | 21 |  | 
|  | 22 | ratio = calc_aperfmperf_ratio(old, &val); | 
|  | 23 | *old = val; | 
|  | 24 |  | 
|  | 25 | return ratio; | 
|  | 26 | } | 
|  | 27 |  | 
|  | 28 | unsigned long arch_scale_freq_power(struct sched_domain *sd, int cpu) | 
|  | 29 | { | 
|  | 30 | /* | 
|  | 31 | * do aperf/mperf on the cpu level because it includes things | 
|  | 32 | * like turbo mode, which are relevant to full cores. | 
|  | 33 | */ | 
|  | 34 | if (boot_cpu_has(X86_FEATURE_APERFMPERF)) | 
|  | 35 | return scale_aperfmperf(); | 
|  | 36 |  | 
|  | 37 | /* | 
|  | 38 | * maybe have something cpufreq here | 
|  | 39 | */ | 
|  | 40 |  | 
|  | 41 | return default_scale_freq_power(sd, cpu); | 
|  | 42 | } | 
|  | 43 |  | 
|  | 44 | unsigned long arch_scale_smt_power(struct sched_domain *sd, int cpu) | 
|  | 45 | { | 
|  | 46 | /* | 
|  | 47 | * aperf/mperf already includes the smt gain | 
|  | 48 | */ | 
|  | 49 | if (boot_cpu_has(X86_FEATURE_APERFMPERF)) | 
|  | 50 | return SCHED_LOAD_SCALE; | 
|  | 51 |  | 
|  | 52 | return default_scale_smt_power(sd, cpu); | 
|  | 53 | } | 
|  | 54 |  | 
|  | 55 | #endif |