如何在中断处理程序(获取锁定)中禁用本地中断可能导致双重获取死锁?

时间:2014-03-14 02:50:27

标签: linux-kernel kernel linux-device-driver

在Linux内核开发书(Robert Love)中,提到:

  

我们必须在获得自旋锁之前禁用本地中断   中断处理程序否则可能是中断处理程序   在锁定并尝试时中断内核代码   重新获得锁定。这最终可以导致双重收购   死锁。

现在我怀疑是:

  1. 一般情况下,do_IRQ()是否禁用本地中断?
  2. 如果获取了锁,则意味着preempt_count变量不为零,这使得没有其他处理程序可以获得机会,因为内核不是preempt_safe。那么在这种情况下其他中断处理程序如何工作呢?

1 个答案:

答案 0 :(得分:2)

首先,do_IRQ()函数dosn禁用本地中断,但是用汇编语言编写的某些函数会执行,即中断入口。然后,在执行request_irq()注册的中断函数之前,在函数handle_IRQ_event()中,还将request_irq()传递的标志与IRQF_DISABLED进行比较,以确定是否应启用本地执行中断功能时中断。因此,问题1的答案取决于您传递给request_irq()函数的标志。

其次,preempt_count只意味着进程上下文中的内核抢占,而不是中断。为了避免在UP中执行中断处理程序,唯一的方法是涉及irqs_disable()。当preempt_count为零时,它表示内核可以安全地进行过程切换,否则不行。