| From 99f070b62322a4b8c1252952735806d09eb44b68 Mon Sep 17 00:00:00 2001 |
| From: Qian Cai <cai@redhat.com> |
| Date: Wed, 28 Oct 2020 14:23:34 -0400 |
| Subject: powerpc/smp: Call rcu_cpu_starting() earlier |
| |
| From: Qian Cai <cai@redhat.com> |
| |
| commit 99f070b62322a4b8c1252952735806d09eb44b68 upstream. |
| |
| The call to rcu_cpu_starting() in start_secondary() is not early |
| enough in the CPU-hotplug onlining process, which results in lockdep |
| splats as follows (with CONFIG_PROVE_RCU_LIST=y): |
| |
| WARNING: suspicious RCU usage |
| ----------------------------- |
| kernel/locking/lockdep.c:3497 RCU-list traversed in non-reader section!! |
| |
| other info that might help us debug this: |
| |
| RCU used illegally from offline CPU! |
| rcu_scheduler_active = 1, debug_locks = 1 |
| no locks held by swapper/1/0. |
| |
| Call Trace: |
| dump_stack+0xec/0x144 (unreliable) |
| lockdep_rcu_suspicious+0x128/0x14c |
| __lock_acquire+0x1060/0x1c60 |
| lock_acquire+0x140/0x5f0 |
| _raw_spin_lock_irqsave+0x64/0xb0 |
| clockevents_register_device+0x74/0x270 |
| register_decrementer_clockevent+0x94/0x110 |
| start_secondary+0x134/0x800 |
| start_secondary_prolog+0x10/0x14 |
| |
| This is avoided by adding a call to rcu_cpu_starting() near the |
| beginning of the start_secondary() function. Note that the |
| raw_smp_processor_id() is required in order to avoid calling into |
| lockdep before RCU has declared the CPU to be watched for readers. |
| |
| It's safe to call rcu_cpu_starting() in the arch code as well as later |
| in generic code, as explained by Paul: |
| |
| It uses a per-CPU variable so that RCU pays attention only to the |
| first call to rcu_cpu_starting() if there is more than one of them. |
| This is even intentional, due to there being a generic |
| arch-independent call to rcu_cpu_starting() in |
| notify_cpu_starting(). |
| |
| So multiple calls to rcu_cpu_starting() are fine by design. |
| |
| Fixes: 4d004099a668 ("lockdep: Fix lockdep recursion") |
| Signed-off-by: Qian Cai <cai@redhat.com> |
| Acked-by: Paul E. McKenney <paulmck@kernel.org> |
| [mpe: Add Fixes tag, reword slightly & expand change log] |
| Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> |
| Link: https://lore.kernel.org/r/20201028182334.13466-1-cai@redhat.com |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/powerpc/kernel/smp.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/arch/powerpc/kernel/smp.c |
| +++ b/arch/powerpc/kernel/smp.c |
| @@ -1251,7 +1251,7 @@ static bool shared_caches; |
| /* Activate a secondary processor. */ |
| void start_secondary(void *unused) |
| { |
| - unsigned int cpu = smp_processor_id(); |
| + unsigned int cpu = raw_smp_processor_id(); |
| struct cpumask *(*sibling_mask)(int) = cpu_sibling_mask; |
| |
| mmgrab(&init_mm); |