Re: [PATCH AUTOSEL 6.6 4/6] LoongArch/smp: Call rcutree_report_cpu_starting() earlier

From: Huacai Chen
Date: Tue Nov 14 2023 - 22:55:49 EST


Hi, Sasha,

In 6.6 and earlier versions, rcutree_report_cpu_starting() should be
rcu_cpu_starting().

Huacai

On Wed, Nov 15, 2023 at 11:34 AM Sasha Levin <sashal@xxxxxxxxxx> wrote:
>
> From: Huacai Chen <chenhuacai@xxxxxxxxxxx>
>
> [ Upstream commit a2ccf46333d7b2cf9658f0d82ac74097c1542fae ]
>
> rcutree_report_cpu_starting() must be called before cpu_probe() to avoid
> the following lockdep splat that triggered by calling __alloc_pages() when
> CONFIG_PROVE_RCU_LIST=y:
>
> =============================
> WARNING: suspicious RCU usage
> 6.6.0+ #980 Not tainted
> -----------------------------
> kernel/locking/lockdep.c:3761 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
> 1 lock held by swapper/1/0:
> #0: 900000000c82ef98 (&pcp->lock){+.+.}-{2:2}, at: get_page_from_freelist+0x894/0x1790
> CPU: 1 PID: 0 Comm: swapper/1 Not tainted 6.6.0+ #980
> Stack : 0000000000000001 9000000004f79508 9000000004893670 9000000100310000
> 90000001003137d0 0000000000000000 90000001003137d8 9000000004f79508
> 0000000000000000 0000000000000001 0000000000000000 90000000048a3384
> 203a656d616e2065 ca43677b3687e616 90000001002c3480 0000000000000008
> 000000000000009d 0000000000000000 0000000000000001 80000000ffffe0b8
> 000000000000000d 0000000000000033 0000000007ec0000 13bbf50562dad831
> 9000000005140748 0000000000000000 9000000004f79508 0000000000000004
> 0000000000000000 9000000005140748 90000001002bad40 0000000000000000
> 90000001002ba400 0000000000000000 9000000003573ec8 0000000000000000
> 00000000000000b0 0000000000000004 0000000000000000 0000000000070000
> ...
> Call Trace:
> [<9000000003573ec8>] show_stack+0x38/0x150
> [<9000000004893670>] dump_stack_lvl+0x74/0xa8
> [<900000000360d2bc>] lockdep_rcu_suspicious+0x14c/0x190
> [<900000000361235c>] __lock_acquire+0xd0c/0x2740
> [<90000000036146f4>] lock_acquire+0x104/0x2c0
> [<90000000048a955c>] _raw_spin_lock_irqsave+0x5c/0x90
> [<900000000381cd5c>] rmqueue_bulk+0x6c/0x950
> [<900000000381fc0c>] get_page_from_freelist+0xd4c/0x1790
> [<9000000003821c6c>] __alloc_pages+0x1bc/0x3e0
> [<9000000003583b40>] tlb_init+0x150/0x2a0
> [<90000000035742a0>] per_cpu_trap_init+0xf0/0x110
> [<90000000035712fc>] cpu_probe+0x3dc/0x7a0
> [<900000000357ed20>] start_secondary+0x40/0xb0
> [<9000000004897138>] smpboot_entry+0x54/0x58
>
> raw_smp_processor_id() is required in order to avoid calling into lockdep
> before RCU has declared the CPU to be watched for readers.
>
> See also commit 29368e093921 ("x86/smpboot: Move rcu_cpu_starting() earlier"),
> commit de5d9dae150c ("s390/smp: move rcu_cpu_starting() earlier") and commit
> 99f070b62322 ("powerpc/smp: Call rcu_cpu_starting() earlier").
>
> Signed-off-by: Huacai Chen <chenhuacai@xxxxxxxxxxx>
> Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>
> ---
> arch/loongarch/kernel/smp.c | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/arch/loongarch/kernel/smp.c b/arch/loongarch/kernel/smp.c
> index ef35c871244f0..5bca12d16e069 100644
> --- a/arch/loongarch/kernel/smp.c
> +++ b/arch/loongarch/kernel/smp.c
> @@ -504,8 +504,9 @@ asmlinkage void start_secondary(void)
> unsigned int cpu;
>
> sync_counter();
> - cpu = smp_processor_id();
> + cpu = raw_smp_processor_id();
> set_my_cpu_offset(per_cpu_offset(cpu));
> + rcutree_report_cpu_starting(cpu);
>
> cpu_probe();
> constant_clockevent_init();
> --
> 2.42.0
>