# 
 | 
# RCU-related configuration options 
 | 
# 
 | 
  
 | 
menu "RCU Subsystem" 
 | 
  
 | 
config TREE_RCU 
 | 
    bool 
 | 
    default y if !PREEMPT && SMP 
 | 
    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 
 | 
    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 && !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 SRCU 
 | 
    bool 
 | 
    help 
 | 
      This option selects the sleepable version of RCU. This version 
 | 
      permits arbitrary sleeping or blocking within RCU read-side critical 
 | 
      sections. 
 | 
  
 | 
config TINY_SRCU 
 | 
    bool 
 | 
    default y if SRCU && TINY_RCU 
 | 
    help 
 | 
      This option selects the single-CPU non-preemptible version of SRCU. 
 | 
  
 | 
config TREE_SRCU 
 | 
    bool 
 | 
    default y if SRCU && !TINY_RCU 
 | 
    help 
 | 
      This option selects the full-fledged version of SRCU. 
 | 
  
 | 
config TASKS_RCU 
 | 
    def_bool PREEMPT 
 | 
    select SRCU 
 | 
    help 
 | 
      This option enables a task-based RCU implementation that uses 
 | 
      only voluntary context switch (not preemption!), idle, and 
 | 
      user-mode execution as quiescent states. 
 | 
  
 | 
config RCU_STALL_COMMON 
 | 
    def_bool ( TREE_RCU || PREEMPT_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 || PREEMPT_RCU || TREE_SRCU ) 
 | 
  
 | 
config CONTEXT_TRACKING 
 | 
       bool 
 | 
  
 | 
config CONTEXT_TRACKING_FORCE 
 | 
    bool "Force context tracking" 
 | 
    depends on CONTEXT_TRACKING 
 | 
    default y if !NO_HZ_FULL 
 | 
    help 
 | 
      The major pre-requirement for full dynticks to work is to 
 | 
      support the context tracking subsystem. But there are also 
 | 
      other dependencies to provide in order to make the full 
 | 
      dynticks working. 
 | 
  
 | 
      This option stands for testing when an arch implements the 
 | 
      context tracking backend but doesn't yet fullfill all the 
 | 
      requirements to make the full dynticks feature working. 
 | 
      Without the full dynticks, there is no way to test the support 
 | 
      for context tracking and the subsystems that rely on it: RCU 
 | 
      userspace extended quiescent state and tickless cputime 
 | 
      accounting. This option copes with the absence of the full 
 | 
      dynticks subsystem by forcing the context tracking on all 
 | 
      CPUs in the system. 
 | 
  
 | 
      Say Y only if you're working on the development of an 
 | 
      architecture backend for the context tracking. 
 | 
  
 | 
      Say N otherwise, this option brings an overhead that you 
 | 
      don't want in production. 
 | 
  
 | 
  
 | 
config RCU_FANOUT 
 | 
    int "Tree-based hierarchical RCU fanout value" 
 | 
    range 2 64 if 64BIT 
 | 
    range 2 32 if !64BIT 
 | 
    depends on (TREE_RCU || PREEMPT_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 
 | 
    range 2 32 if !64BIT 
 | 
    depends on (TREE_RCU || PREEMPT_RCU) && RCU_EXPERT 
 | 
    default 16 
 | 
    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_FAST_NO_HZ 
 | 
    bool "Accelerate last non-dyntick-idle CPU's grace periods" 
 | 
    depends on NO_HZ_COMMON && SMP && RCU_EXPERT && !PREEMPT_RT_FULL 
 | 
    default n 
 | 
    help 
 | 
      This option permits CPUs to enter dynticks-idle state even if 
 | 
      they have RCU callbacks queued, and prevents RCU from waking 
 | 
      these CPUs up more than roughly once every four jiffies (by 
 | 
      default, you can adjust this using the rcutree.rcu_idle_gp_delay 
 | 
      parameter), thus improving energy efficiency.  On the other 
 | 
      hand, this option increases the duration of RCU grace periods, 
 | 
      for example, slowing down synchronize_rcu(). 
 | 
  
 | 
      Say Y if energy efficiency is critically important, and you 
 | 
          don't care about increased grace-period durations. 
 | 
  
 | 
      Say N if you are unsure. 
 | 
  
 | 
config RCU_BOOST 
 | 
    bool "Enable RCU priority boosting" 
 | 
    depends on (RT_MUTEXES && PREEMPT_RCU && RCU_EXPERT) || PREEMPT_RT_FULL 
 | 
    default y if PREEMPT_RT_FULL 
 | 
    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 for all flavors of RCU. 
 | 
  
 | 
      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_NOCB_CPU 
 | 
    bool "Offload RCU callback processing from boot-selected CPUs" 
 | 
    depends on TREE_RCU || PREEMPT_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. 
 | 
  
 | 
      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 "b" for RCU-bh, "p" for RCU-preempt, and 
 | 
      "s" for RCU-sched.  Nothing prevents this kthread 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. 
 | 
  
 | 
      Say Y here if you want to help to debug reduced OS jitter. 
 | 
      Say N here if you are unsure. 
 | 
  
 | 
endmenu # "RCU Subsystem" 
 |