aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/irq
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@linutronix.de>2009-08-26 10:17:59 -0400
committerThomas Gleixner <tglx@linutronix.de>2009-08-26 10:17:59 -0400
commit7f072a34719f7064189fd40d41f1b98d6bdbf653 (patch)
treed53db93cb104d7a3cff2099879378f2cac9a1d5c /kernel/irq
parent0a764c16d61b4d5ec9a9fadae931c79484a274cd (diff)
genirq: Do not mask edge ONESHOT interrupts
Edge type oneshot interrupts should not be masked for forced threading. We might lose interrupts. Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'kernel/irq')
-rw-r--r--kernel/irq/chip.c17
1 files changed, 8 insertions, 9 deletions
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
index 027fd5b83f26..c6f2d0ad1756 100644
--- a/kernel/irq/chip.c
+++ b/kernel/irq/chip.c
@@ -536,7 +536,12 @@ handle_edge_irq(unsigned int irq, struct irq_desc *desc)
536{ 536{
537 atomic_spin_lock(&desc->lock); 537 atomic_spin_lock(&desc->lock);
538 538
539 desc->status &= ~(IRQ_REPLAY | IRQ_WAITING); 539 /*
540 * Edge irqs can be requested with IRQF_ONESHOT set. RT
541 * (ab)uses this for enforced irq threading, but we do not
542 * want to mask edge type interrupts. Clear the oneshot flag.
543 */
544 desc->status &= ~(IRQ_REPLAY | IRQ_WAITING | IRQ_ONESHOT);
540 545
541 /* 546 /*
542 * If we're currently running this IRQ, or its disabled, 547 * If we're currently running this IRQ, or its disabled,
@@ -551,14 +556,8 @@ handle_edge_irq(unsigned int irq, struct irq_desc *desc)
551 } 556 }
552 kstat_incr_irqs_this_cpu(irq, desc); 557 kstat_incr_irqs_this_cpu(irq, desc);
553 558
554 /* Start handling the irq */ 559 if (desc->chip->ack)
555 if (unlikely(desc->status & IRQ_ONESHOT)) { 560 desc->chip->ack(irq);
556 desc->status |= IRQ_MASKED;
557 mask_ack_irq(desc, irq);
558 } else {
559 if (desc->chip->ack)
560 desc->chip->ack(irq);
561 }
562 561
563 /* Mark the IRQ currently in progress.*/ 562 /* Mark the IRQ currently in progress.*/
564 desc->status |= IRQ_INPROGRESS; 563 desc->status |= IRQ_INPROGRESS;