从中断处理程序中重新启用IRQ行的副作用

时间:2014-04-18 01:00:00

标签: linux-kernel kernel

如果在硬中断环境中通过spin_unlock_irq错误地重新启用IRQ线,可能会出现哪种副作用?换句话说,为什么spin_lock_irq()/ spin_unlock_irq()对在那里不鼓励呢?

1 个答案:

答案 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 }

spin_lock_irqsave

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