Resumen

Resumen

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).

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.2y 0b.00.3(que pertenecen al RTX 2080) están siendo utilizados por xhci_hcdy 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.

información relacionada