Commit 6ef869e0 authored by Michal Hocko's avatar Michal Hocko Committed by Ingo Molnar
Browse files

preempt: Introduce CONFIG_PREEMPT_DYNAMIC



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: default avatarPeter Zijlstra <peterz@infradead.org>
Signed-off-by: default avatarMichal Hocko <mhocko@suse.com>
Signed-off-by: default avatarFrederic Weisbecker <frederic@kernel.org>
[peterz: relax requirement to HAVE_STATIC_CALL]
Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
Link: https://lkml.kernel.org/r/20210118141223.123667-5-frederic@kernel.org
parent 29fd0194
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -3916,6 +3916,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

+9 −0
Original line number Diff line number Diff line
@@ -1090,6 +1090,15 @@ config HAVE_STATIC_CALL_INLINE
	bool
	depends on HAVE_STATIC_CALL

config HAVE_PREEMPT_DYNAMIC
	bool
	depends on HAVE_STATIC_CALL
	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.

config ARCH_WANT_LD_ORPHAN_WARN
	bool
	help
+1 −0
Original line number Diff line number Diff line
@@ -224,6 +224,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
	select HAVE_RSEQ
	select HAVE_SYSCALL_TRACEPOINTS
	select HAVE_UNSTABLE_SCHED_CLOCK
+19 −0
Original line number Diff line number Diff line
@@ -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.