| # SPDX-License-Identifier: GPL-2.0-only | |
| # | |
| # RCU-related configuration options | |
| # | |
| menu "RCU Subsystem" | |
| config TREE_RCU | |
| bool | |
| default y if SMP | |
| # Dynticks-idle tracking | |
| select CONTEXT_TRACKING_IDLE | |
| help | |
| This option selects the RCU implementation that is | |
| designed for very large SMP system with hundreds or | |
| thousands of CPUs. It also scales down nicely to | |
| smaller systems. | |
| config PREEMPT_RCU | |
| bool | |
| default y if (PREEMPT || PREEMPT_RT || PREEMPT_DYNAMIC) | |
| select TREE_RCU | |
| help | |
| This option selects the RCU implementation that is | |
| designed for very large SMP systems with hundreds or | |
| thousands of CPUs, but for which real-time response | |
| is also required. It also scales down nicely to | |
| smaller systems. | |
| Select this option if you are unsure. | |
| config TINY_RCU | |
| bool | |
| default y if !PREEMPT_RCU && !SMP | |
| help | |
| This option selects the RCU implementation that is | |
| designed for UP systems from which real-time response | |
| is not required. This option greatly reduces the | |
| memory footprint of RCU. | |
| config RCU_EXPERT | |
| bool "Make expert-level adjustments to RCU configuration" | |
| default n | |
| help | |
| This option needs to be enabled if you wish to make | |
| expert-level adjustments to RCU configuration. By default, | |
| no such adjustments can be made, which has the often-beneficial | |
| side-effect of preventing "make oldconfig" from asking you all | |
| sorts of detailed questions about how you would like numerous | |
| obscure RCU options to be set up. | |
| Say Y if you need to make expert-level adjustments to RCU. | |
| Say N if you are unsure. | |
| config TINY_SRCU | |
| bool | |
| default y if TINY_RCU | |
| help | |
| This option selects the single-CPU non-preemptible version of SRCU. | |
| config TREE_SRCU | |
| bool | |
| default y if !TINY_RCU | |
| help | |
| This option selects the full-fledged version of SRCU. | |
| config FORCE_NEED_SRCU_NMI_SAFE | |
| bool "Force selection of NEED_SRCU_NMI_SAFE" | |
| depends on !TINY_SRCU | |
| depends on RCU_EXPERT | |
| depends on ARCH_HAS_NMI_SAFE_THIS_CPU_OPS | |
| select NEED_SRCU_NMI_SAFE | |
| default n | |
| help | |
| This option forces selection of the NEED_SRCU_NMI_SAFE | |
| Kconfig option, allowing testing of srcu_read_lock_nmisafe() | |
| and srcu_read_unlock_nmisafe() on architectures (like x86) | |
| that select the ARCH_HAS_NMI_SAFE_THIS_CPU_OPS Kconfig option. | |
| config NEED_SRCU_NMI_SAFE | |
| def_bool HAVE_NMI && !ARCH_HAS_NMI_SAFE_THIS_CPU_OPS && !TINY_SRCU | |
| config TASKS_RCU_GENERIC | |
| def_bool TASKS_RCU || TASKS_RUDE_RCU | |
| help | |
| This option enables generic infrastructure code supporting | |
| task-based RCU implementations. Not for manual selection. | |
| config FORCE_TASKS_RCU | |
| bool "Force selection of TASKS_RCU" | |
| depends on RCU_EXPERT | |
| select TASKS_RCU | |
| default n | |
| help | |
| This option force-enables a task-based RCU implementation | |
| that uses only voluntary context switch (not preemption!), | |
| idle, and user-mode execution as quiescent states. Not for | |
| manual selection in most cases. | |
| config NEED_TASKS_RCU | |
| bool | |
| default n | |
| config TASKS_RCU | |
| bool | |
| default NEED_TASKS_RCU && PREEMPTION | |
| select IRQ_WORK | |
| config FORCE_TASKS_RUDE_RCU | |
| bool "Force selection of Tasks Rude RCU" | |
| depends on RCU_EXPERT | |
| select TASKS_RUDE_RCU | |
| default n | |
| help | |
| This option force-enables a task-based RCU implementation | |
| that uses only context switch (including preemption) and | |
| user-mode execution as quiescent states. It forces IPIs and | |
| context switches on all online CPUs, including idle ones, | |
| so use with caution. Not for manual selection in most cases. | |
| config TASKS_RUDE_RCU | |
| bool | |
| default n | |
| select IRQ_WORK | |
| config FORCE_TASKS_TRACE_RCU | |
| bool "Force selection of Tasks Trace RCU" | |
| depends on RCU_EXPERT | |
| select TASKS_TRACE_RCU | |
| default n | |
| help | |
| This option enables a task-based RCU implementation that uses | |
| explicit rcu_read_lock_trace() read-side markers, and allows | |
| these readers to appear in the idle loop as well as on the | |
| CPU hotplug code paths. It can force IPIs on online CPUs, | |
| including idle ones, so use with caution. Not for manual | |
| selection in most cases. | |
| config TASKS_TRACE_RCU | |
| bool | |
| default n | |
| select IRQ_WORK | |
| config TASKS_TRACE_RCU_NO_MB | |
| bool "Override RCU Tasks Trace inclusion of read-side memory barriers" | |
| depends on RCU_EXPERT && TASKS_TRACE_RCU | |
| default ARCH_WANTS_NO_INSTR | |
| help | |
| This option prevents the use of read-side memory barriers in | |
| rcu_read_lock_tasks_trace() and rcu_read_unlock_tasks_trace() | |
| even in kernels built with CONFIG_ARCH_WANTS_NO_INSTR=n, that is, | |
| in kernels that do not have noinstr set up in entry/exit code. | |
| By setting this option, you are promising to carefully review | |
| use of ftrace, BPF, and friends to ensure that no tracing | |
| operation is attached to a function that runs in that portion | |
| of the entry/exit code that RCU does not watch, that is, | |
| where rcu_is_watching() returns false. Alternatively, you | |
| might choose to never remove traces except by rebooting. | |
| Those wishing to disable read-side memory barriers for an entire | |
| architecture can select this Kconfig option, hence the polarity. | |
| Say Y here if you need speed and will review use of tracing. | |
| Say N here for certain esoteric testing of RCU itself. | |
| Take the default if you are unsure. | |
| config RCU_STALL_COMMON | |
| def_bool TREE_RCU | |
| help | |
| This option enables RCU CPU stall code that is common between | |
| the TINY and TREE variants of RCU. The purpose is to allow | |
| the tiny variants to disable RCU CPU stall warnings, while | |
| making these warnings mandatory for the tree variants. | |
| config RCU_NEED_SEGCBLIST | |
| def_bool ( TREE_RCU || TREE_SRCU || TASKS_RCU_GENERIC ) | |
| config RCU_FANOUT | |
| int "Tree-based hierarchical RCU fanout value" | |
| range 2 64 if 64BIT | |
| range 2 32 if !64BIT | |
| depends on TREE_RCU && RCU_EXPERT | |
| default 64 if 64BIT | |
| default 32 if !64BIT | |
| help | |
| This option controls the fanout of hierarchical implementations | |
| of RCU, allowing RCU to work efficiently on machines with | |
| large numbers of CPUs. This value must be at least the fourth | |
| root of NR_CPUS, which allows NR_CPUS to be insanely large. | |
| The default value of RCU_FANOUT should be used for production | |
| systems, but if you are stress-testing the RCU implementation | |
| itself, small RCU_FANOUT values allow you to test large-system | |
| code paths on small(er) systems. | |
| Select a specific number if testing RCU itself. | |
| Take the default if unsure. | |
| config RCU_FANOUT_LEAF | |
| int "Tree-based hierarchical RCU leaf-level fanout value" | |
| range 2 64 if 64BIT && !RCU_STRICT_GRACE_PERIOD | |
| range 2 32 if !64BIT && !RCU_STRICT_GRACE_PERIOD | |
| range 2 3 if RCU_STRICT_GRACE_PERIOD | |
| depends on TREE_RCU && RCU_EXPERT | |
| default 16 if !RCU_STRICT_GRACE_PERIOD | |
| default 2 if RCU_STRICT_GRACE_PERIOD | |
| help | |
| This option controls the leaf-level fanout of hierarchical | |
| implementations of RCU, and allows trading off cache misses | |
| against lock contention. Systems that synchronize their | |
| scheduling-clock interrupts for energy-efficiency reasons will | |
| want the default because the smaller leaf-level fanout keeps | |
| lock contention levels acceptably low. Very large systems | |
| (hundreds or thousands of CPUs) will instead want to set this | |
| value to the maximum value possible in order to reduce the | |
| number of cache misses incurred during RCU's grace-period | |
| initialization. These systems tend to run CPU-bound, and thus | |
| are not helped by synchronized interrupts, and thus tend to | |
| skew them, which reduces lock contention enough that large | |
| leaf-level fanouts work well. That said, setting leaf-level | |
| fanout to a large number will likely cause problematic | |
| lock contention on the leaf-level rcu_node structures unless | |
| you boot with the skew_tick kernel parameter. | |
| Select a specific number if testing RCU itself. | |
| Select the maximum permissible value for large systems, but | |
| please understand that you may also need to set the skew_tick | |
| kernel boot parameter to avoid contention on the rcu_node | |
| structure's locks. | |
| Take the default if unsure. | |
| config RCU_BOOST | |
| bool "Enable RCU priority boosting" | |
| depends on (RT_MUTEXES && PREEMPT_RCU && RCU_EXPERT) || PREEMPT_RT | |
| default y if PREEMPT_RT | |
| help | |
| This option boosts the priority of preempted RCU readers that | |
| block the current preemptible RCU grace period for too long. | |
| This option also prevents heavy loads from blocking RCU | |
| callback invocation. | |
| Say Y here if you are working with real-time apps or heavy loads | |
| Say N here if you are unsure. | |
| config RCU_BOOST_DELAY | |
| int "Milliseconds to delay boosting after RCU grace-period start" | |
| range 0 3000 | |
| depends on RCU_BOOST | |
| default 500 | |
| help | |
| This option specifies the time to wait after the beginning of | |
| a given grace period before priority-boosting preempted RCU | |
| readers blocking that grace period. Note that any RCU reader | |
| blocking an expedited RCU grace period is boosted immediately. | |
| Accept the default if unsure. | |
| config RCU_EXP_KTHREAD | |
| bool "Perform RCU expedited work in a real-time kthread" | |
| depends on RCU_BOOST && RCU_EXPERT | |
| default !PREEMPT_RT && NR_CPUS <= 32 | |
| help | |
| Use this option to further reduce the latencies of expedited | |
| grace periods at the expense of being more disruptive. | |
| This option is disabled by default on PREEMPT_RT=y kernels which | |
| disable expedited grace periods after boot by unconditionally | |
| setting rcupdate.rcu_normal_after_boot=1. | |
| Accept the default if unsure. | |
| config RCU_NOCB_CPU | |
| bool "Offload RCU callback processing from boot-selected CPUs" | |
| depends on TREE_RCU | |
| depends on RCU_EXPERT || NO_HZ_FULL | |
| default n | |
| help | |
| Use this option to reduce OS jitter for aggressive HPC or | |
| real-time workloads. It can also be used to offload RCU | |
| callback invocation to energy-efficient CPUs in battery-powered | |
| asymmetric multiprocessors. The price of this reduced jitter | |
| is that the overhead of call_rcu() increases and that some | |
| workloads will incur significant increases in context-switch | |
| rates. | |
| This option offloads callback invocation from the set of | |
| CPUs specified at boot time by the rcu_nocbs parameter. | |
| For each such CPU, a kthread ("rcuox/N") will be created to | |
| invoke callbacks, where the "N" is the CPU being offloaded, | |
| and where the "x" is "p" for RCU-preempt (PREEMPTION kernels) | |
| and "s" for RCU-sched (!PREEMPTION kernels). This option | |
| also creates another kthread for each sqrt(nr_cpu_ids) CPUs | |
| ("rcuog/N", where N is the first CPU in that group to come | |
| online), which handles grace periods for its group. Nothing | |
| prevents these kthreads from running on the specified CPUs, | |
| but (1) the kthreads may be preempted between each callback, | |
| and (2) affinity or cgroups can be used to force the kthreads | |
| to run on whatever set of CPUs is desired. | |
| The sqrt(nr_cpu_ids) grouping may be overridden using the | |
| rcutree.rcu_nocb_gp_stride kernel boot parameter. This can | |
| be especially helpful for smaller numbers of CPUs, where | |
| sqrt(nr_cpu_ids) can be a bit of a blunt instrument. | |
| Say Y here if you need reduced OS jitter, despite added overhead. | |
| Say N here if you are unsure. | |
| config RCU_NOCB_CPU_DEFAULT_ALL | |
| bool "Offload RCU callback processing from all CPUs by default" | |
| depends on RCU_NOCB_CPU | |
| default n | |
| help | |
| Use this option to offload callback processing from all CPUs | |
| by default, in the absence of the rcu_nocbs or nohz_full boot | |
| parameter. This also avoids the need to use any boot parameters | |
| to achieve the effect of offloading all CPUs on boot. | |
| Say Y here if you want offload all CPUs by default on boot. | |
| Say N here if you are unsure. | |
| config RCU_NOCB_CPU_CB_BOOST | |
| bool "Offload RCU callback from real-time kthread" | |
| depends on RCU_NOCB_CPU && RCU_BOOST | |
| default y if PREEMPT_RT | |
| help | |
| Use this option to invoke offloaded callbacks as SCHED_FIFO | |
| to avoid starvation by heavy SCHED_OTHER background load. | |
| Of course, running as SCHED_FIFO during callback floods will | |
| cause the rcuo[ps] kthreads to monopolize the CPU for hundreds | |
| of milliseconds or more. Therefore, when enabling this option, | |
| it is your responsibility to ensure that latency-sensitive | |
| tasks either run with higher priority or run on some other CPU. | |
| Say Y here if you want to set RT priority for offloading kthreads. | |
| Say N here if you are building a !PREEMPT_RT kernel and are unsure. | |
| config RCU_LAZY | |
| bool "RCU callback lazy invocation functionality" | |
| depends on RCU_NOCB_CPU | |
| default n | |
| help | |
| To save power, batch RCU callbacks and delay starting the | |
| corresponding grace period for multiple seconds. The grace | |
| period will be started after this delay, in case of memory | |
| pressure, or if the corresponding CPU's callback list grows | |
| too large. | |
| These delays happen only on rcu_nocbs CPUs, that is, CPUs | |
| whose callbacks have been offloaded. | |
| Use the rcutree.enable_rcu_lazy=0 kernel-boot parameter to | |
| globally disable these delays. | |
| config RCU_LAZY_DEFAULT_OFF | |
| bool "Turn RCU lazy invocation off by default" | |
| depends on RCU_LAZY | |
| default n | |
| help | |
| Build the kernel with CONFIG_RCU_LAZY=y, but cause the kernel | |
| to boot with these energy-efficiency delays disabled. Use the | |
| rcutree.enable_rcu_lazy=0 kernel-boot parameter to override | |
| the this option at boot time, thus re-enabling these delays. | |
| config RCU_DOUBLE_CHECK_CB_TIME | |
| bool "RCU callback-batch backup time check" | |
| depends on RCU_EXPERT | |
| default n | |
| help | |
| Use this option to provide more precise enforcement of the | |
| rcutree.rcu_resched_ns module parameter in situations where | |
| a single RCU callback might run for hundreds of microseconds, | |
| thus defeating the 32-callback batching used to amortize the | |
| cost of the fine-grained but expensive local_clock() function. | |
| This option rounds rcutree.rcu_resched_ns up to the next | |
| jiffy, and overrides the 32-callback batching if this limit | |
| is exceeded. | |
| Say Y here if you need tighter callback-limit enforcement. | |
| Say N here if you are unsure. | |
| endmenu # "RCU Subsystem" |