[PATCH v2] riscv: smp: set CPU 0 possible in setup_smp()

Vivian Wang wangruikang at iscas.ac.cn
Tue Jul 14 21:01:46 PDT 2026


On 7/15/26 09:41, Paul Walmsley wrote:

> On Tue, 14 Jul 2026, Paul Sherman wrote:
>
>> setup_smp() calls set_cpu_possible() for CPUs 1..nr_cpu_ids-1 but
>> never for CPU 0 (the boot CPU). x86 handles this via
>> init_cpu_possible(cpumask_of(0)); RISC-V has no equivalent.
>>
>> Without CPU 0 in cpu_possible_mask, rcu_init_one()'s
>> for_each_possible_cpu() loop skips it, leaving rdp->mynode=NULL.
>> rcutree_prepare_cpu() then dereferences NULL and hangs.
>>
>> Exposed on Sophgo SG2042 (64-hart, 4-NUMA) with Linux 7.2-rc3.
>>
>> Fixes: a4166aec1130 ("riscv: Deduplicate code in setup_smp()")
>> Signed-off-by: Paul Sherman <shermanpauldylan at gmail.com>
> Thanks, queued for v7.2-rc.

I hope it's not too late to object, but I don't see how this could
happen. This is what happens in start_kernel():

    assembly boot code
    -> start_kernel()
       -> boot_cpu_init();
          -> int cpu = smp_processor_id();
             /* cpu = 0 because INIT_THREAD_INFO(tsk) leaves it out */
          
             /* Mark the boot cpu "present", "online" etc for SMP and UP case */
             set_cpu_online(cpu, true);
             set_cpu_active(cpu, true);
             set_cpu_present(cpu, true);
             set_cpu_possible(cpu, true); /* <---- HERE */
       -> ...
       -> setup_arch(&command_line);
          -> setup_smp()
             -> for (cpuid = 1; cpuid < nr_cpu_ids; cpuid++)
                	if (cpuid_to_hartid_map(cpuid) != INVALID_HARTID)
                		set_cpu_possible(cpuid, true);

So CPU 0 is already in cpu_possible_mask. This is also what I see by
adding prints to setup_smp().

* Paul Sherman: How did you reproduce this? Is your boot CPU not cpu 0
(note: not the same as hart 0)?

Vivian "dramforever" Wang




More information about the linux-riscv mailing list