ubuntuusers.de

QEMU PCI Passthrough

Status: Ungelöst | Ubuntu-Version: Ubuntu 18.04 (Bionic Beaver)
Antworten |

daice

Anmeldungsdatum:
17. Februar 2020

Beiträge: 7

Hallo,

ich versuche vertweifelt seit ein paar Tagen eine PCI Video Grabber Karte in eine Gast VM durchzureichen. Leider finde ich den Fehler nicht woran es genau hängt.

System: Ubuntu 18.04.4 LTS

/etc/default/grub

1
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_iommu=on"

/etc/modules

1
2
3
4
5
vfio
vfio_iommu_type1
vfio_virqfd
vfio_pci
ids=109e:036e,109e:0878

iommu_groupes:

1
2
3
IOMMU Group 14 00:1e.0 PCI bridge [0604]: Intel Corporation 82801 PCI Bridge [8086:244e] (rev a5)
IOMMU Group 14 08:04.0 Multimedia video controller [0400]: Brooktree Corporation Bt878 Video Capture [109e:036e] (rev 11)
IOMMU Group 14 08:04.1 Multimedia controller [0480]: Brooktree Corporation Bt878 Audio Capture [109e:0878] (rev 11)

lspci -vv

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
08:04.0 Multimedia video controller: Brooktree Corporation Bt878 Video Capture (rev 11)
	Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
	Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
	Latency: 0 (4000ns min, 10000ns max)
	Interrupt: pin A routed to IRQ 11
	Region 0: Memory at f2a01000 (32-bit, prefetchable) [size=4K]
	Capabilities: <access denied>
	Kernel driver in use: vfio-pci
	Kernel modules: bttv

08:04.1 Multimedia controller: Brooktree Corporation Bt878 Audio Capture (rev 11)
	Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
	Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
	Latency: 0 (1000ns min, 63750ns max)
	Interrupt: pin A routed to IRQ 11
	Region 0: Memory at f2a00000 (32-bit, prefetchable) [size=4K]
	Capabilities: <access denied>
	Kernel driver in use: vfio-pci

lspci -vv |grep "IRQ 11"

1
2
	Interrupt: pin A routed to IRQ 11
	Interrupt: pin A routed to IRQ 11

Hier noch die Fehlermeldung von QEMU, wenn ich versuche die Karte in der Config der VM mit einzuhängen

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
Fehler beim Starten der Domain: internal error: process exited while connecting to monitor: 2020-02-17T09:30:03.573492Z qemu-system-x86_64: -device vfio-pci,host=08:04.0,id=hostdev0,bus=pci.0,addr=0x7: vfio error: 0000:08:04.0: failed to setup INTx fd: Operation not permitted

Traceback (most recent call last):
  File "/usr/share/virt-manager/virtManager/asyncjob.py", line 89, in cb_wrapper
    callback(asyncjob, *args, **kwargs)
  File "/usr/share/virt-manager/virtManager/asyncjob.py", line 125, in tmpcb
    callback(*args, **kwargs)
  File "/usr/share/virt-manager/virtManager/libvirtobject.py", line 82, in newfn
    ret = fn(self, *args, **kwargs)
  File "/usr/share/virt-manager/virtManager/domain.py", line 1508, in startup
    self._backend.create()
  File "/usr/lib/python2.7/dist-packages/libvirt.py", line 1062, in create
    if ret == -1: raise libvirtError ('virDomainCreate() failed', dom=self)
libvirtError: internal error: process exited while connecting to monitor: 2020-02-17T09:30:03.573492Z qemu-system-x86_64: -device vfio-pci,host=08:04.0,id=hostdev0,bus=pci.0,addr=0x7: vfio error: 0000:08:04.0: failed to setup INTx fd: Operation not permitted

Hat jemand eine Idee was ich noch machen kann um die VM mit der PCI Karte zum laufen zu bekommen?

Gruß Frank

Lidux

Anmeldungsdatum:
18. April 2007

Beiträge: 16758

Hallo daice,

Herzlich Willkommen auf Ubuntuusers.

Das funktioniert grundsätzlich nicht ..... genauso wie TV Karten.

PS: Im Host System funktioniert diese unter welchem BS ?

Gruss Lidux

daice

(Themenstarter)

Anmeldungsdatum:
17. Februar 2020

Beiträge: 7

Was ist da das Problem, würde es gerne verstehen was und warum es nicht gehen soll? Ursprünglich lief die Karte mal in einem PC mit Windows XP, diesen PC versuche ich halt zu virtualisieren um ein altes Messgerät weiter nutzen zu können.

