Skip to content

Commit

Permalink
rcu/nocb: Add an option to offload all CPUs on boot
Browse files Browse the repository at this point in the history
Systems built with CONFIG_RCU_NOCB_CPU=y but booted without either
the rcu_nocbs= or rcu_nohz_full= kernel-boot parameters will not have
callback offloading on any of the CPUs, nor can any of the CPUs be
switched to enable callback offloading at runtime.  Although this is
intentional, it would be nice to have a way to offload all the CPUs
without having to make random bootloaders specify either the rcu_nocbs=
or the rcu_nohz_full= kernel-boot parameters.

This commit therefore provides a new CONFIG_RCU_NOCB_CPU_DEFAULT_ALL
Kconfig option that switches the default so as to offload callback
processing on all of the CPUs.  This default can still be overridden
using the rcu_nocbs= and rcu_nohz_full= kernel-boot parameters.

Reviewed-by: Uladzislau Rezki (Sony) <urezki@gmail.com>
Reviewed-by: Kalesh Singh <kaleshsingh@google.com>
Signed-off-by: Joel Fernandes <joel@joelfernandes.org>
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
  • Loading branch information
joelagnel authored and paulmckrcu committed Apr 19, 2022
1 parent 7e510e6 commit ad68d8b
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 0 deletions.
6 changes: 6 additions & 0 deletions Documentation/admin-guide/kernel-parameters.txt
Expand Up @@ -3572,6 +3572,9 @@
just as if they had also been called out in the
rcu_nocbs= boot parameter.

Note that this argument takes precedence over
the CONFIG_RCU_NOCB_CPU_DEFAULT_ALL option.

noiotrap [SH] Disables trapped I/O port accesses.

noirqdebug [X86-32] Disables the code which attempts to detect and
Expand Down Expand Up @@ -4475,6 +4478,9 @@
no-callback mode from boot but the mode may be
toggled at runtime via cpusets.

Note that this argument takes precedence over
the CONFIG_RCU_NOCB_CPU_DEFAULT_ALL option.

rcu_nocb_poll [KNL]
Rather than requiring that offloaded CPUs
(specified by rcu_nocbs= above) explicitly
Expand Down
13 changes: 13 additions & 0 deletions kernel/rcu/Kconfig
Expand Up @@ -262,6 +262,19 @@ config RCU_NOCB_CPU
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
parameters. This Kconfig option provides the ability to offload
all CPUs from boot without specifying kernel-boot parameters.

Say Y here if you want offload all CPUs by default on boot.
Say N here if you are unsure.

config TASKS_TRACE_RCU_READ_MB
bool "Tasks Trace RCU readers use memory barriers in user and idle"
depends on RCU_EXPERT && TASKS_TRACE_RCU
Expand Down
13 changes: 13 additions & 0 deletions kernel/rcu/tree_nocb.h
Expand Up @@ -1197,11 +1197,21 @@ void __init rcu_init_nohz(void)
{
int cpu;
bool need_rcu_nocb_mask = false;
bool offload_all = false;
struct rcu_data *rdp;

#if defined(CONFIG_RCU_NOCB_CPU_DEFAULT_ALL)
if (!rcu_state.nocb_is_setup) {
need_rcu_nocb_mask = true;
offload_all = true;
}
#endif /* #if defined(CONFIG_RCU_NOCB_CPU_DEFAULT_ALL) */

#if defined(CONFIG_NO_HZ_FULL)
if (tick_nohz_full_running && !cpumask_empty(tick_nohz_full_mask))
need_rcu_nocb_mask = true;
offload_all = false; /* NO_HZ_FULL has its own mask. */
}
#endif /* #if defined(CONFIG_NO_HZ_FULL) */

if (need_rcu_nocb_mask) {
Expand All @@ -1222,6 +1232,9 @@ void __init rcu_init_nohz(void)
cpumask_or(rcu_nocb_mask, rcu_nocb_mask, tick_nohz_full_mask);
#endif /* #if defined(CONFIG_NO_HZ_FULL) */

if (offload_all)
cpumask_setall(rcu_nocb_mask);

if (!cpumask_subset(rcu_nocb_mask, cpu_possible_mask)) {
pr_info("\tNote: kernel parameter 'rcu_nocbs=', 'nohz_full', or 'isolcpus=' contains nonexistent CPUs.\n");
cpumask_and(rcu_nocb_mask, cpu_possible_mask,
Expand Down

0 comments on commit ad68d8b

Please sign in to comment.