[PATCH 3/5] rcu: Assume rcu_init() is called before smp

From: Frederic Weisbecker
Date: Wed Feb 16 2022 - 10:42:33 EST


rcu_init() is called way before SMP is initialized and therefore only
the boot CPU should be online at this stage.

Simplify the boot per-cpu initialization according to this constraint.

Signed-off-by: Frederic Weisbecker <frederic@xxxxxxxxxx>
Cc: Neeraj Upadhyay <quic_neeraju@xxxxxxxxxxx>
Cc: Uladzislau Rezki <uladzislau.rezki@xxxxxxxx>
Cc: Joel Fernandes <joel@xxxxxxxxxxxxxxxxx>
Cc: Boqun Feng <boqun.feng@xxxxxxxxx>
---
kernel/rcu/tree.c | 14 ++++++++------
1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
index 86eec6a0f1a1..83dec1db86cf 100644
--- a/kernel/rcu/tree.c
+++ b/kernel/rcu/tree.c
@@ -4813,7 +4813,7 @@ static void __init kfree_rcu_batch_init(void)

void __init rcu_init(void)
{
- int cpu;
+ int cpu = smp_processor_id();

rcu_early_boot_tests();

@@ -4833,11 +4833,13 @@ void __init rcu_init(void)
* or the scheduler are operational.
*/
pm_notifier(rcu_pm_notify, 0);
- for_each_online_cpu(cpu) {
- rcutree_prepare_cpu(cpu);
- rcu_cpu_starting(cpu);
- rcutree_online_cpu(cpu);
- }
+
+ /* This is early on boot, we expect a single CPU */
+ WARN_ON(num_online_cpus() > 1);
+
+ rcutree_prepare_cpu(cpu);
+ rcu_cpu_starting(cpu);
+ rcutree_online_cpu(cpu);

/* Create workqueue for Tree SRCU and for expedited GPs. */
rcu_gp_wq = alloc_workqueue("rcu_gp", WQ_MEM_RECLAIM, 0);
--
2.25.1