Gruß Frank

ChickenLipsRfun2eat Team-Icon

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12067

…vfio error: 0000:08:04.0: failed to setup INTx fd: Operation not permitted…

Da fehlen offenbar die entsprechenden Zugriffsrechte für das Gerät. Bedeutet: Der ausführende Nutzer muss entweder in die entsprechende Gruppe oder die Berechtigungen für das Device per UDEV geändert werden.

Lidux

Anmeldungsdatum:
18. April 2007

Beiträge: 16758

Hallo daice,

Also ist der Host "Ubuntu 18.04" und WinXP der Gast ?

Gruss Lidux

daice

(Themenstarter)

Anmeldungsdatum:
17. Februar 2020

Beiträge: 7

Ja genau host ist Ubuntu und Gast WinXP

daice

(Themenstarter)

Anmeldungsdatum:
17. Februar 2020

Beiträge: 7

ChickenLipsRfun2eat

Ich habe jetzt meinen Standarduser in die gruppen libvirt und libvirt-qemu mit aufgenommen. Leider erscheint beim starten der VM immer noch die gleiche Fehlermeldung. Kannst du mir etwas näher beschreiben wie ich die Berechtigungen anpassen muss bzw. soll?

Gruß und danke, Frank

ChickenLipsRfun2eat Team-Icon

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12067

Ich meinte nicht die Berechtigung für qemu, sondern für das Gerät selbst, also der Video Grabber.

Dieser ist eine Datei, die unter /dev/ liegt und hat ebenfalls Berechtigungen, wie bspw. das klassische fb0 (video - Puffer):

crw-rw---- 1 root video 29, 0 16. Feb 16:16 /dev/fb0

Bei einem Linux-Gast würde ich mittels

dmesg | grep -i vfio

prüfen, welche Ausgabe da kommt. Wie sieht das für deinen Video Grabber aus? Welcher Treiber wird dafür geladen? ( lspci -v ). Eventuell findest du so raus, was noch fehlt. Ich kann dir zum Windows-Gast wenig sagen, da kenne ich mich nicht mit aus. Aber wenn libvirt das Gerät durchreichen kann/darf, dann taucht das im Zielsystem auch irgendwie™ auf.

Also zunächst prüfen, wie es im Host aussieht: Wird das Gerät erkannt und ist zugreifbar? Wenn ja, geht es in der VM weiter.

TNTMaster

Anmeldungsdatum:
30. Juli 2009

Beiträge: 879

daice schrieb:

iommu_groupes:

1
2
3
IOMMU Group 14 00:1e.0 PCI bridge [0604]: Intel Corporation 82801 PCI Bridge [8086:244e] (rev a5)
IOMMU Group 14 08:04.0 Multimedia video controller [0400]: Brooktree Corporation Bt878 Video Capture [109e:036e] (rev 11)
IOMMU Group 14 08:04.1 Multimedia controller [0480]: Brooktree Corporation Bt878 Audio Capture [109e:0878] (rev 11)

Welche Geräte hängen an PCI bridge? Kannst du mit lspci -tvnn schaun. Soweit mir bekannt, müssen alle Geräte einer Gruppe durchgereicht werden, oder zumindest den vfio-pci geladen haben.

Gruß TNT

daice

(Themenstarter)

Anmeldungsdatum:
17. Februar 2020

Beiträge: 7

Wenn ich versuche die PCI Bridge aus der IOMMU Group 14 mit durchzureichen, bekomme ich eine Fehlermeldung vom QEMU, dass ich nur Endpunkt Geräte durchrreichen kann. Lasse ich die PCI Bridge weg und trage nur die beiden Brooktree Geräte für das PCI Passthrough ein, bekomme ich den Operation permitted Fehler. Mit vfio-pci geladen ist nur die Karte mit ihren beiden Geräten, siehe lspci-vv

Gruß Frank

TNTMaster

Anmeldungsdatum:
30. Juli 2009

Beiträge: 879

Wie sehen denn die Zugriffs/Besitzrechte in /dev/vfio aus? Der qemu Benutzer braucht hier wohl Schreibzugriff.

daice

(Themenstarter)

Anmeldungsdatum:
17. Februar 2020

Beiträge: 7

Ich hab jetzt zum testen mal ein anderes PCI device, welches allein in einer iommu Gruppe ist und keinen shared Interrupt hat versucht durchzureichen, mit Erfolg! Ich denke es liegt daran, dass die Videograbberkarte mit einem shared Interrupt betrieben wird. Es gibt immer mindestens noch ein PCI device mit der gleichen IRQ Nummer. Gibt es eine Möglichkeit das IRQ sharing im Linux so zu beeinflussen, dass meine beiden Geräte der Vidograbberkarte unterschiedliche IRQs bekommen und diese im gesamten System auch nicht nochmal vergeben werden? Im BIOS habe ich schon geschaut, da kann man nichts mehr einstellen.

