# 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

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"
