Debian stable GPU Passthrough [GT710B]

Fórumok

Sziasztok!

Van egy SuperMicro A2SDi-H-TF alaplapom VT-d tamogatassal.

A videokartya [UEFI kepes]: nvflash -v dumped.rom

UEFI Version          : 0x10037
UEFI Variant ID       : 0x0000000000000004 ( GK1xx )
UEFI Signer(s)        : Microsoft Corporation UEFI CA 2011

GRUB-ot es modulokat beallitva probalom az ASUS GT710-4H-SL-2GD5 videokartyat az egyetlen PCI-E slotban a Guestnek atadni.

iommu group:

IOMMU Group 15:
        02:00.0 VGA compatible controller [0300]: NVIDIA Corporation GK208 [GeForce GT 710B] [10de:128b] (rev a1)
        02:00.1 Audio device [0403]: NVIDIA Corporation GK208 HDMI/DP Audio Controller [10de:0e0f] (rev a1)

lspci -knn:

02:00.0 VGA compatible controller [0300]: NVIDIA Corporation GK208 [GeForce GT 710B] [10de:128b] (rev ff)
        Kernel driver in use: vfio-pci
        Kernel modules: nouveau
02:00.1 Audio device [0403]: NVIDIA Corporation GK208 HDMI/DP Audio Controller [10de:0e0f] (rev ff)
        Kernel driver in use: vfio-pci
        Kernel modules: snd_hda_intel

nouveau, nvidia modulok blacklisten.

libvirt xml config: https://pastebin.com/U363HCUh

a libvirt logban:

qemu-system-x86_64: vfio: Unable to power on device, stuck in D3

dmesg -ben:

kernel: [  550.246833] vfio-pci 0000:02:00.0: enabling device (0000 -> 0003)
kernel: [  550.247240] vfio_ecap_init: 0000:02:00.0 hiding ecap 0x19@0x900
kernel: [  550.270767] vfio-pci 0000:02:00.1: enabling device (0000 -> 0002)
kernel: [  551.502944] vfio_bar_restore: 0000:02:00.1 reset recovery - restoring bars
kernel: [  551.518988] vfio_bar_restore: 0000:02:00.0 reset recovery - restoring bars

nvidia-smi -pm 1 is megvolt, de az mar be volt allitva [ezt termeszetesen iommu nelkul csinaltam]

Mikor eliditom a VM-et egy archlinux iso -val, akkor az lspci nem mutatja a videokartyat.

Valakinek otlete/tapasztalata GPU Passthrough -val?

Hozzászólások

Koszonom az otletet.

Hirtelen felindulasbol felpattintottam egy Proxmox -ot => belottem a GPU passthrough -t => megy, mint a kisangyal.

Elmentettem a VM config -jait [qemu]

Most mar nem allok neki visszatenni a debian -t, de ha esetleg elakadnek az opciok libvirt XML fajlba implementalasaban, jelentkezem.

Namost... az a nagy helyzet

a default kernel parameterekkel ezek az IOMMU csoportok vannak:

IOMMU Group 14:
        01:00.0 Co-processor [0b40]: Intel Corporation Atom Processor C3000 Series QuickAssist Technology [8086:19e2] (rev 11)
IOMMU Group 15:
        02:00.0 VGA compatible controller [0300]: NVIDIA Corporation GK208 [GeForce GT 710B] [10de:128b] (rev a1)
        02:00.1 Audio device [0403]: NVIDIA Corporation GK208 HDMI/DP Audio Controller [10de:0e0f] (rev a1)
IOMMU Group 16:
        04:00.0 PCI bridge [0604]: ASPEED Technology, Inc. AST1150 PCI-to-PCI Bridge [1a03:1150] (rev 03)
        05:00.0 VGA compatible controller [0300]: ASPEED Technology, Inc. ASPEED Graphics Family [1a03:2000] (rev 30)

, ami teljesen jol nez ki, de igy sehogysem megy a GPU passthrough...

...de amint aktivalom a "pcie_acs_override=downstream,multifunction" kernel parametert:

IOMMU Group 14:
        01:00.0 Co-processor [0b40]: Intel Corporation Atom Processor C3000 Series QuickAssist Technology [8086:19e2] (rev 11)
