如何保证在获取msi中断时所有DMA数据都写入ram?

How to guarantee all DMA data write into ram when getting msi interrupt?

有些问题让我很困惑:

  1. Msi中断是内存写请求。 msi能保证所有的DMA数据都写入ram了吗?还是只保证pci bridge上的数据已经完全传输?

  2. 如果msi中断只保证pci桥上的数据传输完全。如何保证在获取msi中断时所有DMA数据写入ram?

  3. msi内存写请求真的写入ram了吗?

提前致谢。

确保在 MSI 写入之前将 DMA 数据写入总线是设备的责任。在 driver/OS 需要查看的关于设备请求的所有内容都已完成之前,设备不应发出 MSI 写入,无论这需要内存读取、内存写入还是其他任何操作。但是,假设设备已经以适当的顺序(在总线上)完成了事情(DMA 写入,然后是 MSI 写入),然后由主机桥确保数据被写入 RAM正确的顺序。但通常 MSI 写入本身与任何保证无关。主机桥简单地确保其内存事务按照给定的顺序执行(并且内存子系统确保所有 CPU 和外围设备之间的一致性,以便即使存在缓存等,数据也似乎已以正确的顺序写入内存).

关于你的问题 3,当你在设备寄存器中设置 MSI 时,MSI 写入到设备被告知发送它的任何地方。通常,"MSI memory write" 指向与系统中断控制器关联的地址,而不是实际的 RAM,但 OS/driver 有责任配置正确的地址。