diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2018-08-05 08:55:26 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2018-08-05 08:55:26 -0700 |
commit | b9fb1fc7f921e4f52bc753d9147d1b6be6d0b675 (patch) | |
tree | 649795ce131917f2a3fedd7f15c8dd74ed4a5b3e | |
parent | 212dab0541eb916f29d55f914c8e84e13c6b214d (diff) | |
parent | d1f0301b3333eef5efbfa1fe0f0edbea01863d5d (diff) | |
download | linux-stable-b9fb1fc7f921e4f52bc753d9147d1b6be6d0b675.tar.gz linux-stable-b9fb1fc7f921e4f52bc753d9147d1b6be6d0b675.tar.bz2 linux-stable-b9fb1fc7f921e4f52bc753d9147d1b6be6d0b675.zip |
Merge branch 'irq-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull irq fix from Thomas Gleixner:
"A single bugfix for the irq core to prevent silent data corruption and
malfunction of threaded interrupts under certain conditions"
* 'irq-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
genirq: Make force irq threading setup more robust
-rw-r--r-- | kernel/irq/manage.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index daeabd791d58..9a8b7ba9aa88 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c @@ -1068,6 +1068,13 @@ static int irq_setup_forced_threading(struct irqaction *new) if (new->flags & (IRQF_NO_THREAD | IRQF_PERCPU | IRQF_ONESHOT)) return 0; + /* + * No further action required for interrupts which are requested as + * threaded interrupts already + */ + if (new->handler == irq_default_primary_handler) + return 0; + new->flags |= IRQF_ONESHOT; /* @@ -1075,7 +1082,7 @@ static int irq_setup_forced_threading(struct irqaction *new) * thread handler. We force thread them as well by creating a * secondary action. */ - if (new->handler != irq_default_primary_handler && new->thread_fn) { + if (new->handler && new->thread_fn) { /* Allocate the secondary action */ new->secondary = kzalloc(sizeof(struct irqaction), GFP_KERNEL); if (!new->secondary) |