Обнаружил интересную вещь, с которой получается пробрасывать видюху через pci-assign без перезагрузки хоста, даже запуская гостевую систему, которая НЕ умеет выключать устройство (видюху) без перезагрузки.
Как это получилось. Сначала возился с vfio, и естесно, ничего не получилось, точнее, получилось, но всё кроме, собственно, работы драйвера с видеокартой. Имеем и факт проброса и драйвер устанавливается и на седьмой оффтопик и на 8.1, но работать с ним отказывается, вываливается в BSOD, однако со стандартным vga драйвером оффтопика изображение выводится. Первый раз плюнул на это дело и решил через pci-assign. В принципе ничего плохого в выключении устройстава перед завершением работы гостя, но всё же 8.1 хоть ты тресни не нравится. Решил ещё раз опробовать vfio, опять та же история, но перейдя после этой попытки обратно к pci-assign решил ещё раз ради прикола посмотреть как моя система повиснет (первый раз повисла так, что и хард резет не срабатывал, пришлось шнур питания вытащить на несколько минут), но она к моему изумлению не повисла, мало того, BSOD не вылез и я увидел наполнившийся красками стандарной обоины 8.1 второй монитор, не поверил, ещё раз перезапустил - работает, с полным ускорением и без просадки производительности.
Получается тем, у кого не срослось с vfio вполне можно как-то обойтись и с pci-assign без всяких перезагрузок и отключений видюх. Вопрос ко всем - встречал ли кто подобное у себя? Цель - найти способ сбрасывать видюху с помощью vfio без обязательного предварительного фейлового запуска виртуалки с vfio.
Набор железа (vt-d/iommu совместимое):
CPU: Intel Core i7-4765T
MB: Gigabyte GA-Z87X-UD3H (bios F8)
RAM: 32 ГБ
Видео для проброса: Radeon HD 4850
Видео на хосте: встроенка в процессор (Intel HD Graphics 4600) с опенсорсным драйвером от intel
Обращаю внимание на материнскую плату, в сети её упоминания с виртуалками не видел, поэтому констатирую факт, что vt-d/iommu РАБОТАЕТ ПОЛНОСТЬЮ. Уверен, аналогично работает и в других материнках Gigabyte на Z87 (упоминание в официальных pdf манах о наличии опции vt-d у них тоже есть). Перепрошивал в своей биос с F3 на F8, впрочем и на старом vt-d работает.
Насчёт видюхи - официально самими AMD тестировалась в xen и заявлена там как пробрасываемая (пробовал сам в xen - работает), но по части vfio+HD4ххх никаких историй в сети не обнаружил, вот только с pci-assign завелась.
Пробовал резет видюхи без перезагрузки вот таким способом:
$ echo "1" > /sys/bus/pci/devices/0000:01:00.0/reset
но дохлый номер, не срабатывает.
Конфиг qemu q35+vfio:
QEMU_AUDIO_DRV=alsa \
qemu-system-x86_64 \
-boot menu=on \
-enable-kvm \
-M q35 \
-m 8192 \
-cpu host \
-rtc base=localtime \
-smp 4,sockets=1,cores=4,threads=1 \
-bios /usr/share/qemu/bios.bin \
-drive file="image",id=disk,format=raw -device ide-hd,bus=ide.0,drive=disk \
-drive file="win-8.1-amd64-ru.iso",id=isocd0 -device ide-cd,bus=ide.1,drive=isocd0 \
-drive file="virtio-win-0.1-74.iso",id=isocd1 -device ide-cd,bus=ide.2,drive=isocd1 \
-drive file="13-1-legacy_vista_win7_win8_64_dd_ccc.iso",id=isocd2 -device ide-cd,bus=ide.3,drive=isocd2 \
-device ioh3420,bus=pcie.0,addr=1c.0,multifunction=on,port=1,chassis=1,id=root.1 \
-device vfio-pci,host=01:00.0,bus=root.1,addr=00.0,multifunction=on,x-vga=on \
-device vfio-pci,host=01:00.1,bus=root.1,addr=00.1 \
-usb -usbdevice host:09da:9090 -usbdevice host:1c4f:0002 \
-device ich9-intel-hda,bus=pcie.0,addr=1b.0,id=sound0 \
-device hda-duplex,id=sound0-codec0,bus=sound0.0,cad=0
QEMU_AUDIO_DRV=alsa \
qemu-system-x86_64 \
-boot menu=on \
-enable-kvm \
-M pc-1.3 \
-m 8192 \
-cpu host \
-rtc base=localtime \
-smp 4,sockets=1,cores=4,threads=1 \
-bios /usr/share/qemu/bios.bin \
-drive file="windows7-amd64-0",if=ide,media=disk \
-drive file='virtio-win-0.1-74.iso',if=ide,media=cdrom \
-drive file='win-8.1-amd64-ru.iso',if=ide,media=cdrom \
-drive file='13-1-legacy_vista_win7_win8_64_dd_ccc.iso',if=ide,media=cdrom \
-device pci-assign,host=01:00.0,id=hostpci0 \
-device pci-assign,host=01:00.1 \
-usb -usbdevice host:09da:9090 -usbdevice host:1c4f:0002 \
-fsdev local,id=host0,path=/data/0,security_model=passthrough -device virtio-9p-pci,fsdev=host0,mount_tag=v_tmp \
-soundhw hda \
-net nic,model=virtio
Софт (всё из реп):
Дистр Arch Linux x86_64
ведро 3.13.7-1 (base)
qemu 1.7.0-2
seabios 1.7.3.1-2
intel-dri 10.1.0-4
xf86-video-intel 2.99.911-1
параметры бутлоадера (syslinux + UEFI):
LABEL arch
MENU LABEL Arch Linux
LINUX ../vmlinuz-linux
APPEND root=/dev/sda4 rw intel_iommu=on pci-stub.ids=1002:9442,1002:aa30
INITRD ../initramfs-linux.img
dmesg | grep -e DMAR -e IOMMU:
[ 0.000000] ACPI: DMAR 00000000921d38c8 0000B8 (v01 INTEL HSW 00000001 INTL 00000001)
[ 0.000000] Intel-IOMMU: enabled
[ 0.166101] dmar: IOMMU 0: reg_base_addr fed90000 ver 1:0 cap c0000020660462 ecap f0101a
[ 0.166107] dmar: IOMMU 1: reg_base_addr fed91000 ver 1:0 cap d2008020660462 ecap f010da
[ 0.166173] IOAPIC id 2 under DRHD base 0xfed91000 IOMMU 1
[ 0.575987] DMAR: No ATSR found
[ 0.576012] IOMMU 0 0xfed90000: using Queued invalidation
[ 0.576013] IOMMU 1 0xfed91000: using Queued invalidation
[ 0.576015] IOMMU: Setting RMRR:
[ 0.576025] IOMMU: Setting identity map for device 0000:00:02.0 [0x93800000 - 0xaf9fffff]
[ 0.578857] IOMMU: Setting identity map for device 0000:00:1d.0 [0x9207b000 - 0x92087fff]
[ 0.578883] IOMMU: Setting identity map for device 0000:00:1a.0 [0x9207b000 - 0x92087fff]
[ 0.578904] IOMMU: Setting identity map for device 0000:00:14.0 [0x9207b000 - 0x92087fff]
[ 0.578920] IOMMU: Prepare 0-16MiB unity mapping for LPC
[ 0.578927] IOMMU: Setting identity map for device 0000:00:1f.0 [0x0 - 0xffffff]
lspci -nn | grep AMD
01:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] RV770 [Radeon HD 4850] [1002:9442]
01:00.1 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] RV770 HDMI Audio [Radeon HD 4850/4870] [1002:aa30]
dmesg | grep pci-stub
[ 0.000000] Command line: BOOT_IMAGE=../vmlinuz-linux root=/dev/sda4 rw intel_iommu=on pci-stub.ids=1002:9442,1002:aa30 initrd=../initramfs-linux.img
[ 0.000000] Kernel command line: BOOT_IMAGE=../vmlinuz-linux root=/dev/sda4 rw intel_iommu=on pci-stub.ids=1002:9442,1002:aa30 initrd=../initramfs-linux.img
[ 0.913037] pci-stub: add 1002:9442 sub=FFFFFFFF:FFFFFFFF cls=00000000/00000000
[ 0.913045] pci-stub 0000:01:00.0: claimed by stub
[ 0.913051] pci-stub: add 1002:AA30 sub=FFFFFFFF:FFFFFFFF cls=00000000/00000000
[ 0.913057] pci-stub 0000:01:00.1: claimed by stub
options kvm ignore_msrs=1
options vfio_iommu_type1 allow_unsafe_interrupts=1
...
MODULES="i915 pci_stub vfio vfio_pci vfio_iommu_type1 kvm kvm_intel"
...