Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b42172fc authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Don't call "note_interrupt()" with irq descriptor lock held



This reverts commit f72fa707, and solves
the problem that it tried to fix by simply making "__do_IRQ()" call the
note_interrupt() function without the lock held, the way everybody else
does.

It should be noted that all interrupt handling code must never allow the
descriptor actors to be entered "recursively" (that's why we do all the
magic IRQ_PENDING stuff in the first place), so there actually is
exclusion at that much higher level, even in the absense of locking.

Acked-by: default avatarVivek Goyal <vgoyal@in.ibm.com>
Acked-by: default avatarPavel Emelianov <xemul@openvz.org>
Cc: Andrew Morton <akpm@osdl.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Adrian Bunk <bunk@stusta.de>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 0f9005a6
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -231,10 +231,10 @@ fastcall unsigned int __do_IRQ(unsigned int irq)
		spin_unlock(&desc->lock);

		action_ret = handle_IRQ_event(irq, action);

		spin_lock(&desc->lock);
		if (!noirqdebug)
			note_interrupt(irq, desc, action_ret);

		spin_lock(&desc->lock);
		if (likely(!(desc->status & IRQ_PENDING)))
			break;
		desc->status &= ~IRQ_PENDING;
+1 −5
Original line number Diff line number Diff line
@@ -147,11 +147,7 @@ void note_interrupt(unsigned int irq, struct irq_desc *desc,
	if (unlikely(irqfixup)) {
		/* Don't punish working computers */
		if ((irqfixup == 2 && irq == 0) || action_ret == IRQ_NONE) {
			int ok;

			spin_unlock(&desc->lock);
			ok = misrouted_irq(irq);
			spin_lock(&desc->lock);
			int ok = misrouted_irq(irq);
			if (action_ret == IRQ_NONE)
				desc->irqs_unhandled -= ok;
		}