[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAAhV-H61R006eHGN+ujvDqrT_6AYV0XBcSaT2zyVLJi1rR=kMA@mail.gmail.com>
Date: Wed, 15 Nov 2023 11:55:24 +0800
From: Huacai Chen <chenhuacai@...nel.org>
To: Sasha Levin <sashal@...nel.org>
Cc: linux-kernel@...r.kernel.org, stable@...r.kernel.org,
Huacai Chen <chenhuacai@...ngson.cn>, maobibo@...ngson.cn,
palmer@...osinc.com, yangtiezhu@...ngson.cn, wangliupu@...ngson.cn,
jpoimboe@...nel.org, zhoubinbin@...ngson.cn,
loongarch@...ts.linux.dev
Subject: Re: [PATCH AUTOSEL 6.6 4/6] LoongArch/smp: Call rcutree_report_cpu_starting()
earlier
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@...nel.org> wrote:
>
> From: Huacai Chen <chenhuacai@...ngson.cn>
>
> [ 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@...ngson.cn>
> Signed-off-by: Sasha Levin <sashal@...nel.org>
> ---
> 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
>
Powered by blists - more mailing lists