Commit 7f072a34 authored by Thomas Gleixner's avatar Thomas Gleixner

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: default avatarThomas Gleixner <tglx@linutronix.de>
parent 0a764c16
...@@ -536,7 +536,12 @@ handle_edge_irq(unsigned int irq, struct irq_desc *desc) ...@@ -536,7 +536,12 @@ handle_edge_irq(unsigned int irq, struct irq_desc *desc)
{ {
atomic_spin_lock(&desc->lock); atomic_spin_lock(&desc->lock);
desc->status &= ~(IRQ_REPLAY | IRQ_WAITING); /*
* Edge irqs can be requested with IRQF_ONESHOT set. RT
* (ab)uses this for enforced irq threading, but we do not
* want to mask edge type interrupts. Clear the oneshot flag.
*/
desc->status &= ~(IRQ_REPLAY | IRQ_WAITING | IRQ_ONESHOT);
/* /*
* If we're currently running this IRQ, or its disabled, * 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,14 +556,8 @@ handle_edge_irq(unsigned int irq, struct irq_desc *desc)
} }
kstat_incr_irqs_this_cpu(irq, desc); kstat_incr_irqs_this_cpu(irq, desc);
/* Start handling the irq */ if (desc->chip->ack)
if (unlikely(desc->status & IRQ_ONESHOT)) { desc->chip->ack(irq);
desc->status |= IRQ_MASKED;
mask_ack_irq(desc, irq);
} else {
if (desc->chip->ack)
desc->chip->ack(irq);
}
/* Mark the IRQ currently in progress.*/ /* Mark the IRQ currently in progress.*/
desc->status |= IRQ_INPROGRESS; desc->status |= IRQ_INPROGRESS;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment