| #include <linux/sched.h> | 
 | #include <linux/math64.h> | 
 | #include <linux/percpu.h> | 
 | #include <linux/irqflags.h> | 
 |  | 
 | #include <asm/cpufeature.h> | 
 | #include <asm/processor.h> | 
 |  | 
 | #ifdef CONFIG_SMP | 
 |  | 
 | static DEFINE_PER_CPU(struct aperfmperf, old_perf_sched); | 
 |  | 
 | static unsigned long scale_aperfmperf(void) | 
 | { | 
 | 	struct aperfmperf val, *old = &__get_cpu_var(old_perf_sched); | 
 | 	unsigned long ratio, flags; | 
 |  | 
 | 	local_irq_save(flags); | 
 | 	get_aperfmperf(&val); | 
 | 	local_irq_restore(flags); | 
 |  | 
 | 	ratio = calc_aperfmperf_ratio(old, &val); | 
 | 	*old = val; | 
 |  | 
 | 	return ratio; | 
 | } | 
 |  | 
 | unsigned long arch_scale_freq_power(struct sched_domain *sd, int cpu) | 
 | { | 
 | 	/* | 
 | 	 * do aperf/mperf on the cpu level because it includes things | 
 | 	 * like turbo mode, which are relevant to full cores. | 
 | 	 */ | 
 | 	if (boot_cpu_has(X86_FEATURE_APERFMPERF)) | 
 | 		return scale_aperfmperf(); | 
 |  | 
 | 	/* | 
 | 	 * maybe have something cpufreq here | 
 | 	 */ | 
 |  | 
 | 	return default_scale_freq_power(sd, cpu); | 
 | } | 
 |  | 
 | unsigned long arch_scale_smt_power(struct sched_domain *sd, int cpu) | 
 | { | 
 | 	/* | 
 | 	 * aperf/mperf already includes the smt gain | 
 | 	 */ | 
 | 	if (boot_cpu_has(X86_FEATURE_APERFMPERF)) | 
 | 		return SCHED_LOAD_SCALE; | 
 |  | 
 | 	return default_scale_smt_power(sd, cpu); | 
 | } | 
 |  | 
 | #endif |