Resumo
Estou tentando configurar a passagem de GPU em um host Linux com KVM para poder executar um convidado do Windows para jogos. Tenho tido um problema onde algumas entradas IOMMU (todas pertencentes à GPU que desejo passar) estão sendo atribuídas ao barramento vfio, enquanto outras são atribuídas aos drivers nvidia-gpu.
Hardware
CPU-Threadripper 1950X
GPU - Sapphire RX 480 (AMD, destinado a gráficos host) - MSI Duke RTX 2080 (nVidia, destinado a gráficos convidados)
MoBo - MSI Carbon Gaming Pro AC x399
Problema
Quando tento passar pela minha GPU nVidia, recebo o erro Please ensure all devices within the iommu_group are bound to their vfio bus driver.
(veja as imagens abaixo).
- A configuração no virt-manager:https://i.stack.imgur.com/BK0s4.png
- O erro que recebo:https://i.stack.imgur.com/XJKfm.png
Quando executo lspci -k
, encontro os seguintes 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
Que relata que o RTX 2080 está sendo usado por vfio-pci on 0b:00.0
, e 0b:00.1
, mas 0b:00.2
e 0b.00.3
(todos pertencentes ao RTX 2080) estão sendo usados por xhci_hcd
e nvidia-gpu
.
Meu entendimento é que esse é o problema.
O que eu fiz
Eu me referi principalmenteum thread de nível 1euma postagem no blog de Jack Ford:
Novo na lista negra
no arquivo/etc/modprobe.d/blacklist-nouveau.conf
blacklist nouveau
options nouveau modeset=0
GRUB atualizado
Em /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 adicionados
Em /etc/modules
:
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
Em /etc/modprobe.d/vfio.conf
:
options vfio-pci ids=10de:1e87,10de:10f8,10de:1ad8,10de:1ad9
Em /etc/modules-load.d/vfio-pci.conf
:
vfio-pci
IOMMU/VFIO confirmado está ativado
$ 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
Conclusão
Muito obrigado por ajudar... Não sei quais são essas duas outras entradas no grupo nVidia IOMMU, mas todas parecem pertencer ao dispositivo nVidia. Estou supondo que se eu pudesse desabilitar o controlador USB e serial, as coisas poderiam funcionar?
Responder1
Recentemente enfrentando o mesmo problema. O objetivo principal é fazer com que o wifi use vfio, mas é necessário mover um USB e uma RAM também, pois estão no mesmo grupo IOMMU.
Fiz todos os passos indicados nas perguntas, coloquei RAM e dispositivo WIFI no vfio, mas não USB.
Finalmente descobri que o xhci_hcd é compilado no kernel, não como módulo. Portanto, colocando o ID do controlador USB em GRUB_CMDLINE_LINUX_DEFAULT, o controlador USB ainda será vinculado ao xhci_hcd, pois já está dentro do kernel. Para confirmar se o seu kernel compila xhci_hcd dentro de:
modprobe -D xhci_hcd
Se sua saída for:
builtin xhci_hcd
Então seu kernel contém xhci_hcd.
Acabo com um script para desvincular e vincular manualmente o driver:
#!/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 a pergunta. O seguinte deve 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
PS: Embora estejamos vinculando e desvinculando manualmente os drivers, as etapas GRUB_CMDLINE_LINUX_DEFAULT e de configuração do módulo ainda são necessárias, caso contrário, o vfio não será vinculado ao controlador USB.
Responder2
Sei que estou um pouco atrasado para a festa, mas espero que o seguinte possa ajudar as pessoas que enfrentam problemas semelhantes. Observe que testei isso apenas em controladores USB discretos.
xhci_hcd é de fato construído no kernel, portanto ele reivindica o controlador USB e, a menos que uma solução alternativa seja encontrada, como um script para vincular/desvincular vfio-pci, não é atribuído como o kernel em uso.
Outra maneira de resolver esse problema é usar o seguinte comando:
sudo driverctl -v set-override 0000:0X:00 vfio-pci
Onde0000:0X:00 é o seu ID PCI.
Após a reinicialização, o driver atribuído será automaticamente vfio-pci.