在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...