Resumen
Estoy intentando configurar el paso de GPU en un host Linux con KVM para poder ejecutar un invitado de Windows para jugar. He tenido un problema donde algunas entradas IOMMU (todas pertenecientes a la GPU que deseo pasar) se asignan al bus vfio, mientras que otras se asignan a los controladores nvidia-gpu.
Hardware
CPU - Threadripper 1950X
GPU: Sapphire RX 480 (AMD, destinada a gráficos host) - MSI Duke RTX 2080 (nVidia, destinada a gráficos invitados)
MoBo - MSI Carbon Gaming Pro AC x399
Problema
Cuando intento pasar a través de mi GPU nVidia, aparece el error Please ensure all devices within the iommu_group are bound to their vfio bus driver.
(ver imágenes a continuación).
- La configuración en virt-manager:https://i.stack.imgur.com/BK0s4.png
- El error que recibo:https://i.stack.imgur.com/XJKfm.png
Cuando ejecuto lspci -k
, encuentro los siguientes registros:
0b:00.0 VGA compatible controller [0300]: NVIDIA Corporation GV104 [GeForce GTX 1180] [10de:1e87] (rev a1)
Subsystem: Micro-Star International Co., Ltd. [MSI] Device [1462:3721]
Kernel driver in use: vfio-pci
Kernel modules: nvidiafb, nouveau
0b:00.1 Audio device [0403]: NVIDIA Corporation Device [10de:10f8] (rev a1)
Subsystem: Micro-Star International Co., Ltd. [MSI] Device [1462:3721]
Kernel driver in use: vfio-pci
Kernel modules: snd_hda_intel
0b:00.2 USB controller [0c03]: NVIDIA Corporation Device [10de:1ad8] (rev a1)
Subsystem: Micro-Star International Co., Ltd. [MSI] Device [1462:3721]
Kernel driver in use: xhci_hcd
0b:00.3 Serial bus controller [0c80]: NVIDIA Corporation Device [10de:1ad9] (rev a1)
Subsystem: Micro-Star International Co., Ltd. [MSI] Device [1462:3721]
Kernel driver in use: nvidia-gpu
Kernel modules: i2c_nvidia_gpu
41:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Ellesmere [Radeon RX 470/480/570/570X/580/580X] [1002:67df] (rev c7)
Subsystem: PC Partner Limited / Sapphire Technology Radeon RX 470/480 [174b:e347]
Kernel driver in use: amdgpu
Kernel modules: amdgpu
41:00.1 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] Ellesmere [Radeon RX 580] [1002:aaf0]
Subsystem: PC Partner Limited / Sapphire Technology Ellesmere [Radeon RX 580] [174b:aaf0]
Kernel driver in use: snd_hda_intel
Kernel modules: snd_hda_intel
Lo que informa que vfio-pci está utilizando el RTX 2080 en 0b:00.0
, y 0b:00.1
, pero 0b:00.2
y 0b.00.3
(que pertenecen al RTX 2080) están siendo utilizados por xhci_hcd
y nvidia-gpu
.
Tengo entendido que ese es el problema.
Qué he hecho
me referí principalmenteun hilo de nivel 1yuna publicación de blog de Jack Ford:
Nuevo en la lista negra
en archivo/etc/modprobe.d/blacklist-nouveau.conf
blacklist nouveau
options nouveau modeset=0
GRUB actualizado
En /etc/default/grub
:
GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=0
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash amd_iommu=on vfio-pci.ids=10de:1e87,10de:10f8,10de:1ad8,10de:1ad9"
GRUB_CMDLINE_LINUX=""
Módulos de kernel agregados
En /etc/modules
:
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
En /etc/modprobe.d/vfio.conf
:
options vfio-pci ids=10de:1e87,10de:10f8,10de:1ad8,10de:1ad9
En /etc/modules-load.d/vfio-pci.conf
:
vfio-pci
IOMMU/VFIO confirmado está habilitado
$ dmesg | grep -E "DMAR|IOMMU"
[ 0.946794] AMD-Vi: IOMMU performance counters supported
[ 0.946855] AMD-Vi: IOMMU performance counters supported
[ 0.976135] AMD-Vi: Found IOMMU at 0000:00:00.2 cap 0x40
[ 0.976139] AMD-Vi: Found IOMMU at 0000:40:00.2 cap 0x40
[ 0.977856] perf/amd_iommu: Detected AMD IOMMU #0 (2 banks, 4 counters/bank).
[ 0.977873] perf/amd_iommu: Detected AMD IOMMU #1 (2 banks, 4 counters/bank).
[ 1.367168] AMD-Vi: AMD IOMMUv2 driver by Joerg Roedel <[email protected]>
$ dmesg | grep -i vfio
[ 0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-5.0.0-37-generic root=UUID=27ff4f46-db04-4ca0-8981-191a45c365ad ro quiet splash amd_iommu=on vfio-pci.ids=10de:1e87,10de:10f8,10de:1ad8,10de:1ad9 vt.handoff=1
[ 0.000000] Kernel command line: BOOT_IMAGE=/boot/vmlinuz-5.0.0-37-generic root=UUID=27ff4f46-db04-4ca0-8981-191a45c365ad ro quiet splash amd_iommu=on vfio-pci.ids=10de:1e87,10de:10f8,10de:1ad8,10de:1ad9 vt.handoff=1
[ 2.667765] VFIO - User Level meta-driver version: 0.3
[ 2.675583] vfio-pci 0000:0b:00.0: vgaarb: changed VGA decodes: olddecodes=io+mem,decodes=io+mem:owns=none
[ 2.692215] vfio_pci: add [10de:1e87[ffffffff:ffffffff]] class 0x000000/00000000
[ 2.712193] vfio_pci: add [10de:10f8[ffffffff:ffffffff]] class 0x000000/00000000
[ 2.712199] vfio_pci: add [10de:1ad8[ffffffff:ffffffff]] class 0x000000/00000000
[ 2.712204] vfio_pci: add [10de:1ad9[ffffffff:ffffffff]] class 0x000000/00000000
[ 4.960496] vfio-pci 0000:0b:00.0: vgaarb: changed VGA decodes: olddecodes=io+mem,decodes=io+mem:owns=none
Conclusión
Muchas gracias por ayudar... No sé cuáles son esas otras dos entradas en el grupo nVidia IOMMU, pero todas parecen pertenecer al dispositivo nVidia. Supongo que si pudiera desactivar el controlador USB y serie, ¿las cosas podrían funcionar?
Respuesta1
Recientemente enfrenté el mismo problema. El objetivo principal es que el wifi use vfio, pero también es necesario mover un USB y una RAM, ya que están en el mismo grupo IOMMU.
Seguí todos los pasos indicados en las preguntas, obtuve RAM y dispositivo WIFI en vfio, pero no USB.
Finalmente descubrí que xhci_hcd está compilado en el kernel, no como módulo. Entonces, al colocar la identificación del controlador USB en GRUB_CMDLINE_LINUX_DEFAULT, el controlador USB aún se vinculará con xhci_hcd, ya que ya está dentro del kernel. Para confirmar si su kernel compila xhci_hcd dentro de:
modprobe -D xhci_hcd
Si su salida es:
builtin xhci_hcd
Entonces su kernel contiene xhci_hcd.
Termino con un script para desvincular y vincular el controlador manual:
#!/bin/sh
PCI_HID=
echo -n "$PCI_HID" > /sys/bus/pci/drivers/xhci_hcd/unbind
echo -n "$PCI_HID" > /sys/bus/pci/drivers/vfio-pci/bind
Para la pregunta. Lo siguiente debería funcionar:
#!/bin/sh
PCI_HID="0000:0b:00.2"
echo -n "$PCI_HID" > /sys/bus/pci/drivers/xhci_hcd/unbind
echo -n "$PCI_HID" > /sys/bus/pci/drivers/vfio-pci/bind
PCI_HID="0000:0b:00.3"
echo -n "$PCI_HID" > /sys/bus/pci/drivers/nvidia-gpu/unbind
echo -n "$PCI_HID" > /sys/bus/pci/drivers/vfio-pci/bind
PD: Aunque estamos vinculando y desvinculando controladores manualmente, los pasos de configuración de GRUB_CMDLINE_LINUX_DEFAULT y del módulo aún son necesarios; de lo contrario, vfio no se vinculará al controlador USB.
Respuesta2
Sé que llegué un poco tarde a la fiesta, pero espero que lo siguiente pueda ayudar a personas que enfrentan problemas similares. Tenga en cuenta que solo he probado esto en controladores USB discretos.
De hecho, xhci_hcd está integrado en el kernel, por lo que reclama el controlador USB y, a menos que se encuentre una solución alternativa, como un script para vincular/desvincular vfio-pci, no se asigna como el kernel en uso.
Otra forma de solucionar este problema es utilizar el siguiente comando:
sudo driverctl -v set-override 0000:0X:00 vfio-pci
Dónde0000:0X:00 es su identificación de pci.
Al reiniciar, el controlador asignado será automáticamente vfio-pci.