diff options
Diffstat (limited to 'debian/patches-rt/0056-irq_poll-Use-raise_softirq_irqoff-in-cpu_dead-notifi.patch')
-rw-r--r-- | debian/patches-rt/0056-irq_poll-Use-raise_softirq_irqoff-in-cpu_dead-notifi.patch | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/debian/patches-rt/0056-irq_poll-Use-raise_softirq_irqoff-in-cpu_dead-notifi.patch b/debian/patches-rt/0056-irq_poll-Use-raise_softirq_irqoff-in-cpu_dead-notifi.patch new file mode 100644 index 000000000..5bb35a340 --- /dev/null +++ b/debian/patches-rt/0056-irq_poll-Use-raise_softirq_irqoff-in-cpu_dead-notifi.patch @@ -0,0 +1,43 @@ +From ca7f829af53a908e0c480142361350e16d5da247 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior <bigeasy@linutronix.de> +Date: Thu, 2 Apr 2020 21:16:30 +0200 +Subject: [PATCH 056/158] irq_poll: Use raise_softirq_irqoff() in cpu_dead + notifier +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/5.15/older/patches-5.15.10-rt24.tar.xz + +__raise_softirq_irqoff() adds a bit to the pending sofirq mask and this +is it. The softirq won't be handled in a deterministic way but randomly +when an interrupt fires and handles softirq in its irq_exit() routine or +if something randomly checks and handles pending softirqs in the call +chain before the CPU goes idle. + +Add a local_bh_disable/enable() around the IRQ-off section which will +handle pending softirqs. + +Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> +Link: https://lkml.kernel.org/r/20210930103754.2128949-1-bigeasy@linutronix.de +--- + lib/irq_poll.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/lib/irq_poll.c b/lib/irq_poll.c +index 2f17b488d58e..2b9f797642f6 100644 +--- a/lib/irq_poll.c ++++ b/lib/irq_poll.c +@@ -191,11 +191,13 @@ static int irq_poll_cpu_dead(unsigned int cpu) + * If a CPU goes away, splice its entries to the current CPU + * and trigger a run of the softirq + */ ++ local_bh_disable(); + local_irq_disable(); + list_splice_init(&per_cpu(blk_cpu_iopoll, cpu), + this_cpu_ptr(&blk_cpu_iopoll)); + __raise_softirq_irqoff(IRQ_POLL_SOFTIRQ); + local_irq_enable(); ++ local_bh_enable(); + + return 0; + } +-- +2.33.1 + |