| From 52553ddffad76ccf192d4dd9ce88d5818f57f62a Mon Sep 17 00:00:00 2001 |
| From: Edward Donovan <edward.donovan@numble.net> |
| Date: Sun, 27 Nov 2011 23:07:34 -0500 |
| Subject: genirq: fix regression in irqfixup, irqpoll |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| From: Edward Donovan <edward.donovan@numble.net> |
| |
| commit 52553ddffad76ccf192d4dd9ce88d5818f57f62a upstream. |
| |
| Commit fa27271bc8d2("genirq: Fixup poll handling") introduced a |
| regression that broke irqfixup/irqpoll for some hardware configurations. |
| |
| Amidst reorganizing 'try_one_irq', that patch removed a test that |
| checked for 'action->handler' returning IRQ_HANDLED, before acting on |
| the interrupt. Restoring this test back returns the functionality lost |
| since 2.6.39. In the current set of tests, after 'action' is set, it |
| must precede '!action->next' to take effect. |
| |
| With this and my previous patch to irq/spurious.c, c75d720fca8a, all |
| IRQ regressions that I have encountered are fixed. |
| |
| Signed-off-by: Edward Donovan <edward.donovan@numble.net> |
| Reported-and-tested-by: Rogério Brito <rbrito@ime.usp.br> |
| Cc: Thomas Gleixner <tglx@linutronix.de> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| kernel/irq/spurious.c | 4 +++- |
| 1 file changed, 3 insertions(+), 1 deletion(-) |
| |
| --- a/kernel/irq/spurious.c |
| +++ b/kernel/irq/spurious.c |
| @@ -84,7 +84,9 @@ static int try_one_irq(int irq, struct i |
| */ |
| action = desc->action; |
| if (!action || !(action->flags & IRQF_SHARED) || |
| - (action->flags & __IRQF_TIMER) || !action->next) |
| + (action->flags & __IRQF_TIMER) || |
| + (action->handler(irq, action->dev_id) == IRQ_HANDLED) || |
| + !action->next) |
| goto out; |
| |
| /* Already running on another processor */ |