Zusammenfassung

Zusammenfassung

Zusammenfassung

Ich versuche, GPU-Passthrough auf einem Linux-Host mit KVM einzurichten, damit ich einen Windows-Gast zum Spielen ausführen kann. Ich habe ein Problem, bei dem einige IOMMU-Einträge (die alle zu der GPU gehören, die ich durchleiten möchte) dem VFIO-Bus zugewiesen werden, während andere den NVIDIA-GPU-Treibern zugewiesen werden.

Hardware

CPU – Threadripper 1950X

GPU – Sapphire RX 480 (AMD, für Hostgrafik gedacht) – MSI Duke RTX 2080 (nVidia, für Gastgrafik gedacht)

MoBo - MSI Carbon Gaming Pro AC x399

Problem

Beim Versuch, meine nVidia-GPU durchzureichen, wird der Fehler angezeigt Please ensure all devices within the iommu_group are bound to their vfio bus driver.(siehe Bilder unten).

Wenn ich ausführe lspci -k, finde ich die folgenden Datensätze:

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

0b:00.0Das meldet, dass die RTX 2080 von vfio-pci auf , und verwendet wird 0b:00.1, aber 0b:00.2und 0b.00.3(die alle zur RTX 2080 gehören) werden von xhci_hcdund verwendet nvidia-gpu.

Meines Wissens ist das das Problem.

Was ich getan habe

Ich bezog mich hauptsächlich aufein Level1-ThreadUndein Blogbeitrag von Jack Ford:

Auf die schwarze Liste gesetzter Jugendstil

im Ordner/etc/modprobe.d/blacklist-nouveau.conf

blacklist nouveau
options nouveau modeset=0

GRUB aktualisiert

In /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=""

Hinzugefügte Kernelmodule

In /etc/modules:

vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd

In /etc/modprobe.d/vfio.conf:

options vfio-pci ids=10de:1e87,10de:10f8,10de:1ad8,10de:1ad9

In /etc/modules-load.d/vfio-pci.conf:

vfio-pci

Bestätigt, dass IOMMU/VFIO aktiviert ist

$ 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

Abschluss

Vielen Dank für Ihre Hilfe ... Ich weiß nicht, was diese beiden anderen Einträge in der nVidia IOMMU-Gruppe sind, aber sie scheinen alle zum nVidia-Gerät zu gehören. Ich vermute, wenn ich den USB- und den seriellen Controller deaktivieren könnte, würde es vielleicht funktionieren?

Antwort1

Ich stehe seit Kurzem vor demselben Problem. Das Hauptziel besteht darin, WLAN mit VFIO zu betreiben, aber ich muss auch einen USB-Stick und einen RAM verschieben, da sie sich in derselben IOMMU-Gruppe befinden.

Ich habe alle in den Fragen angegebenen Schritte ausgeführt und RAM und WLAN-Gerät auf vfio erhalten, aber kein USB.

Schließlich habe ich herausgefunden, dass xhci_hcd in den Kernel kompiliert ist und nicht als Modul. Wenn Sie also die USB-Controller-ID in GRUB_CMDLINE_LINUX_DEFAULT eingeben, wird der USB-Controller trotzdem mit xhci_hcd verbunden, da er sich bereits im Kernel befindet. So bestätigen Sie, ob Ihr Kernel xhci_hcd darin kompiliert:

modprobe -D xhci_hcd

Wenn Ihre Ausgabe ist:

builtin xhci_hcd

Dann enthält Ihr Kernel xhci_hcd.

Am Ende erhalte ich ein Skript zum manuellen Aufheben und Binden der Treiber:

#!/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

Zur Frage. Folgendes sollte funktionieren:

#!/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: Obwohl wir Treiber manuell binden und trennen, sind die Schritte GRUB_CMDLINE_LINUX_DEFAULT und die Modulkonfiguration weiterhin erforderlich, da vfio sonst nicht an den USB-Controller gebunden wird.

Antwort2

Ich weiß, dass ich etwas spät zur Party komme, aber ich hoffe, dass das Folgende Menschen mit ähnlichen Problemen helfen kann. Bitte beachten Sie, dass ich dies nur auf diskreten USB-Controllern getestet habe.

xhci_hcd ist tatsächlich im Kernel integriert, sodass es den USB-Controller beansprucht und sofern kein Workaround wie etwa ein Skript zum Binden/Aufheben der Bindung gefunden wird, wird vfio-pci nicht als verwendeter Kernel zugewiesen.

Dieses Problem lässt sich auch mit dem folgenden Befehl lösen:

sudo driverctl -v set-override 0000:0X:00 vfio-pci

Wo0000:0X:00 ist Ihre PCI-ID.

Beim Neustart wird automatisch der Treiber vfio-pci zugewiesen.

verwandte Informationen