diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2011-02-06 19:24:07 -0500 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2011-02-19 06:58:12 -0500 |
commit | a60a5dc2db3b08b3c2900614c43b1262410c2d8c (patch) | |
tree | 74fc245bc6ddc7c134daa29bab83e43dd8258611 /kernel/irq/chip.c | |
parent | a7ae4de5c8ae8110556f0f9c7241093ef984605c (diff) |
genirq: Use handle_irq_event() in handle_edge_irq()
It's safe to drop the IRQ_INPROGRESS flag between action chain walks
as we are protected by desc->lock.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'kernel/irq/chip.c')
-rw-r--r-- | kernel/irq/chip.c | 16 |
1 files changed, 2 insertions, 14 deletions
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c index a499ca5b11aa..3ccff4d55b39 100644 --- a/kernel/irq/chip.c +++ b/kernel/irq/chip.c | |||
@@ -583,14 +583,8 @@ handle_edge_irq(unsigned int irq, struct irq_desc *desc) | |||
583 | /* Start handling the irq */ | 583 | /* Start handling the irq */ |
584 | desc->irq_data.chip->irq_ack(&desc->irq_data); | 584 | desc->irq_data.chip->irq_ack(&desc->irq_data); |
585 | 585 | ||
586 | /* Mark the IRQ currently in progress.*/ | ||
587 | desc->status |= IRQ_INPROGRESS; | ||
588 | |||
589 | do { | 586 | do { |
590 | struct irqaction *action = desc->action; | 587 | if (unlikely(!desc->action)) { |
591 | irqreturn_t action_ret; | ||
592 | |||
593 | if (unlikely(!action)) { | ||
594 | mask_irq(desc); | 588 | mask_irq(desc); |
595 | goto out_unlock; | 589 | goto out_unlock; |
596 | } | 590 | } |
@@ -606,16 +600,10 @@ handle_edge_irq(unsigned int irq, struct irq_desc *desc) | |||
606 | unmask_irq(desc); | 600 | unmask_irq(desc); |
607 | } | 601 | } |
608 | 602 | ||
609 | desc->status &= ~IRQ_PENDING; | 603 | handle_irq_event(desc); |
610 | raw_spin_unlock(&desc->lock); | ||
611 | action_ret = handle_IRQ_event(irq, action); | ||
612 | if (!noirqdebug) | ||
613 | note_interrupt(irq, desc, action_ret); | ||
614 | raw_spin_lock(&desc->lock); | ||
615 | 604 | ||
616 | } while ((desc->status & (IRQ_PENDING | IRQ_DISABLED)) == IRQ_PENDING); | 605 | } while ((desc->status & (IRQ_PENDING | IRQ_DISABLED)) == IRQ_PENDING); |
617 | 606 | ||
618 | desc->status &= ~IRQ_INPROGRESS; | ||
619 | out_unlock: | 607 | out_unlock: |
620 | raw_spin_unlock(&desc->lock); | 608 | raw_spin_unlock(&desc->lock); |
621 | } | 609 | } |