val*_*iki 6 irq linux-device-driver linux-kernel embedded-linux pci-e
任何人都可以告诉为什么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
Run Code Online (Sandbox Code Playgroud)
这些驱动程序实际上连接到同一个设备,但它们的行为仍然类似于INTx驱动程序,即它们注册了它们的中断IRQF_SHARED
,并且中断处理程序检查它们是否是它们自己的引发中断的函数.
由于资源限制,中断共享是一种黑客行为,例如没有足够的物理 IRQ 线路来满足每个需要关注的设备。如果中断由具有较大 ID 空间的消息表示,那么为什么要这样做呢?
“那个”的意思是:为它们提供相同的身份,以便随后必须探测设备以找出与同一 ID 发生冲突的设备中哪些设备实际上发生了中断。
事实上,我们有时希望一台设备有多个中断。例如,如果中断 ID 不仅告诉我们哪个设备被中断,还告诉我们中断的原因:比如是由于输入的到达,还是由于输出缓冲区的耗尽?如果中断线“便宜”,因为它们只是具有大量位的软件 ID,那么我们可以拥有它。