任何人都可以告诉为什么 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 注册中断。 ,中断处理程序检查是否是他们自己的函数引发了中断。


    评论关闭
    IT干货网

    微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!