任何人都可以告诉为什么 MSI 中断在 linux 中不可共享。
设备可以共享基于 PIN 的中断,但设备不共享 MSI 中断,每个设备都有自己的 MSI IRQ 编号。为什么不能共享 MSI 中断?
请您参考如下方法:
旧的 INTx 中断有两个有问题的属性:
后果是
通常,这两种情况都由驱动程序读取其设备的中断状态寄存器来处理。
消息信号中断不需要单独的信号线,而是作为消息通过数据总线发送。这意味着相同的硬件可以支持更多的中断(因此没有必要共享它),并且中断消息会自动与任何 DMA 访问同步。因此,中断处理程序不需要做任何事情;中断保证来自它的设备,并且保证DMA的数据已经到达。
如果某些驱动程序被编写为共享某些 MSI,则中断处理程序将再次必须检查中断是否确实来自其自己的设备,并且与 INTx 中断相比没有优势。
MSI 不共享,因为它不可能,但因为它没有必要。
请注意,实际上可以共享 MSI:如
/proc/interrupts 的摘录所示、高级错误报告、电源管理事件和热插拔驱动程序共享一个中断:
64: 0 0 PCI-MSI-edge aerdrv, PCIe PME, pciehp
这些驱动程序实际上连接到同一个设备,但它们的行为仍然与 INTx 驱动程序相似,即它们使用
IRQF_SHARED 注册中断。 ,中断处理程序检查是否是他们自己的函数引发了中断。




