PCI 直通 KVM 与 vfio-pci 在 PCI 探针上提供 EINVAL

PCI 直通 KVM 与 vfio-pci 在 PCI 探针上提供 EINVAL

我正在尝试将 PCIe 设备以直通方式连接到我的 KVM 域。我在一个 IOMMU 组中有两台设备 (#28):

03:00.0 PCI bridge: Texas Instruments XIO2001 PCI Express-to-PCI Bridge
04:00.0 Multimedia audio controller: Texas Instruments TMS320C6414 TMS320C6415 TMS320C6416

lspci -n价值观:

03:00.0 0604: 104c:8240
04:00.0 0401: 104c:a106

我运行的是 Ubuntu 14.04。我有:

  • 安装 KVM,设置域,确保加载 KVM 和 vfio-pci 模块
  • 在内核命令行上设置 intel_iommu=on 并使用 dmesg 验证其已启用
  • kvm-ok打印加速已设置完毕,芯片组支持 VT-d
  • 已验证 03:00.0 设备当前没有列出的驱动程序ls -l /sys/bus/pci/devices/0000\:03\:00.0/

所以我这样做是为了将设备绑定到 vfio-pci:

# echo "104c a106" > /sys/bus/pci/drivers/vfio-pci/new_id
# echo "104c 8240" > /sys/bus/pci/drivers/vfio-pci/new_id

然后:

root@tupac:~# echo "0000:03:00.0" > /sys/bus/pci/drivers/vfio-pci/bind 
bash: echo: write error: No such device

但是,多媒体控制器显示 AOK:

root@tupac:~# ls -l /sys/bus/pci/drivers/vfio-pci/
total 0
lrwxrwxrwx 1 root root    0 Feb 24 13:07 0000:04:00.0 -> ../../../../devices/pci0000:00/0000:00:02.2/0000:03:00.0/0000:04:00.0
--w------- 1 root root 4096 Feb 24 13:05 bind
lrwxrwxrwx 1 root root    0 Feb 24 13:07 module -> ../../../../module/vfio_pci
--w------- 1 root root 4096 Feb 24 13:15 new_id
--w------- 1 root root 4096 Feb 23 19:47 remove_id
--w------- 1 root root 4096 Feb 23 19:43 uevent
--w------- 1 root root 4096 Feb 24 13:07 unbind

03:00.0(这是一个 PCIe 到 PCI 适配器)未显示在vfio-pci的设备下。同样,当尝试使用 kvm 托管配置时,我得到:

virsh # start rivendell
error: Failed to start domain rivendell
error: Failed to bind PCI device '0000:03:00.0' to vfio-pci: No such device

在 syslog 下我得到了我认为是 PCIe EINVAL 代码:

Feb 23 19:46:46 tupac kernel: [  214.159625] vfio-pci: probe of 0000:03:00.0 failed with error -22

是什么原因造成的?这是否与适配器后面的系统中存在 PCI 总线有关?

答案1

vfio-pci不支持桥接。

与需要一起分配 iommu 组的建议相反,正确的做法是仅分配网桥另一侧的设备,然后它就可以在来宾中正常显示。

答案2

本论坛带我去这个 github 仓库其中包含脚本 vfio-pci-bind.sh,它在尝试将第二个无线卡绑定到 vfio-pci 驱动程序时为我解决了这个问题。

语法是vfio-pci-bind.sh 0000:00:00.00000:00:00.0的设备 ID。

相关内容