Description
In the Linux kernel, the following vulnerability has been resolved: LoongArch: Report dying CPU to RCU in stop_this_cpu() This is a port of MIPS commit 9f3f3bdc6d9dac1 ("MIPS: smp: report dying CPU to RCU in stop_this_cpu()"). smp_send_stop() parks all secondary CPUs in stop_this_cpu(). And the function marks the CPU offline for the scheduler via set_cpu_online(false) but never informs RCU, so RCU keeps expecting a quiescent state from CPUs that are now spinning forever with interrupts disabled. As long as nothing waits for an RCU grace period after smp_send_stop() this is harmless, which is why it went unnoticed. However, since commit 91840be8f710370 ("irq_work: Fix use-after-free in irq_work_single() on PREEMPT_RT"), irq_work_sync() calls synchronize_rcu() on architectures without an irq_work self-IPI, i.e. where arch_irq_work_has_interrupt() returns false. Any irq_work_sync() issued in the reboot/shutdown/halt path after smp_send_stop() then blocks on a grace period that can never complete, hanging the reboot: WARNING: CPU: 0 PID: 15 at kernel/irq_work.c:144 irq_work_queue_on ... rcu: INFO: rcu_sched detected stalls on CPUs/tasks: rcu: Offline CPU 1 blocking current GP. rcu: Offline CPU 2 blocking current GP. rcu: Offline CPU 3 blocking current GP. This issue needs some hacks to reproduce, and it was not noticed on LoongArch because arch_irq_work_has_interrupt() usually returns true. Call rcutree_report_cpu_dead() once interrupts are disabled, mirroring the generic CPU-hotplug offline path, so RCU stops waiting on the parked CPUs and grace periods can still complete. LoongArch shuts down all CPUs here without going through the CPU-hotplug mechanism, so this report is not otherwise issued.
Affected products
Version statuses are supplied by the assigning organization. Consult the original record for detailed ranges and platform conditions.
Linux Linux
Default version status: unaffected
2dc79362302922cb18f35e262712b5e58de65442 to < 262dadc619e69ebeb97affd334cd1078a9704e98affectedeef4f71b46a9929ac33e968538c9dd5d96a02460 to < 1fa22de588a65880d6fe54c38c87fffe7d519f60affected684a78183c54c23e70d1cba320f7fc184604210b to < a0269e928728f970c782319fee53d92d4ea4e512affected18c0456ea2615b1a743a6db739c74411c3b42bc6 to < 90e254f18b8c224460082329dd5c42fd30995c2faffected91840be8f710370607f949a627e070896faeddb8 to < 0833b2b84c2fc1387f8165f0cbf6a02d67f647a5affected91840be8f710370607f949a627e070896faeddb8 to < f2539c56c74691e7a88af6372ba2b48c06ed2fe4affected81b582784518196eff1050212a046bc29d3a05ddaffected6.1.175 to < 6.1.178affected6.6.142 to < 6.6.145affected6.12.92 to < 6.12.95affected6.18.34 to < 6.18.38affected7.0.11 to < 7.1affected
Linux Linux
Default version status: affected
7.1affected0 to < 7.1unaffected6.1.178 to ≤ 6.1.*unaffected6.6.145 to ≤ 6.6.*unaffected6.12.95 to ≤ 6.12.*unaffected6.18.38 to ≤ 6.18.*unaffected7.1.3 to ≤ 7.1.*unaffected7.2 to ≤ *unaffected
References
- https://git.kernel.org/stable/c/262dadc619e69ebeb97affd334cd1078a9704e98 ↗
- https://git.kernel.org/stable/c/1fa22de588a65880d6fe54c38c87fffe7d519f60 ↗
- https://git.kernel.org/stable/c/a0269e928728f970c782319fee53d92d4ea4e512 ↗
- https://git.kernel.org/stable/c/90e254f18b8c224460082329dd5c42fd30995c2f ↗
- https://git.kernel.org/stable/c/0833b2b84c2fc1387f8165f0cbf6a02d67f647a5 ↗
- https://git.kernel.org/stable/c/f2539c56c74691e7a88af6372ba2b48c06ed2fe4 ↗