[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