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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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
>




[Index of Archives]     [Linux Kernel]     [Kernel Development Newbies]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Hiking]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux