如果在硬中断环境中通过spin_unlock_irq错误地重新启用IRQ线,可能会出现哪种副作用?换句话说,为什么spin_lock_irq()/ spin_unlock_irq()对在那里不鼓励呢?
答案 0 :(得分:1)
因为比如说,如果中断是OFF,那么你获得spin_lock_irq
然后spin_unlock_irq
。此spin_unlock_irq
将再次启用中断。但是你已经从系统状态开始,其中中断是关闭的,现在它们是开启的。这是不可取的。
所以,你使用spin_lock_irqsave
做的是 *保存/保存 * IRQ的状态(ON或OFF),当你执行spin_lock_irqrestore
时,你返回到获得锁定之前设置的IRQ状态。
来自http://www.linuxjournal.com/article/5833:
调用spin_unlock_irqrestore()后,中断将恢复为 获得锁定的状态。
<强>风险:强> 当中断应该被禁用并且你启用它并且有一个正在运行的IRQ处理程序(禁用IRQ)可能导致中断嵌套,并且过多的嵌套会导致系统崩溃(例如,中断成千上万的网络IRQ)一秒钟内的时间。)
来自内核源代码:
<强> spin_lock_irq 强>
326 static inline void spin_lock_irq(spinlock_t *lock)
327 {
328 raw_spin_lock_irq(&lock->rlock);
329 }
331 #define spin_lock_irqsave(lock, flags) \
332 do { \
333 raw_spin_lock_irqsave(spinlock_check(lock), flags); \
334 } while (0)
在这里,您首先检查IRQ
的状态并保留它。
290 static inline raw_spinlock_t *spinlock_check(spinlock_t *lock)
291 {
292 return &lock->rlock;
293 }
您可以找到spin_unlock_irq
&amp;的类似来源spin_unlock_irqrestore