aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@linutronix.de>2009-08-27 03:38:49 -0400
committerThomas Gleixner <tglx@linutronix.de>2009-08-27 03:38:49 -0400
commit4dbc9ca219b0f294332e734528f7b82211700170 (patch)
tree377ee0e0d671f507dbb73618684630aba2475299 /kernel
parent399b5da29b9f851eb7b96e2882097127f003e87c (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')
-rw-r--r--kernel/irq/chip.c9
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;