alistair23-linux/drivers/cpufreq
Stratos Karafotis dfa5bb6225 cpufreq: ondemand: Change the calculation of target frequency
The ondemand governor calculates load in terms of frequency and
increases it only if load_freq is greater than up_threshold
multiplied by the current or average frequency.  This appears to
produce oscillations of frequency between min and max because,
for example, a relatively small load can easily saturate minimum
frequency and lead the CPU to the max.  Then, it will decrease
back to the min due to small load_freq.

Change the calculation method of load and target frequency on the
basis of the following two observations:

 - Load computation should not depend on the current or average
   measured frequency.  For example, absolute load of 80% at 100MHz
   is not necessarily equivalent to 8% at 1000MHz in the next
   sampling interval.

 - It should be possible to increase the target frequency to any
   value present in the frequency table proportional to the absolute
   load, rather than to the max only, so that:

   Target frequency = C * load

   where we take C = policy->cpuinfo.max_freq / 100.

Tested on Intel i7-3770 CPU @ 3.40GHz and on Quad core 1500MHz Krait.
Phoronix benchmark of Linux Kernel Compilation 3.1 test shows an
increase ~1.5% in performance. cpufreq_stats (time_in_state) shows
that middle frequencies are used more, with this patch.  Highest
and lowest frequencies were used less by ~9%.

[rjw: We have run multiple other tests on kernels with this
 change applied and in the vast majority of cases it turns out
 that the resulting performance improvement also leads to reduced
 consumption of energy.  The change is additionally justified by
 the overall simplification of the code in question.]

