From: Greg Kroah-Hartman Date: Mon, 22 Mar 2021 09:56:34 +0000 (+0100) Subject: 4.4-stable patches X-Git-Tag: v4.4.263~15 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=887e514ef4f7e3acf75b4d2a2e8f2779d9ac0743;p=thirdparty%2Fkernel%2Fstable-queue.git 4.4-stable patches added patches: genirq-disable-interrupts-for-force-threaded-handlers.patch --- diff --git a/queue-4.4/genirq-disable-interrupts-for-force-threaded-handlers.patch b/queue-4.4/genirq-disable-interrupts-for-force-threaded-handlers.patch new file mode 100644 index 00000000000..575c8f64353 --- /dev/null +++ b/queue-4.4/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 +@@ -872,11 +872,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.4/series b/queue-4.4/series index 0dad3b8dfe7..ba5bfc5afe8 100644 --- a/queue-4.4/series +++ b/queue-4.4/series @@ -11,3 +11,4 @@ pci-rpadlpar-fix-potential-drc_name-corruption-in-store-functions.patch x86-ioapic-ignore-irq2-again.patch ext4-find-old-entry-again-if-failed-to-rename-whiteout.patch ext4-fix-potential-error-in-ext4_do_update_inode.patch +genirq-disable-interrupts-for-force-threaded-handlers.patch