Re: [Question] spin_lock in interrupt handler.

From: Steven Rostedt
Date: Fri Nov 18 2005 - 17:44:31 EST


On Fri, 2005-11-18 at 16:37 +0800, liyu wrote:
> Hi, every one in LKML.
>
> I have one question about how to use spin_lock.
>
> I read Documentation/spinlocks.txt wrote by Linus. The Lesson 1 and
> 2 are simple for me.
> But I confused in Lesson 3. The most doublt is why we can not use
> spin_lock_irq*() version in
> interrupt handler?
>
> At i386, I known the interrupt is disabled in interrupt handler. I
> think this feature is
> supplied in handware-level. The spin_lock_irqrestore() will use 'sti'
> instruction internal, it will change interrupt mask bit in FLAGS
> register, do this have re-enable interrupt, even in interrput handler? I
> can not sure this.

Hello once again Liyu ;-)

I don't see where he says you can't use spin_lock_irq* in interrupt
handlers. He only says that you are safe to use the non-irq* versions
IFF (if and only if) the locks are not used in interrupts.

So, (copied from the text itself):

---
The reasons you mustn't use these versions if you have interrupts that
play with the spinlock is that you can get deadlocks:

spin_lock(&lock);
...
<- interrupt comes in:
spin_lock(&lock);
---

If you hold a spin lock without interrupts disabled, and an interrupt
happens on the same CPU that holds the lock, and that interrupt handler
tries to grab the lock it will just spin until that lock is released,
which will _never_ happen, since the lock is held by the process that
was interrupted, and will not run until the interrupt (that's spinning)
is done. So you have a deadlock.

Clear?

-- Steve




-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/