Gruß Frank

ChickenLipsRfun2eat Team-Icon

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12067

Das ist mir zu hardwarenah 😉 Viel Erfolg → https://lwn.net/Kernel/LDD3/ 😬

TNTMaster

Anmeldungsdatum:
30. Juli 2009

Beiträge: 879

Ich denke es liegt daran, dass die Videograbberkarte mit einem shared Interrupt betrieben wird

Ich glaube, mit Interrupts hat das weniger zu tun.

Wenn ich versuche die PCI Bridge aus der IOMMU Group 14 mit durchzureichen, bekomme ich eine Fehlermeldung vom QEMU, dass ich nur Endpunkt Geräte durchrreichen kann

Dann brauchst du eine Gruppe, die nur die beiden Devices der Karte enthält. Ich denke, dir bleiben jetzt 2 Möglichkeiten, ansonsten wirds nicht funktionieren:

  • Karte in anderen PCI Slot stecken und schaun ob sich die Gruppenzuteilung ändert

  • Kernel mit ACS Override Patch starten (Kernelparameter zum aktivieren: pcie_acs_override=downstream)

Downloads: https://queuecumber.gitlab.io/linux-acs-override/

daice

(Themenstarter)

Anmeldungsdatum:
17. Februar 2020

Beiträge: 7

Ich hab jetzt mal mit einer anderen PCI Karte getestet. Laut lspci war ist sie auch zusammen mit der PCI Bride in einer IOMMU Gruppe. Die Karte hat vom System auch einen eigenen IRQ bekommen, dein kein zweites Gerät im System mit nutzt. Und siehe da, diese Karte lässt sich problemlos durchreichen in das Gastsystem. Jetzt habe ich wieder die Videograbberkarte eingebaut und alles so konfiguriert wie mit der zuvor getesteten anderen PCI Karte. lspci zeigt mir aber schon an, das der IRQ zweimal verwendet wird im System. Wenn ich nun die VM starte kommt wieder die Fehlermeldung vom ersten Beitrag. Was noch interessant ist, ist die Ausgabe von dmesg. Diese zeigt beim Start der VM folgende Ausgabe:

1
2
3
4
5
6
[Feb21 08:19] audit: type=1400 audit(1582269553.973:44): apparmor="STATUS" operation="profile_load" profile="unconfined" name="libvirt-f8c863e9-a2dc-4dd4-a5d5-e3c0267c4a88" pid=2233 comm="apparmor_parser"
[  +0,283237] audit: type=1400 audit(1582269554.257:45): apparmor="STATUS" operation="profile_replace" profile="unconfined" name="libvirt-f8c863e9-a2dc-4dd4-a5d5-e3c0267c4a88" pid=2236 comm="apparmor_parser"
[  +0,280685] audit: type=1400 audit(1582269554.537:46): apparmor="STATUS" operation="profile_replace" profile="unconfined" name="libvirt-f8c863e9-a2dc-4dd4-a5d5-e3c0267c4a88" pid=2239 comm="apparmor_parser"
[  +0,259524] audit: type=1400 audit(1582269554.797:47): apparmor="STATUS" operation="profile_replace" info="same as current profile, skipping" profile="unconfined" name="libvirt-f8c863e9-a2dc-4dd4-a5d5-e3c0267c4a88" pid=2242 comm="apparmor_parser"
[  +1,300049] genirq: Flags mismatch irq 16. 00000000 (vfio-intx(0000:06:04.0)) vs. 00000080 (uhci_hcd:usb3)
[  +0,426470] audit: type=1400 audit(1582269556.521:48): apparmor="STATUS" operation="profile_remove" profile="unconfined" name="libvirt-f8c863e9-a2dc-4dd4-a5d5-e3c0267c4a88" pid=2288 comm="apparmor_parser"

In der fünften Zeile kommt die Meldung das es wohl Konflikte zwischen zwei Geräten gibt die den IRQ 16 verwenden, naja und meine Videograbberkarte verwendet zufällig IRQ 16, wie wohl auch der USB Controller des Mainboards.

Hat jemand ne Idee wie ich im Linux ein IRQ sharing für ein spezielles PCI device unterbinden kann= Geht sowas überhaupt?

Gruß Frank

Antworten |