From: Michal Hocko <mho...@kernel.org>

Preemption mode selection is currently hardcoded on Kconfig choices.
Introduce a dedicated option to tune preemption flavour at boot time,

This will be only available on architectures efficiently supporting
static calls in order not to tempt with the feature against additional
overhead that might be prohibitive or undesirable.

CONFIG_PREEMPT_DYNAMIC is automatically selected by CONFIG_PREEMPT if
the architecture provides the necessary support (CONFIG_STATIC_CALL_INLINE,
CONFIG_GENERIC_ENTRY, and provide with __preempt_schedule_function() /
__preempt_schedule_notrace_function()).

Suggested-by: Peter Zijlstra <pet...@infradead.org>
Signed-off-by: Michal Hocko <mho...@suse.com>
Cc: Peter Zijlstra (Intel) <pet...@infradead.org>
Cc: Thomas Gleixner <t...@linutronix.de>
Cc: Mel Gorman <mgor...@suse.de>
Cc: Ingo Molnar <mi...@redhat.com>
Cc: Paul E. McKenney <paul...@kernel.org>
[Added documentation, reorganize dependencies on top of static call,
 etc...]
Signed-off-by: Frederic Weisbecker <frede...@kernel.org>
---
 .../admin-guide/kernel-parameters.txt         |  7 +++++++
 arch/Kconfig                                  |  9 +++++++++
 arch/x86/Kconfig                              |  1 +
 kernel/Kconfig.preempt                        | 19 +++++++++++++++++++
 4 files changed, 36 insertions(+)

diff --git a/Documentation/admin-guide/kernel-parameters.txt 
b/Documentation/admin-guide/kernel-parameters.txt
index 526d65d8573a..f03c4c447871 100644
--- a/Documentation/admin-guide/kernel-parameters.txt
+++ b/Documentation/admin-guide/kernel-parameters.txt
@@ -3902,6 +3902,13 @@
                        Format: {"off"}
                        Disable Hardware Transactional Memory
 
+       preempt=        [KNL]
+                       Select preemption mode if you have 
CONFIG_PREEMPT_DYNAMIC
+                       none - Limited to cond_resched() calls
+                       voluntary - Limited to cond_resched() and might_sleep() 
calls
+                       full - Any section that isn't explicitly preempt 
disabled
+                              can be preempted anytime.
+
        print-fatal-signals=
                        [KNL] debug: print fatal signals
 
diff --git a/arch/Kconfig b/arch/Kconfig
index 56b6ccc0e32d..69e0c7f15a7f 100644
--- a/arch/Kconfig
+++ b/arch/Kconfig
@@ -1028,6 +1028,15 @@ config HAVE_STATIC_CALL_INLINE
        bool
        depends on HAVE_STATIC_CALL
 
+config HAVE_PREEMPT_DYNAMIC
+       bool
+       depends on HAVE_STATIC_CALL_INLINE
+       depends on GENERIC_ENTRY
+       help
+          Select this if the architecture support boot time preempt setting
+          on top of static calls. It is strongly advised to support inline
+          static call to avoid any overhead.
+
 source "kernel/gcov/Kconfig"
 
 source "scripts/gcc-plugins/Kconfig"
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index f6946b81f74a..8a57fdfd3372 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -217,6 +217,7 @@ config X86
        select HAVE_STACK_VALIDATION            if X86_64
        select HAVE_STATIC_CALL
        select HAVE_STATIC_CALL_INLINE          if HAVE_STACK_VALIDATION
+       select HAVE_PREEMPT_DYNAMIC             if HAVE_STATIC_CALL_INLINE
        select HAVE_RSEQ
        select HAVE_SYSCALL_TRACEPOINTS
        select HAVE_UNSTABLE_SCHED_CLOCK
diff --git a/kernel/Kconfig.preempt b/kernel/Kconfig.preempt
index bf82259cff96..416017301660 100644
--- a/kernel/Kconfig.preempt
+++ b/kernel/Kconfig.preempt
@@ -40,6 +40,7 @@ config PREEMPT
        depends on !ARCH_NO_PREEMPT
        select PREEMPTION
        select UNINLINE_SPIN_UNLOCK if !ARCH_INLINE_SPIN_UNLOCK
+       select PREEMPT_DYNAMIC if HAVE_PREEMPT_DYNAMIC
        help
          This option reduces the latency of the kernel by making
          all kernel code (that is not executing in a critical section)
@@ -80,3 +81,21 @@ config PREEMPT_COUNT
 config PREEMPTION
        bool
        select PREEMPT_COUNT
+
+config PREEMPT_DYNAMIC
+       bool
+       help
+         This option allows to define the preemption model on the kernel
+         command line parameter and thus override the default preemption
+         model defined during compile time.
+
+         The feature is primarily interesting for Linux distributions which
+         provide a pre-built kernel binary to reduce the number of kernel
+         flavors they offer while still offering different usecases.
+
+         The runtime overhead is negligible with HAVE_STATIC_CALL_INLINE 
enabled
+         but if runtime patching is not available for the specific architecture
+         then the potential overhead should be considered.
+
+         Interesting if you want the same pre-built kernel should be used for
+         both Server and Desktop workloads.
-- 
2.25.1

Reply via email to