【问题标题】:Why are MSI interrupts not shared?为什么不共享 MSI 中断?
【发布时间】:2015-12-20 13:31:36
【问题描述】:

谁能说出为什么 MSI 中断在 linux 中不可共享。

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

【问题讨论】:

    标签: linux-kernel linux-device-driver embedded-linux pci-e irq


    【解决方案1】:

    旧的 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
    

    这些驱动程序实际上连接到相同设备,但它们的行为仍然类似于 INTx 驱动程序,即它们向IRQF_SHARED 注册它们的中断,并且中断处理程序检查它是否是它们自己的引发中断的函数。

    【讨论】:

      【解决方案2】:

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

      “那个”的意思是:给他们相同的身份,然后必须探测设备以确定哪些设备与相同的 ID 冲突实际上被中断了。

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

      【讨论】:

        猜你喜欢
        • 2020-10-31
        • 1970-01-01
        • 2017-10-28
        • 2017-09-12
        • 2012-06-22
        • 2014-05-18
        • 1970-01-01
        • 1970-01-01
        • 2020-11-20
        相关资源
        最近更新 更多