Merge tag 'riscv-for-linus-5.16-mw1' of git://git.kernel.org/pub/scm/linux/kernel...
[platform/kernel/linux-starfive.git] / kernel / Kconfig.preempt
1 # SPDX-License-Identifier: GPL-2.0-only
2
3 choice
4         prompt "Preemption Model"
5         default PREEMPT_NONE_BEHAVIOUR
6
7 config PREEMPT_NONE_BEHAVIOUR
8         bool "No Forced Preemption (Server)"
9         select PREEMPT_NONE if !PREEMPT_DYNAMIC
10         help
11           This is the traditional Linux preemption model, geared towards
12           throughput. It will still provide good latencies most of the
13           time, but there are no guarantees and occasional longer delays
14           are possible.
15
16           Select this option if you are building a kernel for a server or
17           scientific/computation system, or if you want to maximize the
18           raw processing power of the kernel, irrespective of scheduling
19           latencies.
20
21 config PREEMPT_VOLUNTARY_BEHAVIOUR
22         bool "Voluntary Kernel Preemption (Desktop)"
23         depends on !ARCH_NO_PREEMPT
24         select PREEMPT_VOLUNTARY if !PREEMPT_DYNAMIC
25         help
26           This option reduces the latency of the kernel by adding more
27           "explicit preemption points" to the kernel code. These new
28           preemption points have been selected to reduce the maximum
29           latency of rescheduling, providing faster application reactions,
30           at the cost of slightly lower throughput.
31
32           This allows reaction to interactive events by allowing a
33           low priority process to voluntarily preempt itself even if it
34           is in kernel mode executing a system call. This allows
35           applications to run more 'smoothly' even when the system is
36           under load.
37
38           Select this if you are building a kernel for a desktop system.
39
40 config PREEMPT_BEHAVIOUR
41         bool "Preemptible Kernel (Low-Latency Desktop)"
42         depends on !ARCH_NO_PREEMPT
43         select PREEMPT
44         help
45           This option reduces the latency of the kernel by making
46           all kernel code (that is not executing in a critical section)
47           preemptible.  This allows reaction to interactive events by
48           permitting a low priority process to be preempted involuntarily
49           even if it is in kernel mode executing a system call and would
50           otherwise not be about to reach a natural preemption point.
51           This allows applications to run more 'smoothly' even when the
52           system is under load, at the cost of slightly lower throughput
53           and a slight runtime overhead to kernel code.
54
55           Select this if you are building a kernel for a desktop or
56           embedded system with latency requirements in the milliseconds
57           range.
58
59 config PREEMPT_RT
60         bool "Fully Preemptible Kernel (Real-Time)"
61         depends on EXPERT && ARCH_SUPPORTS_RT && !PREEMPT_DYNAMIC
62         select PREEMPTION
63         help
64           This option turns the kernel into a real-time kernel by replacing
65           various locking primitives (spinlocks, rwlocks, etc.) with
66           preemptible priority-inheritance aware variants, enforcing
67           interrupt threading and introducing mechanisms to break up long
68           non-preemptible sections. This makes the kernel, except for very
69           low level and critical code paths (entry code, scheduler, low
70           level interrupt handling) fully preemptible and brings most
71           execution contexts under scheduler control.
72
73           Select this if you are building a kernel for systems which
74           require real-time guarantees.
75
76 endchoice
77
78 config PREEMPT_NONE
79         bool
80
81 config PREEMPT_VOLUNTARY
82         bool
83
84 config PREEMPT
85         bool
86         select PREEMPTION
87         select UNINLINE_SPIN_UNLOCK if !ARCH_INLINE_SPIN_UNLOCK
88
89 config PREEMPT_COUNT
90        bool
91
92 config PREEMPTION
93        bool
94        select PREEMPT_COUNT
95
96 config PREEMPT_DYNAMIC
97         bool "Preemption behaviour defined on boot"
98         depends on HAVE_PREEMPT_DYNAMIC
99         select PREEMPT
100         default y
101         help
102           This option allows to define the preemption model on the kernel
103           command line parameter and thus override the default preemption
104           model defined during compile time.
105
106           The feature is primarily interesting for Linux distributions which
107           provide a pre-built kernel binary to reduce the number of kernel
108           flavors they offer while still offering different usecases.
109
110           The runtime overhead is negligible with HAVE_STATIC_CALL_INLINE enabled
111           but if runtime patching is not available for the specific architecture
112           then the potential overhead should be considered.
113
114           Interesting if you want the same pre-built kernel should be used for
115           both Server and Desktop workloads.
116
117 config SCHED_CORE
118         bool "Core Scheduling for SMT"
119         depends on SCHED_SMT
120         help
121           This option permits Core Scheduling, a means of coordinated task
122           selection across SMT siblings. When enabled -- see
123           prctl(PR_SCHED_CORE) -- task selection ensures that all SMT siblings
124           will execute a task from the same 'core group', forcing idle when no
125           matching task is found.
126
127           Use of this feature includes:
128            - mitigation of some (not all) SMT side channels;
129            - limiting SMT interference to improve determinism and/or performance.
130
131           SCHED_CORE is default disabled. When it is enabled and unused,
132           which is the likely usage by Linux distributions, there should
133           be no measurable impact on performance.
134
135