Проблема с пробросом PCI в KVM.
Всем привет, обитатели ЛОРа. Решил я приготовить KVM с проброшенной видеокартой и частью USB-девайсов, готовил по этому и этому рецептам с некоторыми дополнениями, специфичными для конкретного железа. Т.к. нВидии не пробрасываются, а удостовериться в работе проброса было нужно, я попробовал пробросить другие девайсы, прежде чем вкручивать радик. Тут и выявилась проблема: Если девайс не является единственным на шине, то он не пробрасывается. Пример такого девайса:
07:07.0 FireWire (IEEE 1394): VIA Technologies, Inc. VT6306/7/8 [Fire II(M)] IEEE 1394 OHCI Controller (rev c0)
На примере:
# rmmod kvm_amd kvm
# modprobe kvm allow_unsafe_assigned_interrupts=1
# modprobe kvm_amd
# modprobe pci_stub
# lspci -n | grep 07.07.0
07:07.0 0c00: 1106:3044 (rev c0)
# echo "1106 3044" > /sys/bus/pci/drivers/pci-stub/new_id
# echo 0000:07:07.0 > /sys/bus/pci/devices/0000:07:07.0/driver/unbind
# echo 0000:07:07.0 > /sys/bus/pci/drivers/pci-stub/bind
# qemu-kvm -m 1024 -boot c -hda disk.img -net none -device pci-assign,host=07:07.0
PCI region 0 at address 0xfe100000 has size 0x800, which is not a multiple of 4K. You might experience some performance hit due to that.
Failed to assign device "(null)" : Device or resource busy
*** The driver 'pci-stub' is occupying your device 0000:07:07.0.
***
*** You can try the following commands to free it:
***
*** $ echo "1106 3044" > /sys/bus/pci/drivers/pci-stub/new_id
*** $ echo "0000:07:07.0" > /sys/bus/pci/drivers/pci-stub/unbind
*** $ echo "0000:07:07.0" > /sys/bus/pci/drivers/pci-stub/bind
*** $ echo "1106 3044" > /sys/bus/pci/drivers/pci-stub/remove_id
***
qemu-kvm: -device pci-assign,host=07:07.0: Device 'pci-assign' could not be initialized
[ 2105.116406] kvm: Nested Virtualization enabled
[ 2105.116409] kvm: Nested Paging enabled
[ 2277.957440] pci-stub 0000:07:07.0: claimed by stub
[ 2332.894863] pci-stub 0000:07:07.0: claimed by stub
Железки: Мать - ASUS SABERTOOTH 990FX, CPU - AMD FX-8120.
Ядро: 3.7.10
Параметры запуска ядра в GRUB'e:
iommu=pt iommu=1 amd_iommu=fullflush
# dmesg | grep -e AMD-Vi -e IOMMU
[ 2.489248] AMD-Vi: Found IOMMU at 0000:00:00.2 cap 0x40
[ 2.571258] AMD-Vi: Initialized for Passthrough Mode
Флаги, с которыми QEMU был собран:
aio alsa caps curl jpeg ncurses opengl png sdl seccomp threads uuid vhost-net vnc