Re: [PATCH v2] MIPS: smp: report dying CPU to RCU in stop_this_cpu()

From: Jonas Jelonek

Date: Mon Jun 15 2026 - 03:00:33 EST


Hi Huacai,

sorry for the reply delay.

On 10.06.26 08:05, Huacai Chen wrote:
> [...]
> In theory LoongArch has the same problem, but I cannot reproduce,
> should I enable PREEMPT_RT? Or there are some special configurations?

Sadly I cannot help with that. For MIPS, this seems to be the default
behavior.

> Huacai
>
>> This issue was noticed on several Realtek MIPS switch SoCs (MIPS
>> interAptiv) and came up during kernel bump downstream in OpenWrt from
>> 6.18.33 to 6.18.34, after the backport of the patch to the 6.18 stable
>> branch. The patch also has been backported all the way back to 6.1.
>>
>> 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. MIPS shuts down all CPUs here
>> without going through the CPU-hotplug mechanism, so this report is not
>> otherwise issued. Reporting a dying CPU to RCU outside the regular hotplug
>> offline path is not unprecedented: arm64 does the same in cpu_die_early().
>> There it is an exception for a CPU that was coming online and is aborting
>> bringup, rather than the default shutdown action as on MIPS.
>>
>> Fixes: 91840be8f710 ("irq_work: Fix use-after-free in irq_work_single() on PREEMPT_RT")
>> CC: stable@xxxxxxxxxxxxxxx
>> Signed-off-by: Jonas Jelonek <jelonek.jonas@xxxxxxxxx>
>>
>> diff --git a/arch/mips/kernel/smp.c b/arch/mips/kernel/smp.c
>> index 4868e79f3b30..0f28b4a62e72 100644
>> --- a/arch/mips/kernel/smp.c
>> +++ b/arch/mips/kernel/smp.c
>> @@ -20,6 +20,7 @@
>> #include <linux/sched/mm.h>
>> #include <linux/cpumask.h>
>> #include <linux/cpu.h>
>> +#include <linux/rcupdate.h>
>> #include <linux/err.h>
>> #include <linux/ftrace.h>
>> #include <linux/irqdomain.h>
>> @@ -422,6 +423,7 @@ static void stop_this_cpu(void *dummy)
>> set_cpu_online(smp_processor_id(), false);
>> calculate_cpu_foreign_map();
>> local_irq_disable();
>> + rcutree_report_cpu_dead();
>> while (1);
>> }
>>
>> --
>> 2.51.0
>>
>>

Best,
Jonas