带vfio的MSI-X表KVM PCIe直通

问题描述

我正在研究需要PCIe直通(也称为virtio-passthrough)和Intel x86 cpu和KVM的项目。

有一种有趣的情况,来宾中经过的设备正在正确配置向量表中的所有条目。但是,如果从主机看,该表将被填充,但是所有向量“ Mask Interrupt”都将置位。请注意,功能寄存器会将值设置为“启用”,并将“掩码设置为0”。当Guest程序MSI-X控制寄存器注册时,就会发生这种情况。

有趣的是,PBA位也与Guest看到的同步。向量表中只有MSI-X向量控制设置为“ 1”。

Target offset is 0x0,page size is 4096
mmap(0,4096,0x3,0x1,3,0x0)
PCI Memory mapped to address 0x7f5f2d957000.
0x0000: 0x00000000
...
0x000C: 0x00000001
0x0010: 0x00000000
...
0x001C: 0x00000001
0x0020: 0x00000000

PBA:

Target offset is 0x1000,0x1000)
PCI Memory mapped to address 0x7fc7e890d000.
0x1000: 0x00000003
0x1004: 0x00000000
0x1008: 0xFFFFFFFF

PS:使用pcimem实用程序执行MMIO读取。

在上述情况下,来宾看到的设备配置了MSI-X,执行了DMA并最终超时,以等待请求完成(PCIe跟踪显示它正在等待中断)。

我的论文是MSI-X中断没有路由到Guest(当然是通过IOMMU),因为中断被屏蔽了。但是,从客户角度来看,可以自由执行DMA。而且第一个请求失败。

我需要帮助调试此问题。

我正在浏览[vfio_pci](https://elixir.bootlin.com/linux/v5.4.61/source/drivers/vfio/pci代码,希望找到MSI-X地址映射将在哪里完成。特别是,尝试调试主机(KVM)如何知道对该表进行编程的时间,以便找到合适的地址。

任何指向方向的指针都会有很大帮助!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)