]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.14-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 22 Mar 2021 09:57:10 +0000 (10:57 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 22 Mar 2021 09:57:10 +0000 (10:57 +0100)
added patches:
genirq-disable-interrupts-for-force-threaded-handlers.patch

queue-4.14/genirq-disable-interrupts-for-force-threaded-handlers.patch [new file with mode: 0644]
queue-4.14/series

diff --git a/queue-4.14/genirq-disable-interrupts-for-force-threaded-handlers.patch b/queue-4.14/genirq-disable-interrupts-for-force-threaded-handlers.patch
new file mode 100644 (file)
index 0000000..10f23ff
--- /dev/null
@@ -0,0 +1,70 @@
+From 81e2073c175b887398e5bca6c004efa89983f58d Mon Sep 17 00:00:00 2001
+From: Thomas Gleixner <tglx@linutronix.de>
+Date: Wed, 17 Mar 2021 15:38:52 +0100
+Subject: genirq: Disable interrupts for force threaded handlers
+
+From: Thomas Gleixner <tglx@linutronix.de>
+
+commit 81e2073c175b887398e5bca6c004efa89983f58d upstream.
+
+With interrupt force threading all device interrupt handlers are invoked
+from kernel threads. Contrary to hard interrupt context the invocation only
+disables bottom halfs, but not interrupts. This was an oversight back then
+because any code like this will have an issue:
+
+thread(irq_A)
+  irq_handler(A)
+    spin_lock(&foo->lock);
+
+interrupt(irq_B)
+  irq_handler(B)
+    spin_lock(&foo->lock);
+
+This has been triggered with networking (NAPI vs. hrtimers) and console
+drivers where printk() happens from an interrupt which interrupted the
+force threaded handler.
+
+Now people noticed and started to change the spin_lock() in the handler to
+spin_lock_irqsave() which affects performance or add IRQF_NOTHREAD to the
+interrupt request which in turn breaks RT.
+
+Fix the root cause and not the symptom and disable interrupts before
+invoking the force threaded handler which preserves the regular semantics
+and the usefulness of the interrupt force threading as a general debugging
+tool.
+
+For not RT this is not changing much, except that during the execution of
+the threaded handler interrupts are delayed until the handler
+returns. Vs. scheduling and softirq processing there is no difference.
+
+For RT kernels there is no issue.
+
+Fixes: 8d32a307e4fa ("genirq: Provide forced interrupt threading")
+Reported-by: Johan Hovold <johan@kernel.org>
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Reviewed-by: Johan Hovold <johan@kernel.org>
+Acked-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+Link: https://lore.kernel.org/r/20210317143859.513307808@linutronix.de
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ kernel/irq/manage.c |    4 ++++
+ 1 file changed, 4 insertions(+)
+
+--- a/kernel/irq/manage.c
++++ b/kernel/irq/manage.c
+@@ -916,11 +916,15 @@ irq_forced_thread_fn(struct irq_desc *de
+       irqreturn_t ret;
+       local_bh_disable();
++      if (!IS_ENABLED(CONFIG_PREEMPT_RT))
++              local_irq_disable();
+       ret = action->thread_fn(action->irq, action->dev_id);
+       if (ret == IRQ_HANDLED)
+               atomic_inc(&desc->threads_handled);
+       irq_finalize_oneshot(desc, action);
++      if (!IS_ENABLED(CONFIG_PREEMPT_RT))
++              local_irq_enable();
+       local_bh_enable();
+       return ret;
+ }
index bc0e4699caa446d7f6ae6fd6ed640a702d2e177c..d0a87e9ff908369b450d5f9214ad1918754301bc 100644 (file)
@@ -40,3 +40,4 @@ x86-introduce-ts_compat_restart-to-fix-get_nr_restart_syscall.patch
 ext4-find-old-entry-again-if-failed-to-rename-whiteout.patch
 ext4-do-not-try-to-set-xattr-into-ea_inode-if-value-is-empty.patch
 ext4-fix-potential-error-in-ext4_do_update_inode.patch
+genirq-disable-interrupts-for-force-threaded-handlers.patch