假设有一个端口映射I/O设备,它在IRQ线上任意生成中断。该器件的待处理中断可以通过一个调用特定寄存器的outb
来清除。Linux IRQ处理程序中的固有争用条件
此外,假设后续的中断处理程序是通过request_irq
分配给相关的IRQ线:
irqreturn_t handler(int irq, void *data)
{
/* clear pending IRQ on device */
outb(0, CLEAR_IRQ_REGISTER_ADDR);
/* device may generate another IRQ at this point,
* but this handler function has not yet returned */
/* signal kernel that IRQ has been handled */
return IRQ_HANDLED;
}
是否有这个IRQ处理程序中固有的竞争条件?例如,如果设备在“清除IRQ”outb
呼叫之后但在handler
函数返回IRQ_HANDLED
之前生成另一个中断,会发生什么情况?
我能想到的三种情形:
- IRQ线冻结,不能再是由于设备和Linux内核之间的僵局处理。
- Linux内核在返回后立即再次执行
handler
,以处理第二个中断。 - Linux内核中断
handler
第二次调用handler
。
假设我返回'IRQ_NONE'而不是'IRQ_HANDLED':处理程序是否仍会被再次调用,或者这种情况会导致死锁? –
如果不共享或共享,并且所有处理程序都返回'IRQ_NONE',则它将被再次调用,但可能会被虚假的IRQ处理逻辑禁用一段时间。 –