]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blobdiff - kernel/irq/chip.c
genirq: Delay incrementing interrupt count if it's disabled/pending
[mirror_ubuntu-zesty-kernel.git] / kernel / irq / chip.c
index 15206453b12aab09cf96dd09cc3fa2da92fd9c14..05e29de579331cbc0923036275d95f844db7d677 100644 (file)
@@ -338,7 +338,6 @@ void handle_nested_irq(unsigned int irq)
        raw_spin_lock_irq(&desc->lock);
 
        desc->istate &= ~(IRQS_REPLAY | IRQS_WAITING);
-       kstat_incr_irqs_this_cpu(desc);
 
        action = desc->action;
        if (unlikely(!action || irqd_irq_disabled(&desc->irq_data))) {
@@ -346,6 +345,7 @@ void handle_nested_irq(unsigned int irq)
                goto out_unlock;
        }
 
+       kstat_incr_irqs_this_cpu(desc);
        irqd_set(&desc->irq_data, IRQD_IRQ_INPROGRESS);
        raw_spin_unlock_irq(&desc->lock);
 
@@ -412,13 +412,13 @@ void handle_simple_irq(struct irq_desc *desc)
                goto out_unlock;
 
        desc->istate &= ~(IRQS_REPLAY | IRQS_WAITING);
-       kstat_incr_irqs_this_cpu(desc);
 
        if (unlikely(!desc->action || irqd_irq_disabled(&desc->irq_data))) {
                desc->istate |= IRQS_PENDING;
                goto out_unlock;
        }
 
+       kstat_incr_irqs_this_cpu(desc);
        handle_irq_event(desc);
 
 out_unlock:
@@ -462,7 +462,6 @@ void handle_level_irq(struct irq_desc *desc)
                goto out_unlock;
 
        desc->istate &= ~(IRQS_REPLAY | IRQS_WAITING);
-       kstat_incr_irqs_this_cpu(desc);
 
        /*
         * If its disabled or no action available
@@ -473,6 +472,7 @@ void handle_level_irq(struct irq_desc *desc)
                goto out_unlock;
        }
 
+       kstat_incr_irqs_this_cpu(desc);
        handle_irq_event(desc);
 
        cond_unmask_irq(desc);
@@ -532,7 +532,6 @@ void handle_fasteoi_irq(struct irq_desc *desc)
                goto out;
 
        desc->istate &= ~(IRQS_REPLAY | IRQS_WAITING);
-       kstat_incr_irqs_this_cpu(desc);
 
        /*
         * If its disabled or no action available
@@ -544,6 +543,7 @@ void handle_fasteoi_irq(struct irq_desc *desc)
                goto out;
        }
 
+       kstat_incr_irqs_this_cpu(desc);
        if (desc->istate & IRQS_ONESHOT)
                mask_irq(desc);