本文首先介绍为什么要有PCI Stub driver,然后以一个具体的例子演示如何使用PCI Stub driver。

1.为什么要有PCI Stub driver

当你在当前Linux主机上运行时,一个e1000e的Intel PCIe网卡已经和一个e1000e的驱动结合。当你在主机上再运行一个虚拟机,并将该Intel PCIe网卡passthru给虚拟机时,就会出现问题:虚拟机想自己驱动这个e1000e网卡,e1000e网卡已经有主机上的驱动了,但是一个设备只能有一个驱动,因而会产生冲突。

解决方案:

  1. 将pci设备跟目前绑定的驱动分离

  2. 将pci设备交予PCI Stub driver接管

    • PCI Stub driver是虚拟的driver
    • 当pci设备交予PCI Stub driver接管后,主机上的驱动就不能与该pci设备绑定了
    • pci-stub driver was introduced to occupy the driver slot for the pci device
  3. 将pci设备交给虚拟机,这样虚拟机就可以驱动pci设备了

2.如何使用PCI Stub driver

在本例子中,pci设备为:IGD(Intel Graphics Device),其bdf为0:2:0。

1
2
3
4
5
gpudevice=`cat /sys/bus/pci/devices/0000:00:02.0/device`

echo "8086 $gpudevice" > /sys/bus/pci/drivers/pci-stub/new_id
echo "0000:00:02.0" > /sys/bus/pci/devices/0000:00:02.0/driver/unbind
echo "0000:00:02.0" > /sys/bus/pci/drivers/pci-stub/bind

第一行获取IGD 的device id。
gpudevice为IGD的device id。

device id是pci config中的Device ID,该值由硬件提供商设置。

第二行指令将IGD的vendor id与device id写入new_id文件中。

第三行指令的作用是解除IGD与当前驱动的绑定。

第四行完成IGD与pci-stub driver的绑定

ls -l /sys/bus/pci/devices/0000\:00\:02.0/driver

现在可以看到IGD的驱动已经是pci-stub 了。

new_id, unbindbind的更多介绍请阅读:sysfs-bus-pci


参考资料:

  1. PCI Stub driver是干什么的的
  2. PCI-STUB vs VFIO-PCI
  3. PCI Drivers
  4. PCI configuration space