IOMMU Group 15:
        02:00.0 VGA compatible controller [0300]: NVIDIA Corporation GK208 [GeForce GT 710B] [10de:128b] (rev a1)
IOMMU Group 16:
        02:00.1 Audio device [0403]: NVIDIA Corporation GK208 HDMI/DP Audio Controller [10de:0e0f] (rev a1)
IOMMU Group 17:
        04:00.0 PCI bridge [0604]: ASPEED Technology, Inc. AST1150 PCI-to-PCI Bridge [1a03:1150] (rev 03)
        05:00.0 VGA compatible controller [0300]: ASPEED Technology, Inc. ASPEED Graphics Family [1a03:2000] (rev 30)

es igy siman f@szaul megy a grafikus kartya a VM-ben.

Valakinek valami otlet? [Ha mas nem marad, akkor megy vissza debian es patchelem a kernelt az ACS-sel]

az egy IOMMU group -ban levo mindegyik eszkozt at kell adni a guest -nek; es en at is adom, de nem megy ugy

ha patchelt kernellel inditom, akkor ugye mind a VGA, mind az audio resze kulon IOMMU group -ban van, ahol csak a VGA-t adom at => mukodik

Ha a patchelt kernellel mindkettot [VGA+AUDIO] atadom, akkor sem megy.

Elképzelhetőnek tartom, hogy azért nem megy, mert az eredetileg azonos eszközön lévő két funkciót a VM-ben túl messze rakod egymástól. A host ("forrás") oldalon ezek a címek érvényesek:

<address domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
<address domain='0x0000' bus='0x02' slot='0x00' function='0x1'/>

a VM-ben azonban az alábbi címekhez rendeled a funkciókat:

<address type='pci' domain='0x0000' bus='0x08' slot='0x00' function='0x0' multifunction='on'/>
<address type='pci' domain='0x0000' bus='0x09' slot='0x00' function='0x0'/>

Szemmel láthatóan nemhogy nem raktad az eredeti funkciókat azonos eszközre (slot-ra), 0-s és 1-es funkcióként, de még azonos buszra sem tetted azokat (külön eszközként, mindegyiket csak 0-s funkcióval). A domain XML-ből kiderül, hogy a 8-as busz egy külön PCIe root port:

<controller type='pci' index='8' model='pcie-root-port'>

9-es PCI busz meg egyáltalán nincs is a domain XML-edben (tehát a domain XML önmagában is rossz).

Míg az stimmel, hogy egy PCIe root port buszán valóban csak a 0-s slot értelmezett, attól még külön root port-ok alá rakni a kártya két funkcióját garantáltan összezavarja a Windows-os nvidia drivert -- ilyet a valóságban ő sosem látott.

A Linux guest-ben az lspci-nek mennie kellene; szerintem a probléma ott a 9-es busszal lesz.

Nekem nagyon hasonló (bár régebbi) kártyám van, GTX750. Azzal a fenti PCIe topológia szintén nem megy (sőt, az sem megy, ha azonos PCIe root port alá, tehát azonos buszra rakom a guest-ben, következésképpen a kizárólagosan értelmezett 0-s slot-nak a 0-s és 1-es funkciójára pakolva a két funkciót). Nálam a GTX750-nel az vált be, ha a VM-ben a PCIe root complex-be integrált PCI végpontokként jelenítem meg a két funkciót. Tehát lehetnek külön slot-ban (nem muszáj a funkciókat egy multifunction device-ba pakolni a guest-ben), de a busznak a 0-s nak kell lennie.

<hostdev mode='subsystem' type='pci' managed='yes'>
  <source>
    <address domain='0x0000' bus='0x21' slot='0x00' function='0x0'/>
  </source>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</hostdev>
<hostdev mode='subsystem' type='pci' managed='yes'>
  <source>
    <address domain='0x0000' bus='0x21' slot='0x00' function='0x1'/>
  </source>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
</hostdev>

Ebből a lényeg az, hogy a guest hol látja:

<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>

A 0-s PCI busz pedig ez, ugye:

<controller type='pci' index='0' model='pcie-root'/>

Én mondjuk Linux guest-et ilyen célra régen használtam, de a Windows-os nvidia driver ezt a topológiát elfogadja.

Ajánlott olvasmány: https://git.qemu.org/?p=qemu.git;a=blob;f=docs/pcie.txt