On 22-10-20, 09:11, Peter Zijlstra wrote:
> Well, but we need to do something to force people onto schedutil,
> otherwise we'll get more crap like this thread.
> 
> Can we take the choice away? Only let Kconfig select which governors are
> available and then set the default ourselves? I mean, the end goal being
> to not have selectable governors at all, this seems like a good step
> anyway.

Just to clarify and complete the point a bit here, the users can still
pass the default governor from cmdline using
cpufreq.default_governor=, which will take precedence over the one the
below code is playing with. And later once the kernel is up, they can
still choose a different governor from userspace.

> ---
> 
> diff --git a/drivers/cpufreq/Kconfig b/drivers/cpufreq/Kconfig
> index 2c7171e0b001..3a9f54b382c0 100644
> --- a/drivers/cpufreq/Kconfig
> +++ b/drivers/cpufreq/Kconfig
> @@ -34,77 +34,6 @@ config CPU_FREQ_STAT
>  
>         If in doubt, say N.
>  
> -choice
> -     prompt "Default CPUFreq governor"
> -     default CPU_FREQ_DEFAULT_GOV_USERSPACE if ARM_SA1100_CPUFREQ || 
> ARM_SA1110_CPUFREQ
> -     default CPU_FREQ_DEFAULT_GOV_SCHEDUTIL if ARM64 || ARM
> -     default CPU_FREQ_DEFAULT_GOV_SCHEDUTIL if X86_INTEL_PSTATE && SMP
> -     default CPU_FREQ_DEFAULT_GOV_PERFORMANCE
> -     help
> -       This option sets which CPUFreq governor shall be loaded at
> -       startup. If in doubt, use the default setting.
> -
> -config CPU_FREQ_DEFAULT_GOV_PERFORMANCE
> -     bool "performance"
> -     select CPU_FREQ_GOV_PERFORMANCE
> -     help
> -       Use the CPUFreq governor 'performance' as default. This sets
> -       the frequency statically to the highest frequency supported by
> -       the CPU.
> -
> -config CPU_FREQ_DEFAULT_GOV_POWERSAVE
> -     bool "powersave"
> -     select CPU_FREQ_GOV_POWERSAVE
> -     help
> -       Use the CPUFreq governor 'powersave' as default. This sets
> -       the frequency statically to the lowest frequency supported by
> -       the CPU.
> -
> -config CPU_FREQ_DEFAULT_GOV_USERSPACE
> -     bool "userspace"
> -     select CPU_FREQ_GOV_USERSPACE
> -     help
> -       Use the CPUFreq governor 'userspace' as default. This allows
> -       you to set the CPU frequency manually or when a userspace 
> -       program shall be able to set the CPU dynamically without having
> -       to enable the userspace governor manually.
> -
> -config CPU_FREQ_DEFAULT_GOV_ONDEMAND
> -     bool "ondemand"
> -     select CPU_FREQ_GOV_ONDEMAND
> -     select CPU_FREQ_GOV_PERFORMANCE
> -     help
> -       Use the CPUFreq governor 'ondemand' as default. This allows
> -       you to get a full dynamic frequency capable system by simply
> -       loading your cpufreq low-level hardware driver.
> -       Be aware that not all cpufreq drivers support the ondemand
> -       governor. If unsure have a look at the help section of the
> -       driver. Fallback governor will be the performance governor.
> -
> -config CPU_FREQ_DEFAULT_GOV_CONSERVATIVE
> -     bool "conservative"
> -     select CPU_FREQ_GOV_CONSERVATIVE
> -     select CPU_FREQ_GOV_PERFORMANCE
> -     help
> -       Use the CPUFreq governor 'conservative' as default. This allows
> -       you to get a full dynamic frequency capable system by simply
> -       loading your cpufreq low-level hardware driver.
> -       Be aware that not all cpufreq drivers support the conservative
> -       governor. If unsure have a look at the help section of the
> -       driver. Fallback governor will be the performance governor.
> -
> -config CPU_FREQ_DEFAULT_GOV_SCHEDUTIL
> -     bool "schedutil"
> -     depends on SMP
> -     select CPU_FREQ_GOV_SCHEDUTIL
> -     select CPU_FREQ_GOV_PERFORMANCE
> -     help
> -       Use the 'schedutil' CPUFreq governor by default. If unsure,
> -       have a look at the help section of that governor. The fallback
> -       governor will be 'performance'.
> -
> -endchoice
> -
>  config CPU_FREQ_GOV_PERFORMANCE
>       tristate "'performance' governor"
>       help
> @@ -145,6 +74,7 @@ config CPU_FREQ_GOV_USERSPACE
>  config CPU_FREQ_GOV_ONDEMAND
>       tristate "'ondemand' cpufreq policy governor"
>       select CPU_FREQ_GOV_COMMON
> +     select CPU_FREQ_GOV_PERFORMANCE
>       help
>         'ondemand' - This driver adds a dynamic cpufreq policy governor.
>         The governor does a periodic polling and 
> @@ -164,6 +94,7 @@ config CPU_FREQ_GOV_CONSERVATIVE
>       tristate "'conservative' cpufreq governor"
>       depends on CPU_FREQ
>       select CPU_FREQ_GOV_COMMON
> +     select CPU_FREQ_GOV_PERFORMANCE
>       help
>         'conservative' - this driver is rather similar to the 'ondemand'
>         governor both in its source code and its purpose, the difference is
> @@ -188,6 +119,7 @@ config CPU_FREQ_GOV_SCHEDUTIL
>       bool "'schedutil' cpufreq policy governor"
>       depends on CPU_FREQ && SMP
>       select CPU_FREQ_GOV_ATTR_SET
> +     select CPU_FREQ_GOV_PERFORMANCE