Signed-off-by: Stratos Karafotis <stratosk@semaphore.gr>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
2013-07-26 01:06:43 +02:00
..
acpi-cpufreq.c Merge branch 'pm-cpufreq' 2013-06-29 15:04:07 +02:00
amd_freq_sensitivity.c cpufreq: AMD "frequency sensitivity feedback" powersave bias for ondemand governor 2013-04-10 13:19:26 +02:00
arm_big_little.c cpufreq: arm-big-little: call CPUFREQ_POSTCHANGE notfier in error cases 2013-06-24 18:18:58 +05:30
arm_big_little.h cpufreq: ARM big LITTLE: Move cpu_to_cluster() to arm_big_little.h 2013-05-12 14:04:15 +02:00
arm_big_little_dt.c cpufreq: arm_big_little_dt: Instantiate as platform_driver 2013-05-22 12:43:33 +02:00
at32ap-cpufreq.c cpufreq: AVR32: move cpufreq driver to drivers/cpufreq 2013-04-10 13:19:25 +02:00
blackfin-cpufreq.c cpufreq: rename index as driver_data in cpufreq_frequency_table 2013-06-04 14:25:59 +02:00
cpufreq-cpu0.c cpufreq: cpufreq-cpu0: use the exact frequency for clk_set_rate() 2013-06-05 13:51:29 +02:00
cpufreq-nforce2.c cpufreq: drivers: Remove unnecessary assignments of policy-> members 2013-04-02 15:26:32 +02:00
cpufreq.c Power management and ACPI fixes for 3.11-rc2 2013-07-19 09:59:06 -07:00
cpufreq_conservative.c cpufreq: conservative: Use an inline function to evaluate freq_target 2013-04-01 01:11:36 +02:00
cpufreq_governor.c cpufreq: ondemand: Change the calculation of target frequency 2013-07-26 01:06:43 +02:00
cpufreq_governor.h cpufreq: ondemand: Change the calculation of target frequency 2013-07-26 01:06:43 +02:00
cpufreq_ondemand.c cpufreq: ondemand: Change the calculation of target frequency 2013-07-26 01:06:43 +02:00
cpufreq_performance.c cpufreq: Fix minor formatting issues 2013-06-21 01:06:34 +02:00
cpufreq_powersave.c cpufreq: Fix minor formatting issues 2013-06-21 01:06:34 +02:00
cpufreq_stats.c Power management and ACPI fixes for 3.11-rc2 2013-07-19 09:59:06 -07:00
cpufreq_userspace.c cpufreq: Fix minor formatting issues 2013-06-21 01:06:34 +02:00
cris-artpec3-cpufreq.c cpufreq: cris: move cpufreq driver to drivers/cpufreq 2013-04-10 13:19:25 +02:00
cris-etraxfs-cpufreq.c cpufreq: cris: move cpufreq driver to drivers/cpufreq 2013-04-10 13:19:25 +02:00
davinci-cpufreq.c cpufreq: davinci: call CPUFREQ_POSTCHANGE notfier in error cases 2013-06-24 18:18:58 +05:30
dbx500-cpufreq.c cpufreq: delete __cpuinit usage from all cpufreq files 2013-07-14 19:36:57 -04:00
e_powersaver.c cpufreq: e_powersaver: call CPUFREQ_POSTCHANGE notfier in error cases 2013-06-24 13:19:27 +02:00
elanfreq.c cpufreq: Notify all policy->cpus in cpufreq_notify_transition() 2013-04-02 15:24:00 +02:00
exynos-cpufreq.c cpufreq: exynos: call CPUFREQ_POSTCHANGE notfier in error cases 2013-06-24 18:18:59 +05:30
exynos-cpufreq.h arm-soc: cleanups 2013-02-21 14:58:40 -08:00
exynos4x12-cpufreq.c arm-soc: cleanups 2013-02-21 14:58:40 -08:00
exynos4210-cpufreq.c arm-soc: cleanups 2013-02-21 14:58:40 -08:00
exynos5250-cpufreq.c arm-soc: cleanups 2013-02-21 14:58:40 -08:00
exynos5440-cpufreq.c cpufreq: exynos5440: Protect OPP search calls with RCU lock 2013-04-22 00:24:37 +02:00
freq_table.c cpufreq: rename index as driver_data in cpufreq_frequency_table 2013-06-04 14:25:59 +02:00
gx-suspmod.c cpufreq: Notify all policy->cpus in cpufreq_notify_transition() 2013-04-02 15:24:00 +02:00
highbank-cpufreq.c cpufreq: highbank: do not initialize array with a loop 2013-03-04 14:23:11 +01:00
ia64-acpi-cpufreq.c cpufreq: rename index as driver_data in cpufreq_frequency_table 2013-06-04 14:25:59 +02:00
imx6q-cpufreq.c cpufreq: imx6q: call CPUFREQ_POSTCHANGE notfier in error cases 2013-06-24 18:19:00 +05:30
integrator-cpufreq.c cpufreq: integrator: move cpufreq driver to drivers/cpufreq 2013-04-08 13:02:31 +02:00
intel_pstate.c cpufreq: delete __cpuinit usage from all cpufreq files 2013-07-14 19:36:57 -04:00
Kconfig cpufreq: Fix incorrect dependecies for ARM SA11xx drivers 2013-05-12 14:04:16 +02:00
Kconfig.arm Power management and ACPI updates for 3.11-rc1 2013-07-03 14:35:40 -07:00
Kconfig.powerpc Merge branch 'pm-cpufreq-assorted' into pm-cpufreq 2013-06-27 21:46:45 +02:00
Kconfig.x86 cpufreq: X86_AMD_FREQ_SENSITIVITY: select CPU_FREQ_TABLE 2013-06-18 13:53:11 +05:30
kirkwood-cpufreq.c cpufreq: rename index as driver_data in cpufreq_frequency_table 2013-06-04 14:25:59 +02:00
longhaul.c cpufreq: delete __cpuinit usage from all cpufreq files 2013-07-14 19:36:57 -04:00
longhaul.h cpufreq: delete __cpuinit usage from all cpufreq files 2013-07-14 19:36:57 -04:00
longrun.c cpufreq: delete __cpuinit usage from all cpufreq files 2013-07-14 19:36:57 -04:00
loongson2_cpufreq.c cpufreq: rename index as driver_data in cpufreq_frequency_table 2013-06-04 14:25:59 +02:00
Makefile Power management and ACPI updates for 3.11-rc1 2013-07-03 14:35:40 -07:00
maple-cpufreq.c cpufreq: Notify all policy->cpus in cpufreq_notify_transition() 2013-04-02 15:24:00 +02:00
mperf.c [CPUFREQ] Move x86 drivers to drivers/cpufreq/ 2011-05-19 18:51:07 -04:00
mperf.h [CPUFREQ] Move x86 drivers to drivers/cpufreq/ 2011-05-19 18:51:07 -04:00
omap-cpufreq.c cpufreq: delete __cpuinit usage from all cpufreq files 2013-07-14 19:36:57 -04:00
p4-clockmod.c cpufreq: rename index as driver_data in cpufreq_frequency_table 2013-06-04 14:25:59 +02:00
pasemi-cpufreq.c cpufreq: powerpc: move cpufreq driver to drivers/cpufreq 2013-06-07 13:44:39 +02:00
pcc-cpufreq.c cpufreq: pcc: call CPUFREQ_POSTCHANGE notfier in error cases 2013-06-24 13:26:39 +02:00
pmac32-cpufreq.c cpufreq: powerpc: move cpufreq driver to drivers/cpufreq 2013-06-07 13:44:39 +02:00
pmac64-cpufreq.c cpufreq: powerpc: move cpufreq driver to drivers/cpufreq 2013-06-07 13:44:39 +02:00
powernow-k6.c cpufreq: rename index as driver_data in cpufreq_frequency_table 2013-06-04 14:25:59 +02:00
powernow-k7.c cpufreq: delete __cpuinit usage from all cpufreq files 2013-07-14 19:36:57 -04:00
powernow-k7.h [CPUFREQ] Move x86 drivers to drivers/cpufreq/ 2011-05-19 18:51:07 -04:00
powernow-k8.c cpufreq: delete __cpuinit usage from all cpufreq files 2013-07-14 19:36:57 -04:00
powernow-k8.h cpufreq: Remove support for hardware P-state chips from powernow-k8 2012-09-09 22:05:30 +02:00
ppc-corenet-cpufreq.c cpufreq: powerpc: Add cpufreq driver for Freescale e500mc SoCs 2013-06-05 14:19:28 +02:00
ppc_cbe_cpufreq.c cpufreq: rename index as driver_data in cpufreq_frequency_table 2013-06-04 14:25:59 +02:00
ppc_cbe_cpufreq.h cpufreq: powerpc/platforms/cell: move cpufreq driver to drivers/cpufreq 2013-04-10 13:19:26 +02:00
ppc_cbe_cpufreq_pervasive.c cpufreq: powerpc/platforms/cell: move cpufreq driver to drivers/cpufreq 2013-04-10 13:19:26 +02:00
ppc_cbe_cpufreq_pmi.c cpufreq: powerpc/platforms/cell: move cpufreq driver to drivers/cpufreq 2013-04-10 13:19:26 +02:00
pxa2xx-cpufreq.c cpufreq: rename index as driver_data in cpufreq_frequency_table 2013-06-04 14:25:59 +02:00
pxa3xx-cpufreq.c cpufreq: rename index as driver_data in cpufreq_frequency_table 2013-06-04 14:25:59 +02:00
s3c24xx-cpufreq-debugfs.c cpufreq: s3c24xx: move cpufreq driver to drivers/cpufreq 2013-05-20 23:04:28 +09:00
s3c24xx-cpufreq.c cpufreq: s3c24xx: rename CONFIG_CPU_FREQ_S3C24XX_DEBUGFS 2013-07-15 01:31:37 +02:00
s3c64xx-cpufreq.c Merge branch 'pm-cpufreq-arm' into pm-cpufreq 2013-06-27 21:47:03 +02:00
s3c2410-cpufreq.c cpufreq: s3c24xx: move cpufreq driver to drivers/cpufreq 2013-05-20 23:04:28 +09:00
s3c2412-cpufreq.c cpufreq: s3c24xx: move cpufreq driver to drivers/cpufreq 2013-05-20 23:04:28 +09:00
s3c2416-cpufreq.c Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial 2013-07-04 11:40:58 -07:00
s3c2440-cpufreq.c cpufreq: s3c24xx: move cpufreq driver to drivers/cpufreq 2013-05-20 23:04:28 +09:00
s5pv210-cpufreq.c cpufreq: Notify all policy->cpus in cpufreq_notify_transition() 2013-04-02 15:24:00 +02:00
sa1100-cpufreq.c cpufreq: sa11x0: move cpufreq driver to drivers/cpufreq 2013-04-10 13:19:24 +02:00
sa1110-cpufreq.c cpufreq: sa11x0: move cpufreq driver to drivers/cpufreq 2013-04-10 13:19:24 +02:00
sc520_freq.c cpufreq: rename index as driver_data in cpufreq_frequency_table 2013-06-04 14:25:59 +02:00
sh-cpufreq.c cpufreq: sh: move cpufreq driver to drivers/cpufreq 2013-04-10 13:19:25 +02:00
sparc-us2e-cpufreq.c cpufreq: rename index as driver_data in cpufreq_frequency_table 2013-06-04 14:25:59 +02:00
sparc-us3-cpufreq.c cpufreq: rename index as driver_data in cpufreq_frequency_table 2013-06-04 14:25:59 +02:00
spear-cpufreq.c cpufreq: rename index as driver_data in cpufreq_frequency_table 2013-06-04 14:25:59 +02:00
speedstep-centrino.c cpufreq: rename index as driver_data in cpufreq_frequency_table 2013-06-04 14:25:59 +02:00
speedstep-ich.c cpufreq: Notify all policy->cpus in cpufreq_notify_transition() 2013-04-02 15:24:00 +02:00
speedstep-lib.c cpufreq: Add support for x86 cpuinfo auto loading v4 2012-01-26 16:49:06 -08:00
speedstep-lib.h [CPUFREQ] Move x86 drivers to drivers/cpufreq/ 2011-05-19 18:51:07 -04:00
speedstep-smi.c cpufreq: Notify all policy->cpus in cpufreq_notify_transition() 2013-04-02 15:24:00 +02:00
tegra-cpufreq.c Merge branch 'pm-cpufreq-arm' into pm-cpufreq 2013-06-27 21:47:03 +02:00
unicore2-cpufreq.c cpufreq: unicore2: move cpufreq driver to drivers/cpufreq 2013-04-10 13:19:26 +02:00