|
@@ -540,19 +540,29 @@ handle_edge_irq(unsigned int irq, struct irq_desc *desc)
|
|
|
raw_spin_lock(&desc->lock);
|
|
|
|
|
|
desc->istate &= ~(IRQS_REPLAY | IRQS_WAITING);
|
|
|
+
|
|
|
/*
|
|
|
- * If we're currently running this IRQ, or its disabled,
|
|
|
- * we shouldn't process the IRQ. Mark it pending, handle
|
|
|
- * the necessary masking and go out
|
|
|
+ * If the handler is currently running, mark it pending,
|
|
|
+ * handle the necessary masking and go out
|
|
|
*/
|
|
|
- if (unlikely(irqd_irq_disabled(&desc->irq_data) ||
|
|
|
- irqd_irq_inprogress(&desc->irq_data) || !desc->action)) {
|
|
|
+ if (unlikely(irqd_irq_inprogress(&desc->irq_data))) {
|
|
|
if (!irq_check_poll(desc)) {
|
|
|
desc->istate |= IRQS_PENDING;
|
|
|
mask_ack_irq(desc);
|
|
|
goto out_unlock;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ /*
|
|
|
+ * If its disabled or no action available then mask it and get
|
|
|
+ * out of here.
|
|
|
+ */
|
|
|
+ if (irqd_irq_disabled(&desc->irq_data) || !desc->action) {
|
|
|
+ desc->istate |= IRQS_PENDING;
|
|
|
+ mask_ack_irq(desc);
|
|
|
+ goto out_unlock;
|
|
|
+ }
|
|
|
+
|
|
|
kstat_incr_irqs_this_cpu(irq, desc);
|
|
|
|
|
|
/* Start handling the irq */
|
|
@@ -601,18 +611,27 @@ void handle_edge_eoi_irq(unsigned int irq, struct irq_desc *desc)
|
|
|
raw_spin_lock(&desc->lock);
|
|
|
|
|
|
desc->istate &= ~(IRQS_REPLAY | IRQS_WAITING);
|
|
|
+
|
|
|
/*
|
|
|
- * If we're currently running this IRQ, or its disabled,
|
|
|
- * we shouldn't process the IRQ. Mark it pending, handle
|
|
|
- * the necessary masking and go out
|
|
|
+ * If the handler is currently running, mark it pending,
|
|
|
+ * handle the necessary masking and go out
|
|
|
*/
|
|
|
- if (unlikely(irqd_irq_disabled(&desc->irq_data) ||
|
|
|
- irqd_irq_inprogress(&desc->irq_data) || !desc->action)) {
|
|
|
+ if (unlikely(irqd_irq_inprogress(&desc->irq_data))) {
|
|
|
if (!irq_check_poll(desc)) {
|
|
|
desc->istate |= IRQS_PENDING;
|
|
|
goto out_eoi;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ /*
|
|
|
+ * If its disabled or no action available then mask it and get
|
|
|
+ * out of here.
|
|
|
+ */
|
|
|
+ if (irqd_irq_disabled(&desc->irq_data) || !desc->action) {
|
|
|
+ desc->istate |= IRQS_PENDING;
|
|
|
+ goto out_eoi;
|
|
|
+ }
|
|
|
+
|
|
|
kstat_incr_irqs_this_cpu(irq, desc);
|
|
|
|
|
|
do {
|