+++ /dev/null
-From 9f3f3bdc6d9dac1a5a8262ee7ad0f2ff1527a7e7 Mon Sep 17 00:00:00 2001
-From: Jonas Jelonek <jelonek.jonas@gmail.com>
-Date: Mon, 8 Jun 2026 09:37:29 +0000
-Subject: MIPS: smp: report dying CPU to RCU in stop_this_cpu()
-
-smp_send_stop() parks all secondary CPUs in stop_this_cpu(). 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. Since commit
-91840be8f710 ("irq_work: Fix use-after-free in irq_work_single() on PREEMPT_RT")
-however, irq_work_sync() calls synchronize_rcu() on architectures without
-an irq_work self-IPI, i.e. where arch_irq_work_has_interrupt() returns
-false. That is the asm-generic default used by MIPS. Any irq_work_sync()
-issued in the reboot/shutdown 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 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@vger.kernel.org
-Signed-off-by: Jonas Jelonek <jelonek.jonas@gmail.com>
-Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
----
- arch/mips/kernel/smp.c | 2 ++
- 1 file changed, 2 insertions(+)
-
---- 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);
- }
-
-LINUX_VERSION-6.18 = .37
-LINUX_KERNEL_HASH-6.18.37 = a83cd200e6646db52866b8309e9137b9e9048b613cbda10ced2b811aae125255
+LINUX_VERSION-6.18 = .38
+LINUX_KERNEL_HASH-6.18.38 = ac26e508abd56e9f8b89872b6e10c49fc823bcc70d8068a5d8504c1a7c4ff045
+device_initcall(blk_notifications_init);
--- a/include/linux/blkdev.h
+++ b/include/linux/blkdev.h
-@@ -1875,4 +1875,12 @@ static inline int bio_split_rw_at(struct
+@@ -1871,4 +1871,12 @@ static inline int bio_split_rw_at(struct
#define DEFINE_IO_COMP_BATCH(name) struct io_comp_batch name = { }
struct rtnl_link {
rtnl_doit_func doit;
-@@ -5332,7 +5332,9 @@ int ndo_dflt_bridge_getlink(struct sk_bu
+@@ -5340,7 +5340,9 @@ int ndo_dflt_bridge_getlink(struct sk_bu
brport_nla_put_flag(skb, flags, mask,
IFLA_BRPORT_MCAST_FLOOD, BR_MCAST_FLOOD) ||
brport_nla_put_flag(skb, flags, mask,
};
#define QCOM_PCIE_2_7_0_MAX_SUPPLIES 2
-@@ -732,12 +745,65 @@ static int qcom_pcie_post_init_2_3_2(str
+@@ -727,12 +740,65 @@ static int qcom_pcie_post_init_2_3_2(str
return 0;
}
int ret;
res->num_clks = devm_clk_bulk_get_all(dev, &res->clks);
-@@ -776,6 +842,17 @@ static void qcom_pcie_deinit_2_4_0(struc
+@@ -771,6 +837,17 @@ static void qcom_pcie_deinit_2_4_0(struc
clk_bulk_disable_unprepare(res->num_clks, res->clks);
}
static int qcom_pcie_init_2_4_0(struct qcom_pcie *pcie)
{
struct qcom_pcie_resources_2_4_0 *res = &pcie->res.v2_4_0;
-@@ -1384,6 +1461,16 @@ static const struct qcom_pcie_ops ops_2_
+@@ -1379,6 +1456,16 @@ static const struct qcom_pcie_ops ops_2_
.ltssm_enable = qcom_pcie_2_3_2_ltssm_enable,
};
/* Qcom IP rev.: 2.3.3 Synopsys IP rev.: 4.30a */
static const struct qcom_pcie_ops ops_2_3_3 = {
.get_resources = qcom_pcie_get_resources_2_3_3,
-@@ -1462,6 +1549,10 @@ static const struct qcom_pcie_cfg cfg_2_
+@@ -1457,6 +1544,10 @@ static const struct qcom_pcie_cfg cfg_2_
.ops = &ops_2_4_0,
};
static const struct qcom_pcie_cfg cfg_2_7_0 = {
.ops = &ops_2_7_0,
};
-@@ -2021,6 +2112,7 @@ static const struct of_device_id qcom_pc
+@@ -2016,6 +2107,7 @@ static const struct of_device_id qcom_pc
{ .compatible = "qcom,pcie-apq8064", .data = &cfg_2_1_0 },
{ .compatible = "qcom,pcie-apq8084", .data = &cfg_1_0_0 },
{ .compatible = "qcom,pcie-ipq4019", .data = &cfg_2_4_0 },
--- a/drivers/tty/serial/8250/8250_dw.c
+++ b/drivers/tty/serial/8250/8250_dw.c
-@@ -903,6 +903,8 @@ static int dw8250_runtime_suspend(struct
+@@ -905,6 +905,8 @@ static int dw8250_runtime_suspend(struct
{
struct dw8250_data *data = dev_get_drvdata(dev);
clk_disable_unprepare(data->clk);
clk_disable_unprepare(data->pclk);
-@@ -925,6 +927,8 @@ static int dw8250_runtime_resume(struct
+@@ -927,6 +929,8 @@ static int dw8250_runtime_resume(struct
return ret;
}
--- a/drivers/tty/serial/8250/8250_dw.c
+++ b/drivers/tty/serial/8250/8250_dw.c
-@@ -973,6 +973,7 @@ static const struct of_device_id dw8250_
+@@ -975,6 +975,7 @@ static const struct of_device_id dw8250_
{ .compatible = "marvell,armada-38x-uart", .data = &dw8250_armada_38x_data },
{ .compatible = "renesas,rzn1-uart", .data = &dw8250_renesas_rzn1_data },
{ .compatible = "sophgo,sg2044-uart", .data = &dw8250_skip_set_rate_data },