【发布时间】:2015-12-03 02:57:14
【问题描述】:
假设有一个端口映射的 I/O 设备在 IRQ 线上任意产生中断。可以通过对特定寄存器的单个 outb 调用来清除设备的挂起中断。
此外,假设后续中断处理程序通过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 之前产生了另一个中断,会发生什么?
我能想到三种情况:
- 由于设备和 Linux 内核之间的死锁,IRQ 行冻结并且无法再处理。
- Linux 内核在返回后立即再次执行
handler,以处理第二个中断。 - Linux 内核中断
handler,第二次调用handler。
【问题讨论】:
标签: linux linux-kernel interrupt race-condition interrupt-handling