1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- #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
|