From: Greg Kroah-Hartman Date: Mon, 22 Mar 2021 09:57:10 +0000 (+0100) Subject: 4.14-stable patches X-Git-Tag: v4.4.263~13 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f98b8559399532a167b0460ae1accff2c9015fe1;p=thirdparty%2Fkernel%2Fstable-queue.git 4.14-stable patches added patches: genirq-disable-interrupts-for-force-threaded-handlers.patch --- 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 index 00000000000..10f23ff3e43 --- /dev/null +++ b/queue-4.14/genirq-disable-interrupts-for-force-threaded-handlers.patch @@ -0,0 +1,70 @@ +From 81e2073c175b887398e5bca6c004efa89983f58d Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Wed, 17 Mar 2021 15:38:52 +0100 +Subject: genirq: Disable interrupts for force threaded handlers + +From: Thomas Gleixner + +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 +Signed-off-by: Thomas Gleixner +Reviewed-by: Johan Hovold +Acked-by: Sebastian Andrzej Siewior +Link: https://lore.kernel.org/r/20210317143859.513307808@linutronix.de +Signed-off-by: Greg Kroah-Hartman +--- + 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; + } diff --git a/queue-4.14/series b/queue-4.14/series index bc0e4699caa..d0a87e9ff90 100644 --- a/queue-4.14/series +++ b/queue-4.14/series @@ -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