diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2009-08-26 10:17:59 -0400 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2009-08-26 10:17:59 -0400 |
commit | 7f072a34719f7064189fd40d41f1b98d6bdbf653 (patch) | |
tree | d53db93cb104d7a3cff2099879378f2cac9a1d5c /kernel/irq | |
parent | 0a764c16d61b4d5ec9a9fadae931c79484a274cd (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.c | 17 |
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; |