Message ID | 20191111180549.12166-7-ggherdovich@suse.cz (mailing list archive) |
---|---|
State | Superseded, archived |
Headers | show |
Series | Add support for frequency invariance for (some) x86 | expand |
On Wed, 2019-11-13 at 05:28 +0800, kbuild test robot wrote: > Hi Giovanni, > > Thank you for the patch! Yet something to improve: > > [auto build test ERROR on tip/sched/core] > [cannot apply to v5.4-rc7 next-20191111] > [if your patch is applied to the wrong git tree, please drop us a note to help > improve the system. BTW, we also suggest to use '--base' option to specify the > base tree in git format-patch, please see https://stackoverflow.com/a/37406982] > > url: https://github.com/0day-ci/linux/commits/Giovanni-Gherdovich/Add-support-for-frequency-invariance-for-some-x86/20191113-035438 > base: https://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git a0e813f26ebcb25c0b5e504498fbd796cca1a4ba > config: i386-randconfig-e001-201945 (attached as .config) > compiler: gcc-7 (Debian 7.4.0-14) 7.4.0 > reproduce: > # save the attached .config to linux build tree > make ARCH=i386 > > If you fix the issue, kindly add following tag > Reported-by: kbuild test robot <lkp@intel.com> > > All errors (new ones prefixed by >>): > > drivers/cpufreq/intel_pstate.c: In function 'intel_pstate_update_limits': > > > drivers/cpufreq/intel_pstate.c:925:3: error: implicit declaration of function 'set_arch_max_freq' [-Werror=implicit-function-declaration] > > set_arch_max_freq(global.turbo_disabled); > ^~~~~~~~~~~~~~~~~ > cc1: some warnings being treated as errors > Good bot. I'm defining the function set_arch_max_freq only if CONFIG_SMP, I forgot to provide a definition (with empty body) in the other case. Resending. Giovanni > vim +/set_arch_max_freq +925 drivers/cpufreq/intel_pstate.c > > 913 > 914 static void intel_pstate_update_limits(unsigned int cpu) > 915 { > 916 mutex_lock(&intel_pstate_driver_lock); > 917 > 918 update_turbo_state(); > 919 /* > 920 * If turbo has been turned on or off globally, policy limits for > 921 * all CPUs need to be updated to reflect that. > 922 */ > 923 if (global.turbo_disabled_mf != global.turbo_disabled) { > 924 global.turbo_disabled_mf = global.turbo_disabled; > > 925 set_arch_max_freq(global.turbo_disabled); > 926 for_each_possible_cpu(cpu) > 927 intel_pstate_update_max_freq(cpu); > 928 } else { > 929 cpufreq_update_policy(cpu); > 930 } > 931 > 932 mutex_unlock(&intel_pstate_driver_lock); > 933 } > 934 > > --- > 0-DAY kernel test infrastructure Open Source Technology Center > https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org Intel Corporation
diff --git a/arch/x86/include/asm/topology.h b/arch/x86/include/asm/topology.h index 9b3aca463c8f..5c36fa1a6f3e 100644 --- a/arch/x86/include/asm/topology.h +++ b/arch/x86/include/asm/topology.h @@ -214,6 +214,8 @@ static inline long arch_scale_freq_capacity(int cpu) extern void arch_scale_freq_tick(void); #define arch_scale_freq_tick arch_scale_freq_tick +extern void set_arch_max_freq(bool turbo_disabled); + #endif #endif /* _ASM_X86_TOPOLOGY_H */ diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c index 8988177064be..f94aa1dfc778 100644 --- a/arch/x86/kernel/smpboot.c +++ b/arch/x86/kernel/smpboot.c @@ -1807,8 +1807,15 @@ DEFINE_STATIC_KEY_FALSE(arch_scale_freq_key); static DEFINE_PER_CPU(u64, arch_prev_aperf); static DEFINE_PER_CPU(u64, arch_prev_mperf); +static u64 arch_max_turbo_freq = SCHED_CAPACITY_SCALE; static u64 arch_max_freq = SCHED_CAPACITY_SCALE; +void set_arch_max_freq(bool turbo_disabled) +{ + arch_max_freq = turbo_disabled ? SCHED_CAPACITY_SCALE : + arch_max_turbo_freq; +} + static bool turbo_disabled(void) { u64 misc_en; @@ -2004,9 +2011,6 @@ static void intel_set_cpu_max_freq(void) { u64 ratio = 1, turbo_ratio = 1; - if (turbo_disabled()) - return; - if (slv_set_cpu_max_freq(&ratio, &turbo_ratio)) goto set_value; @@ -2022,7 +2026,9 @@ static void intel_set_cpu_max_freq(void) core_set_cpu_max_freq(&ratio, &turbo_ratio); set_value: - arch_max_freq = div_u64(turbo_ratio * SCHED_CAPACITY_SCALE, ratio); + arch_max_turbo_freq = div_u64(turbo_ratio * SCHED_CAPACITY_SCALE, + ratio); + set_arch_max_freq(turbo_disabled()); static_branch_enable(&arch_scale_freq_key); } diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c index 8ab31702cf6a..6bf50783bc24 100644 --- a/drivers/cpufreq/intel_pstate.c +++ b/drivers/cpufreq/intel_pstate.c @@ -922,6 +922,7 @@ static void intel_pstate_update_limits(unsigned int cpu) */ if (global.turbo_disabled_mf != global.turbo_disabled) { global.turbo_disabled_mf = global.turbo_disabled; + set_arch_max_freq(global.turbo_disabled); for_each_possible_cpu(cpu) intel_pstate_update_max_freq(cpu); } else {
On some platforms such as the Dell XPS 13 laptop the firmware disables turbo when the machine is disconnected from AC, and viceversa it enables it again when it's reconnected. In these cases a _PPC ACPI notification is issued. The scheduler needs to know freq_max for frequency-invariant calculations. To account for turbo availability to come and go, record freq_max at boot as if turbo was available and store it in a helper variable. Use a setter function to swap between 1024 and freq_max every time turbo goes off or on. Reminder: "freq_max" isn't really the maximum frequency but the ratio turbo_freq*1024/base_freq, which becomes 1024 when turbo is disabled. The name could be misleading but makes explainations a lot simpler and is really convenient in calculations. Signed-off-by: Giovanni Gherdovich <ggherdovich@suse.cz> --- arch/x86/include/asm/topology.h | 2 ++ arch/x86/kernel/smpboot.c | 14 ++++++++++---- drivers/cpufreq/intel_pstate.c | 1 + 3 files changed, 13 insertions(+), 4 deletions(-)