为什么不共享MSI中断?

val*_*iki 6 irq linux-device-driver linux-kernel embedded-linux pci-e

任何人都可以告诉为什么MSI中断在linux中不可共享.

基于PIN的中断可以由设备共享,但MSI中断不由设备共享,每个设备都有自己的MSI IRQ号.为什么不能共享MSI中断?

CL.*_*CL. 5

旧的INTx中断有两个有问题的属性:

  1. 每个INTx信号在硬件中需要单独的信号线; 和
  2. 中断信号独立于其他数据信号,并以异步方式发送.

后果是

  1. 多个设备和驱动程序需要能够共享中断(中断处理程序需要检查其设备是否实际引发了中断); 和
  2. 当驱动程序收到中断时,它需要读取某个设备寄存器,以确保设备发出的任何先前的DMA写操作都在CPU上可见.

通常,两种情况都由驱动程序读取其设备的中断状态寄存器来处理.

消息信号中断不需要单独的信号线,而是通过数据总线作为消息发送.这意味着相同的硬件可以支持更多的中断(因此不必共享它),并且中断消息会自动与任何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,并且中断处理程序检查它们是否是它们自己的引发中断的函数.


Kaz*_*Kaz 4

由于资源限制,中断共享是一种黑客行为,例如没有足够的物理 IRQ 线路来满足每个需要关注的设备。如果中断由具有较大 ID 空间的消息表示,那么为什么要这样做呢?

“那个”的意思是:为它们提供相同的身份,以便随后必须探测设备以找出与同一 ID 发生冲突的设备中哪些设备实际上发生了中断。

事实上,我们有时希望一台设备有多个中断。例如,如果中断 ID 不仅告诉我们哪个设备被中断,还告诉我们中断的原因:比如是由于输入的到达,还是由于输出缓冲区的耗尽?如果中断线“便宜”,因为它们只是具有大量位的软件 ID,那么我们可以拥有它。