arm: Enable max freq invariant scheduler load-tracking and capacity support
authorDietmar Eggemann <dietmar.eggemann@arm.com>
Wed, 23 Sep 2015 16:59:55 +0000 (17:59 +0100)
committerLeo Yan <leo.yan@linaro.org>
Tue, 10 May 2016 08:49:54 +0000 (16:49 +0800)
Maximum Frequency Invariance has to be part of Cpu Invariance because
Frequency Invariance deals only with differences in load-tracking
introduces by Dynamic Frequency Scaling and not with limiting the
possible range of cpu frequency.

By placing Maximum Frequency Invariance into Cpu Invariance,
load-tracking is scaled via arch_scale_cpu_capacity()
in __update_load_avg() and cpu capacity is scaled via
arch_scale_cpu_capacity() in update_cpu_capacity().

To be able to save the extra multiplication in the scheduler hotpath
(__update_load_avg()) we could:

 1 Inform cpufreq about base cpu capacity at boot and let it handle
   scale_cpu_capacity() as well.
 2 Use the cpufreq policy callback which would update a per-cpu current
   cpu_scale and this value would be return in scale_cpu_capacity().
 3 Use per-cpu current max_freq_scale and current cpu_scale with the
   current patch.

Signed-off-by: Dietmar Eggemann <dietmar.eggemann@arm.com>
arch/arm/kernel/topology.c

index da1c611a3b5e313e8da0e18b954143f8b4b184ce..0308342def8c1b149fc423674fd0f21e2c25e9b8 100644 (file)
@@ -44,7 +44,13 @@ static DEFINE_PER_CPU(unsigned long, cpu_scale);
 
 unsigned long scale_cpu_capacity(struct sched_domain *sd, int cpu)
 {
+#if CONFIG_CPU_FREQ
+       unsigned long max_freq_scale = cpufreq_scale_max_freq_capacity(cpu);
+
+       return per_cpu(cpu_scale, cpu) * max_freq_scale >> SCHED_CAPACITY_SHIFT;
+#else
        return per_cpu(cpu_scale, cpu);
+#endif
 }
 
 static void set_capacity_scale(unsigned int cpu, unsigned long capacity)