xref: /linux/kernel/Kconfig.preempt (revision 7dadeaa6e851e7d67733f3e24fc53ee107781d0f)
1# SPDX-License-Identifier: GPL-2.0-only
2
3config PREEMPT_NONE_BUILD
4	bool
5
6config PREEMPT_VOLUNTARY_BUILD
7	bool
8
9config PREEMPT_BUILD
10	bool
11	select PREEMPTION
12	select UNINLINE_SPIN_UNLOCK if !ARCH_INLINE_SPIN_UNLOCK
13
14config ARCH_HAS_PREEMPT_LAZY
15	bool
16
17choice
18	prompt "Preemption Model"
19	default PREEMPT_LAZY if ARCH_HAS_PREEMPT_LAZY
20	default PREEMPT_NONE
21
22config PREEMPT_NONE
23	bool "No Forced Preemption (Server)"
24	depends on !PREEMPT_RT
25	depends on ARCH_NO_PREEMPT
26	select PREEMPT_NONE_BUILD if !PREEMPT_DYNAMIC
27	help
28	  This is the traditional Linux preemption model, geared towards
29	  throughput. It will still provide good latencies most of the
30	  time, but there are no guarantees and occasional longer delays
31	  are possible.
32
33	  Select this option if you are building a kernel for a server or
34	  scientific/computation system, or if you want to maximize the
35	  raw processing power of the kernel, irrespective of scheduling
36	  latencies.
37
38config PREEMPT_VOLUNTARY
39	bool "Voluntary Kernel Preemption (Desktop)"
40	depends on !ARCH_HAS_PREEMPT_LAZY
41	depends on !ARCH_NO_PREEMPT
42	depends on !PREEMPT_RT
43	select PREEMPT_VOLUNTARY_BUILD if !PREEMPT_DYNAMIC
44	help
45	  This option reduces the latency of the kernel by adding more
46	  "explicit preemption points" to the kernel code. These new
47	  preemption points have been selected to reduce the maximum
48	  latency of rescheduling, providing faster application reactions,
49	  at the cost of slightly lower throughput.
50
51	  This allows reaction to interactive events by allowing a
52	  low priority process to voluntarily preempt itself even if it
53	  is in kernel mode executing a system call. This allows
54	  applications to run more 'smoothly' even when the system is
55	  under load.
56
57	  Select this if you are building a kernel for a desktop system.
58
59config PREEMPT
60	bool "Preemptible Kernel (Low-Latency Desktop)"
61	depends on !ARCH_NO_PREEMPT
62	select PREEMPT_BUILD if !PREEMPT_DYNAMIC
63	help
64	  This option reduces the latency of the kernel by making
65	  all kernel code (that is not executing in a critical section)
66	  preemptible.  This allows reaction to interactive events by
67	  permitting a low priority process to be preempted involuntarily
68	  even if it is in kernel mode executing a system call and would
69	  otherwise not be about to reach a natural preemption point.
70	  This allows applications to run more 'smoothly' even when the
71	  system is under load, at the cost of slightly lower throughput
72	  and a slight runtime overhead to kernel code.
73
74	  Select this if you are building a kernel for a desktop or
75	  embedded system with latency requirements in the milliseconds
76	  range.
77
78config PREEMPT_LAZY
79	bool "Scheduler controlled preemption model"
80	depends on !ARCH_NO_PREEMPT
81	depends on ARCH_HAS_PREEMPT_LAZY
82	select PREEMPT_BUILD if !PREEMPT_DYNAMIC
83	help
84	  This option provides a scheduler driven preemption model that
85	  is fundamentally similar to full preemption, but is less
86	  eager to preempt SCHED_NORMAL tasks in an attempt to
87	  reduce lock holder preemption and recover some of the performance
88	  gains seen from using Voluntary preemption.
89
90endchoice
91
92config PREEMPT_RT
93	bool "Fully Preemptible Kernel (Real-Time)"
94	depends on EXPERT && ARCH_SUPPORTS_RT && !COMPILE_TEST
95	select PREEMPTION
96	help
97	  This option turns the kernel into a real-time kernel by replacing
98	  various locking primitives (spinlocks, rwlocks, etc.) with
99	  preemptible priority-inheritance aware variants, enforcing
100	  interrupt threading and introducing mechanisms to break up long
101	  non-preemptible sections. This makes the kernel, except for very
102	  low level and critical code paths (entry code, scheduler, low
103	  level interrupt handling) fully preemptible and brings most
104	  execution contexts under scheduler control.
105
106	  Select this if you are building a kernel for systems which
107	  require real-time guarantees.
108
109config PREEMPT_RT_NEEDS_BH_LOCK
110	bool "Enforce softirq synchronisation on PREEMPT_RT"
111	depends on PREEMPT_RT
112	help
113	  Enforce synchronisation across the softirqs context. On PREEMPT_RT
114	  the softirq is preemptible. This enforces the same per-CPU BLK
115	  semantic non-PREEMPT_RT builds have. This should not be needed
116	  because per-CPU locks were added to avoid the per-CPU BKL.
117
118	  This switch provides the old behaviour for testing reasons. Select
119	  this if you suspect an error with preemptible softirq and want test
120	  the old synchronized behaviour.
121
122config PREEMPT_COUNT
123       bool
124
125config PREEMPTION
126       bool
127       select PREEMPT_COUNT
128
129config PREEMPT_DYNAMIC
130	bool "Preemption behaviour defined on boot"
131	depends on HAVE_PREEMPT_DYNAMIC
132	select JUMP_LABEL if HAVE_PREEMPT_DYNAMIC_KEY
133	select PREEMPT_BUILD
134	default y if HAVE_PREEMPT_DYNAMIC_CALL
135	help
136	  This option allows to define the preemption model on the kernel
137	  command line parameter and thus override the default preemption
138	  model defined during compile time.
139
140	  The feature is primarily interesting for Linux distributions which
141	  provide a pre-built kernel binary to reduce the number of kernel
142	  flavors they offer while still offering different usecases.
143
144	  The runtime overhead is negligible with HAVE_STATIC_CALL_INLINE enabled
145	  but if runtime patching is not available for the specific architecture
146	  then the potential overhead should be considered.
147
148	  Interesting if you want the same pre-built kernel should be used for
149	  both Server and Desktop workloads.
150
151config SCHED_CORE
152	bool "Core Scheduling for SMT"
153	depends on SCHED_SMT
154	help
155	  This option permits Core Scheduling, a means of coordinated task
156	  selection across SMT siblings. When enabled -- see
157	  prctl(PR_SCHED_CORE) -- task selection ensures that all SMT siblings
158	  will execute a task from the same 'core group', forcing idle when no
159	  matching task is found.
160
161	  Use of this feature includes:
162	   - mitigation of some (not all) SMT side channels;
163	   - limiting SMT interference to improve determinism and/or performance.
164
165	  SCHED_CORE is default disabled. When it is enabled and unused,
166	  which is the likely usage by Linux distributions, there should
167	  be no measurable impact on performance.
168
169config SCHED_CLASS_EXT
170	bool "Extensible Scheduling Class"
171	depends on BPF_SYSCALL && BPF_JIT && DEBUG_INFO_BTF
172	select STACKTRACE if STACKTRACE_SUPPORT
173	help
174	  This option enables a new scheduler class sched_ext (SCX), which
175	  allows scheduling policies to be implemented as BPF programs to
176	  achieve the following:
177
178	  - Ease of experimentation and exploration: Enabling rapid
179	    iteration of new scheduling policies.
180	  - Customization: Building application-specific schedulers which
181	    implement policies that are not applicable to general-purpose
182	    schedulers.
183	  - Rapid scheduler deployments: Non-disruptive swap outs of
184	    scheduling policies in production environments.
185
186	  sched_ext leverages BPF struct_ops feature to define a structure
187	  which exports function callbacks and flags to BPF programs that
188	  wish to implement scheduling policies. The struct_ops structure
189	  exported by sched_ext is struct sched_ext_ops, and is conceptually
190	  similar to struct sched_class.
191
192	  For more information:
193	    Documentation/scheduler/sched-ext.rst
194	    https://github.com/sched-ext/scx
195