Resumo

Resumo

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

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.2e 0b.00.3(todos pertencentes ao RTX 2080) estão sendo usados ​​por xhci_hcde 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.

informação relacionada