在SMP机器上,我们必须使用spin_lock_irqsave而不是来自中断上下文的spin_lock_irq

为什么我们要保存标志(包含IF)?

是否有另一个中断例程可以中断我们?

最佳答案

我是内核的新手,但是从我从罗伯特·洛夫(Robert Love)的书“Linux Kernel Development”(Linux内核开发)中了解到的情况来看,如果在代码开始锁定之前已在处理器上禁用了中断,则在调用spin_unlock_irq时,您将以错误的方式释放锁定。如果保存标志并与标志一起释放,则spin_lock_irqsave函数将使中断返回其先前状态。
spin_lock_irqsave的示例

spinlock_t mLock = SPIN_LOCK_UNLOCK;
unsigned long flags;

spin_lock_irqsave(&mLock, flags); // save the state, if locked already it is saved in flags
// Critical section
spin_unlock_irqrestore(&mLock, flags); // return to the formally state specified in flags

带有spin_lock_irq的示例(不带irqsave):
spinlock_t mLock = SPIN_LOCK_UNLOCK;
unsigned long flags;

spin_lock_irq(&mLock); // Does not know if already locked
// Critical section
spin_unlock_irq(&mLock); // Could result in an error unlock...

关于linux-kernel - spin_lock_irqsave和spin_lock_irq,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2559602/

10-10 14:34