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