假設有一個端口映射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處理邏輯禁用一段時間。 –