| From 24ee0dead99e22319ff99da94cfc9e8b8cafb48b Mon Sep 17 00:00:00 2001 |
| From: Joel Fernandes <joelaf@google.com> |
| Date: Thu, 28 Apr 2022 18:20:58 +0000 |
| Subject: [PATCH] BACKPORT: FROMLIST: rcu/nocb: Add an option to offload all |
| CPUs on boot |
| |
| 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. |
| |
| (am from https://lore.kernel.org/rcu/20220422184212.GH4285@paulmck-ThinkPad-P17-Gen-1/T/#t) |
| Backport-notes: |
| The file being backported to has changed a bit, however the backport is |
| trivial. To keep the risk of breakage due to unrelated backports low, |
| just backport this change to get the desired behavior we want. |
| |
| BUG=b:222463781 |
| TEST=Cq |
| |
| Reviewed-by: Kalesh Singh <kaleshsingh@google.com> |
| Reviewed-by: Uladzislau Rezki <urezki@gmail.com> |
| Reported-by: kernel test robot <lkp@intel.com> |
| Signed-off-by: Joel Fernandes <joel@joelfernandes.org> |
| Signed-off-by: Paul E. McKenney <paulmck@kernel.org> |
| Change-Id: Ia2f9cfa2a3303e58a19a8061ee025afc70cf9adb |
| Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/kernel/+/3615290 |
| Tested-by: Joel Fernandes <joelaf@google.com> |
| Commit-Queue: Joel Fernandes <joelaf@google.com> |
| Reviewed-by: Vineeth Pillai <vineethrp@google.com> |
| --- |
| Documentation/admin-guide/kernel-parameters.txt | 6 ++++++ |
| kernel/rcu/Kconfig | 13 +++++++++++++ |
| kernel/rcu/tree_nocb.h | 15 ++++++++++++++- |
| 3 files changed, 33 insertions(+), 1 deletion(-) |
| |
| diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt |
| index 3f1cc5e317ed..e70c7dba7524 100644 |
| --- a/Documentation/admin-guide/kernel-parameters.txt |
| +++ b/Documentation/admin-guide/kernel-parameters.txt |
| @@ -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 |
| @@ -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 |
| diff --git a/kernel/rcu/Kconfig b/kernel/rcu/Kconfig |
| index bf8e341e75b4..746a668bf81d 100644 |
| --- a/kernel/rcu/Kconfig |
| +++ b/kernel/rcu/Kconfig |
| @@ -223,6 +223,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 |
| + 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 TASKS_TRACE_RCU_READ_MB |
| bool "Tasks Trace RCU readers use memory barriers in user and idle" |
| depends on RCU_EXPERT |
| diff --git a/kernel/rcu/tree_nocb.h b/kernel/rcu/tree_nocb.h |
| index 636d0546a4e9..0f5a8b555530 100644 |
| --- a/kernel/rcu/tree_nocb.h |
| +++ b/kernel/rcu/tree_nocb.h |
| @@ -1166,13 +1166,26 @@ 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_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)) |
| + 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 (offload_all) |
| + cpumask_setall(rcu_nocb_mask); |
| + |
| if (need_rcu_nocb_mask) { |
| if (!cpumask_available(rcu_nocb_mask)) { |
| if (!zalloc_cpumask_var(&rcu_nocb_mask, GFP_KERNEL)) { |
| -- |
| 2.36.0.512.ge40c2bad7a-goog |
| |