Re: [PATCH] sched: Tweak default dynamic preempt mode selection

From: Frederic Weisbecker
Date: Tue Nov 09 2021 - 05:25:07 EST


On Fri, Nov 05, 2021 at 10:40:35AM +0000, Valentin Schneider wrote:
> Commit c597bfddc9e9 ("sched: Provide Kconfig support for default dynamic
> preempt mode") changed the selectable config names for the preemption
> model. This means a config file must now select
>
> CONFIG_PREEMPT_BEHAVIOUR=y
>
> rather than
>
> CONFIG_PREEMPT=y
>
> to get a preemptible kernel. This means all arch config files need to be
> updated - right now arm64 defconfig selects CONFIG_PREEMPT=y but ends up
> with CONFIG_PREEMPT_NONE_BEHAVIOUR=y.
>
> Instead, have CONFIG_*PREEMPT be the selectable configs again, and make
> them select their _BEHAVIOUR equivalent if CONFIG_PREEMPT_DYNAMIC is set.
>
> Signed-off-by: Valentin Schneider <valentin.schneider@xxxxxxx>
> ---
> kernel/Kconfig.preempt | 36 ++++++++++++++++++------------------
> 1 file changed, 18 insertions(+), 18 deletions(-)
>
> diff --git a/kernel/Kconfig.preempt b/kernel/Kconfig.preempt
> index 60f1bfc3c7b2..25e8d6a3d9fa 100644
> --- a/kernel/Kconfig.preempt
> +++ b/kernel/Kconfig.preempt
> @@ -1,12 +1,21 @@
> # SPDX-License-Identifier: GPL-2.0-only
>
> +config PREEMPT_NONE_BEHAVIOUR
> + bool
> +
> +config PREEMPT_VOLUNTARY_BEHAVIOUR
> + bool
> +
> +config PREEMPT_BEHAVIOUR
> + bool
> +
> choice
> prompt "Preemption Model"
> - default PREEMPT_NONE_BEHAVIOUR
> + default PREEMPT_NONE
>
> -config PREEMPT_NONE_BEHAVIOUR
> +config PREEMPT_NONE
> bool "No Forced Preemption (Server)"
> - select PREEMPT_NONE if !PREEMPT_DYNAMIC
> + select PREEMPT_NONE_BEHAVIOUR if PREEMPT_DYNAMIC
> help
> This is the traditional Linux preemption model, geared towards
> throughput. It will still provide good latencies most of the
> @@ -18,10 +27,10 @@ config PREEMPT_NONE_BEHAVIOUR
> raw processing power of the kernel, irrespective of scheduling
> latencies.
>
> -config PREEMPT_VOLUNTARY_BEHAVIOUR
> +config PREEMPT_VOLUNTARY
> bool "Voluntary Kernel Preemption (Desktop)"
> depends on !ARCH_NO_PREEMPT
> - select PREEMPT_VOLUNTARY if !PREEMPT_DYNAMIC
> + select PREEMPT_VOLUNTARY_BEHAVIOUR if PREEMPT_DYNAMIC
> help
> This option reduces the latency of the kernel by adding more
> "explicit preemption points" to the kernel code. These new
> @@ -37,10 +46,12 @@ config PREEMPT_VOLUNTARY_BEHAVIOUR
>
> Select this if you are building a kernel for a desktop system.
>
> -config PREEMPT_BEHAVIOUR
> +config PREEMPT
> bool "Preemptible Kernel (Low-Latency Desktop)"
> depends on !ARCH_NO_PREEMPT
> - select PREEMPT
> + select PREEMPTION
> + select UNINLINE_SPIN_UNLOCK if !ARCH_INLINE_SPIN_UNLOCK
> + select PREEMPT_BEHAVIOUR if PREEMPT_DYNAMIC
> help
> This option reduces the latency of the kernel by making
> all kernel code (that is not executing in a critical section)
> @@ -75,17 +86,6 @@ config PREEMPT_RT
>
> endchoice
>
> -config PREEMPT_NONE
> - bool
> -
> -config PREEMPT_VOLUNTARY
> - bool
> -
> -config PREEMPT
> - bool
> - select PREEMPTION
> - select UNINLINE_SPIN_UNLOCK if !ARCH_INLINE_SPIN_UNLOCK
> -
> config PREEMPT_COUNT
> bool

This must be breaking cond_resched() and might_resched() definitions.

Since CONFIG_PREEMPT_NONE, CONFIG_PREEMPT_VOLUNTARY and CONFIG_PREEMPT aren't too widely
spread around within ifdefferies, you can:

1) Rename CONFIG_PREEMPT_NONE to CONFIG_PREEMPT_NONE_STATIC
Rename CONFIG_PREEMPT_VOLUNTARY to CONFIG_PREEMPT_VOLUNTARY_STATIC
Rename CONFIG_PREEMPT to CONFIG_PREEMPT_STATIC

2) Keep the old CONFIG_PREEMPT_NONE, CONFIG_PREEMPT_VOLUNTARY,
CONFIG_PREEMPT around for compatibility and make them select their
corresponding BEHAVIOUR entries.

Thanks.