diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2009-08-27 03:38:49 -0400 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2009-08-27 03:38:49 -0400 |
commit | 4dbc9ca219b0f294332e734528f7b82211700170 (patch) | |
tree | 377ee0e0d671f507dbb73618684630aba2475299 /kernel/irq | |
parent | 399b5da29b9f851eb7b96e2882097127f003e87c (diff) |
genirq: Do not mask oneshot edge type interrupts
Masking oneshot edge type interrupts is wrong as we might lose an
interrupt which is issued when the threaded handler is handling the
device. We can keep the irq unmasked safely as with edge type
interrupts there is no danger of interrupt floods. If the threaded
handler has not yet finished then IRQTF_RUNTHREAD is set which will
keep the handler thread active.
Debugged and verified in preempt-rt.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'kernel/irq')
-rw-r--r-- | kernel/irq/chip.c | 9 |
1 files changed, 2 insertions, 7 deletions
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c index 5765aad94998..c1660194d115 100644 --- a/kernel/irq/chip.c +++ b/kernel/irq/chip.c | |||
@@ -548,13 +548,8 @@ handle_edge_irq(unsigned int irq, struct irq_desc *desc) | |||
548 | kstat_incr_irqs_this_cpu(irq, desc); | 548 | kstat_incr_irqs_this_cpu(irq, desc); |
549 | 549 | ||
550 | /* Start handling the irq */ | 550 | /* Start handling the irq */ |
551 | if (unlikely(desc->status & IRQ_ONESHOT)) { | 551 | if (desc->chip->ack) |
552 | desc->status |= IRQ_MASKED; | 552 | desc->chip->ack(irq); |
553 | mask_ack_irq(desc, irq); | ||
554 | } else { | ||
555 | if (desc->chip->ack) | ||
556 | desc->chip->ack(irq); | ||
557 | } | ||
558 | 553 | ||
559 | /* Mark the IRQ currently in progress.*/ | 554 | /* Mark the IRQ currently in progress.*/ |
560 | desc->status |= IRQ_INPROGRESS; | 555 | desc->status |= IRQ_INPROGRESS; |