【发布时间】:2015-12-20 13:31:36
【问题描述】:
谁能说出为什么 MSI 中断在 linux 中不可共享。
设备可以共享基于 PIN 的中断,但设备不共享 MSI 中断,每个设备都有自己的 MSI IRQ 号。为什么不能共享 MSI 中断?
【问题讨论】:
标签: linux-kernel linux-device-driver embedded-linux pci-e irq
谁能说出为什么 MSI 中断在 linux 中不可共享。
设备可以共享基于 PIN 的中断,但设备不共享 MSI 中断,每个设备都有自己的 MSI IRQ 号。为什么不能共享 MSI 中断?
【问题讨论】:
标签: linux-kernel linux-device-driver embedded-linux pci-e irq
旧的 INTx 中断有两个问题属性:
后果是这样的
通常,这两种情况都由驱动程序读取其设备的中断状态寄存器来处理。
消息信号中断不需要单独的信号线,而是通过数据总线作为消息发送。这意味着相同的硬件可以支持更多的中断(因此没有必要共享它),并且中断消息会自动与任何 DMA 访问同步。因此,中断处理程序不需要做任何事情;保证中断来自其设备,并且保证 DMA 数据已经到达。
如果编写某些驱动程序来共享某些 MSI,中断处理程序将再次检查中断是否真的来自它自己的设备,并且与 INTx 中断相比没有优势。
不共享 MSI 是因为它不会可能,而是因为它不是必需。
请注意,共享一个 MSI 实际上是可能的:从/proc/interrupts 的这段摘录中可以看出,高级错误报告、电源管理事件和热插拔驱动程序共享一个中断:
64: 0 0 PCI-MSI-edge aerdrv, PCIe PME, pciehp
这些驱动程序实际上连接到相同设备,但它们的行为仍然类似于 INTx 驱动程序,即它们向IRQF_SHARED 注册它们的中断,并且中断处理程序检查它是否是它们自己的引发中断的函数。
【讨论】:
由于资源限制,中断共享是一种黑客攻击,例如没有足够的物理 IRQ 线路供每个需要关注的设备使用。如果中断由具有大 ID 空间的消息表示,您为什么要这样做?
“那个”的意思是:给他们相同的身份,然后必须探测设备以确定哪些设备与相同的 ID 冲突实际上被中断了。
事实上,我们有时希望一个设备有多个中断。例如,如果中断 ID 不仅可以告诉我们哪个设备被中断,还告诉我们为什么中断:例如是由于输入的到达,还是输出缓冲区的耗尽?如果中断线是“便宜的”,因为它们只是具有很多位的软件 ID,我们可以拥有它。
【讨论】: