[This patch *is* for mainline Linux]
In commit 76d2160147f43f982dfe881404cfde9fd0a9da21 lazy irq disabling
was implemented, and the simple irq handler had a masking set to it.
Remy Bohmer discovered that some devices in the ARM architecture
would trigger the mask, but never unmask it. His patch to do the
unmasking was questioned by Russell King about masking simple irqs
to begin with. Looking further, it was discovered that the problems
Remy was seeing was due to improper use of the simple handler by
devices, and he later submitted patches to fix those. But the issue
that was uncovered was that the simple handler should never mask.
This patch reverts the masking in the simple handler.
Signed-off-by: Steven Rostedt <[email protected]>
---
kernel/irq/chip.c | 9 ++-------
1 file changed, 2 insertions(+), 7 deletions(-)
Index: linux-compile.git/kernel/irq/chip.c
===================================================================
--- linux-compile.git.orig/kernel/irq/chip.c 2007-10-19 12:37:51.000000000 -0400
+++ linux-compile.git/kernel/irq/chip.c 2007-12-12 15:03:43.000000000 -0500
@@ -297,18 +297,13 @@ handle_simple_irq(unsigned int irq, stru
if (unlikely(desc->status & IRQ_INPROGRESS))
goto out_unlock;
+ desc->status &= ~(IRQ_REPLAY | IRQ_WAITING);
kstat_cpu(cpu).irqs[irq]++;
action = desc->action;
- if (unlikely(!action || (desc->status & IRQ_DISABLED))) {
- if (desc->chip->mask)
- desc->chip->mask(irq);
- desc->status &= ~(IRQ_REPLAY | IRQ_WAITING);
- desc->status |= IRQ_PENDING;
+ if (unlikely(!action || (desc->status & IRQ_DISABLED)))
goto out_unlock;
- }
- desc->status &= ~(IRQ_REPLAY | IRQ_WAITING | IRQ_PENDING);
desc->status |= IRQ_INPROGRESS;
spin_unlock(&desc->lock);
* Steven Rostedt <[email protected]> wrote:
> [This patch *is* for mainline Linux]
>
> In commit 76d2160147f43f982dfe881404cfde9fd0a9da21 lazy irq disabling
> was implemented, and the simple irq handler had a masking set to it.
>
> Remy Bohmer discovered that some devices in the ARM architecture would
> trigger the mask, but never unmask it. His patch to do the unmasking
> was questioned by Russell King about masking simple irqs to begin
> with. Looking further, it was discovered that the problems Remy was
> seeing was due to improper use of the simple handler by devices, and
> he later submitted patches to fix those. But the issue that was
> uncovered was that the simple handler should never mask.
>
> This patch reverts the masking in the simple handler.
>
> Signed-off-by: Steven Rostedt <[email protected]>
thanks, applied. This is for v2.6.24 too, right?
Ingo
On Wed, Dec 12, 2007 at 03:20:10PM -0500, Steven Rostedt wrote:
>
> [This patch *is* for mainline Linux]
>
> In commit 76d2160147f43f982dfe881404cfde9fd0a9da21 lazy irq disabling
> was implemented, and the simple irq handler had a masking set to it.
>
> Remy Bohmer discovered that some devices in the ARM architecture
> would trigger the mask, but never unmask it. His patch to do the
> unmasking was questioned by Russell King about masking simple irqs
> to begin with. Looking further, it was discovered that the problems
> Remy was seeing was due to improper use of the simple handler by
> devices, and he later submitted patches to fix those. But the issue
> that was uncovered was that the simple handler should never mask.
>
> This patch reverts the masking in the simple handler.
>
> Signed-off-by: Steven Rostedt <[email protected]>
Thanks.
Acked-by: Russell King <[email protected]>
--
Russell King
Linux kernel 2.6 ARM Linux - http://www.arm.linux.org.uk/
maintainer of:
Hello Steven,
> In commit 76d2160147f43f982dfe881404cfde9fd0a9da21 lazy irq disabling
> was implemented, and the simple irq handler had a masking set to it.
>
> Remy Bohmer discovered that some devices in the ARM architecture
> would trigger the mask, but never unmask it. His patch to do the
> unmasking was questioned by Russell King about masking simple irqs
> to begin with. Looking further, it was discovered that the problems
> Remy was seeing was due to improper use of the simple handler by
> devices, and he later submitted patches to fix those. But the issue
> that was uncovered was that the simple handler should never mask.
>
> This patch reverts the masking in the simple handler.
>
Acked-by: Remy Bohmer <[email protected]>
> ---
> kernel/irq/chip.c | 9 ++-------
> 1 file changed, 2 insertions(+), 7 deletions(-)
>
> Index: linux-compile.git/kernel/irq/chip.c
> ===================================================================
> --- linux-compile.git.orig/kernel/irq/chip.c 2007-10-19 12:37:51.000000000 -0400
> +++ linux-compile.git/kernel/irq/chip.c 2007-12-12 15:03:43.000000000 -0500
> @@ -297,18 +297,13 @@ handle_simple_irq(unsigned int irq, stru
>
> if (unlikely(desc->status & IRQ_INPROGRESS))
> goto out_unlock;
> + desc->status &= ~(IRQ_REPLAY | IRQ_WAITING);
> kstat_cpu(cpu).irqs[irq]++;
>
> action = desc->action;
> - if (unlikely(!action || (desc->status & IRQ_DISABLED))) {
> - if (desc->chip->mask)
> - desc->chip->mask(irq);
> - desc->status &= ~(IRQ_REPLAY | IRQ_WAITING);
> - desc->status |= IRQ_PENDING;
> + if (unlikely(!action || (desc->status & IRQ_DISABLED)))
> goto out_unlock;
> - }
>
> - desc->status &= ~(IRQ_REPLAY | IRQ_WAITING | IRQ_PENDING);
> desc->status |= IRQ_INPROGRESS;
> spin_unlock(&desc->lock);
>
>
>
On Thu, 13 Dec 2007, Ingo Molnar wrote:
>
> * Steven Rostedt <[email protected]> wrote:
>
> > [This patch *is* for mainline Linux]
> >
> > In commit 76d2160147f43f982dfe881404cfde9fd0a9da21 lazy irq disabling
> > was implemented, and the simple irq handler had a masking set to it.
>
> thanks, applied. This is for v2.6.24 too, right?
>
Probably should be. The patch only reverts the change for
handle_simple_irq that shouldn't have been done in the first place. At
worse, this patch just takes us back to what handle_simple_irq use to do,
and at best, it prevents bugs where we somehow fall into the "mask" path
of handle_simple_irq and never unmask. But to hit that path, the driver
probably shouldn't be using handle_simple_irq ;-)
Thanks,
-- Steve