在 Linux Kernel Development book (Robert Love) 中,提到:
we must disable local interrupts before obtaining spinlock in interrupt handler. Otherwise it is possible for an interrupt handler to interrupt kernel code while the lock is held and attempt to re-acquire the lock. Which finally can lead to double-acquire deadlock.
现在我的疑问是:
- 一般来说,
do_IRQ()
不是禁用本地中断吗? - 如果获得锁,则意味着
preempt_count
变量不为零,这使得其他处理程序不应该有机会,因为内核不是preempt_safe
。那么其他中断处理程序如何在这种情况下工作?
最佳答案
首先,do_IRQ()
函数并没有关闭本地中断,而是一些用汇编语言编写的函数关闭了,这就是中断入口。之后,在执行通过request_irq()
注册的中断函数之前,在函数handle_IRQ_event()
中也通过request_irq()
传递的标志是与IRQF_DISABLED
比较,判断在执行中断函数时是否开启本地中断。因此,第一个问题的答案取决于您传递给 request_irq()
函数的标志。
其次,preempt_count
只是表示进程上下文中的内核抢占,而不是中断。为避免中断处理程序在 UP 中执行,唯一的方法是使用 irqs_disable()
。当preempt_count
为零时,表示内核可以安全地进行进程切换,否则不能。
关于linux-kernel - 不禁用中断处理程序(获取锁)中的本地中断如何导致双重获取死锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22395248/