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 11static DEFINE_PER_CPU(struct aperfmperf, old_perf_sched); 12 13static unsigned long scale_aperfmperf(void) 14{ 15 struct aperfmperf val, *old = &__get_cpu_var(old_perf_sched); 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 28unsigned 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 44unsigned 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 56