And I am not really sure why we always wanted this backup performance
governor to be there unless the said governors are built as module.

>       select IRQ_WORK
>       help
>         This governor makes decisions based on the utilization data provided
> diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
> index 1877f5e2e5b0..6848e3337b65 100644
> --- a/drivers/cpufreq/cpufreq.c
> +++ b/drivers/cpufreq/cpufreq.c
> @@ -626,6 +626,49 @@ static struct cpufreq_governor *find_governor(const char 
> *str_governor)
>       return NULL;
>  }
>  
> +static struct cpufreq_governor *cpufreq_default_governor(void)
> +{
> +     struct cpufreq_governor *gov = NULL;
> +
> +#ifdef CONFIG_CPU_FREQ_GOV_SCHEDUTIL
> +     gov = find_governor("schedutil");
> +     if (gov)
> +             return gov;
> +#endif
> +
> +#ifdef CONFIG_CPU_FREQ_GOV_ONDEMAND
> +     gov = find_governor("ondemand");
> +     if (gov)
> +             return gov;
> +#endif
> +
> +#ifdef CONFIG_CPU_FREQ_GOV_CONSERVATIVE
> +     gov = find_governor("conservative");
> +     if (gov)
> +             return gov;
> +#endif
> +
> +#ifdef CONFIG_CPU_FREQ_GOV_USERSPACE
> +     gov = find_governor("userspace");
> +     if (gov)
> +             return gov;
> +#endif
> +
> +#ifdef CONFIG_CPU_FREQ_GOV_POWERSAVE
> +     gov = find_governor("powersave");
> +     if (gov)
> +             return gov;
> +#endif
> +
> +#ifdef CONFIG_CPU_FREQ_GOV_PERFORMANCE
> +     gov = find_governor("performance");
> +     if (gov)
> +             return gov;
> +#endif
> +
> +     return gov;
> +}

I think that would be fine with me. Though we would be required to
update couple of defconfigs here to make sure they keep working the
way they wanted to.

-- 
viresh

Reply via email to