XEN-PCI

Aus Neobiker\\\'s Wiki
Zur Navigation springen Zur Suche springen

XEN und PCI

... ich dachte ja nicht, dass ich mich nach Jahren wieder mit Steckkarten und Interrupts beschäftigen muss...
Aber man wird ja immer wieder eines Besseren belehrt ;-)

Denke das könnte Euch interessieren - wenn Ihr irgendwas mit PCI in DomUs einsetzen wollt.

Was war?

Nachdem mein Prod-System 3 Wochen lief (2x IDE-Disk im RAID1), wollte ich einfach meine 2 SATA-Controller in den Rechner stecken, und die 3 SATA-Disks (2x 160GB RAID 1, 1x 250GB Backup) des alten c't Servers (UML) einbauen und nutzen. Das Ding lief definitiv nicht stabil und hängte sich immer wieder mit "hda Disk not responding" und ähnlichem Quatsch auf...

-> Hard-Reset

Nach langsamen Auffrischen der seit Jahren (seit ISA-Slots nicht mehr verwendet werden) vergessen IRQ-Problematiken habe ich mir das techn. Handbuch meines Rechers vorgenommen, und die PCI-Slots untersucht. Ergebnis: die IRQ-Zuweisung ist auf dem MotherBoard (MB) in Hardware gegossen, jeder PCI-Slot hat mehrere IRQs zur Verfügugn, die sich die PCI-Karten evtl. teilen. Die Onboard Komponenten (IDE, USB, Floppy, Maus, ...) teilen sich zusätzlich die selben IRQs.

Bei meinem Board gibt es 8 IRQs für PCI (A - H entspricht IRQ 16 - 23), wovon jeweils 4 einem PCI-Slot (habe 6 Stck.) zugeordnet sind.

1: F G H A
2: G H A B
 ...
6: C D E F

Ergebnis: Es macht unter XEN einen Unterschied, in welchem Slot die PCI-Karten stecken!

Ich habe jetzt in meinem Recher jede aktive PCI-Komponente einem eigenem IRQ zuordnen können. Das ging allerdings nur durch geschicktes umstecken der Karten in den PCI-Slots (ich kenne leider keine andere Möglichkeit, z.B. irgendwelche Kernel boot-Parameter). Auch ein deaktivieren der Komponenten im BIOS hilft bei mir nur teilweise (Phoenix BIOS).

Mein aktuelles Setup sieht jetzt wie folgt aus:

xen1:~# lspci -nn
00:00.0 Host bridge [0600]: Intel Corporation 82845G/GL[Brookdale-G]/GE/PE DRAM Controller/Host-Hub Interface [8086:2560] (rev 01) 
00:02.0 VGA compatible controller [0300]: Intel Corporation 82845G/GL[Brookdale-G]/GE Chipset Integrated Graphics Device [8086:2562] (rev 01) 
00:1d.0 USB Controller [0c03]: Intel Corporation 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #1 [8086:24c2] (rev 01)
00:1d.1 USB Controller [0c03]: Intel Corporation 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #2 [8086:24c4] (rev 01)
00:1d.2 USB Controller [0c03]: Intel Corporation 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #3 [8086:24c7] (rev 01) 
00:1e.0 PCI bridge [0604]: Intel Corporation 82801 PCI Bridge [8086:244e] (rev 81) 
00:1f.0 ISA bridge [0601]: Intel Corporation 82801DB/DBL (ICH4/ICH4-L) LPC Interface Bridge [8086:24c0] (rev 01)
00:1f.1 IDE interface [0101]: Intel Corporation 82801DB (ICH4) IDE Controller [8086:24cb] (rev 01)
00:1f.3 SMBus [0c05]: Intel Corporation 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) SMBus Controller [8086:24c3] (rev 01) 
02:05.0 RAID bus controller [0104]: Silicon Image, Inc. SiI 3112 [SATALink/SATARaid] Serial ATA Controller [1095:3112] (rev 02) 
02:08.0 Ethernet controller [0200]: Intel Corporation 82801DB PRO/100 VM (LOM) Ethernet Controller [8086:103b] (rev 81) 
02:09.0 Network controller [0280]: AVM Audiovisuelles MKTG & Computer System GmbH A1 ISDN [Fritz] [1244:0a00] (rev 02) 
02:0d.0 Ethernet controller [0200]: ADMtek NC100 Network Everywhere Fast Ethernet 10/100 [1317:0985] (rev 11) 02:0f.0 PCI bridge [0604]: Hint Corp HB6 Universal PCI-PCI bridge (non-transparent mode) [3388:0021] (rev 11) 03:08.0 USB Controller [0c03]: NEC Corporation USB [1033:0035] (rev 41)
03:08.1 USB Controller [0c03]: NEC Corporation USB [1033:0035] (rev 41)
03:08.2 USB Controller [0c03]: NEC Corporation USB 2.0 [1033:00e0] (rev 02) 03:09.0 FireWire (IEEE 1394) [0c00]: NEC Corporation uPD72874 IEEE1394 OHCI 1.1 3-port PHY-Link Ctrlr [1033:00f2] (rev 01) 03:0a.0 Mass storage controller [0180]: Silicon Image, Inc. SiI 3112 [SATALink/SATARaid] Serial ATA Controller [1095:3112] (rev 02)

Die IRQ-Zuordnung ist:

xen1:~# dmesg | grep GSI | sort -u
ACPI: PCI Interrupt 0000:00:1d.0[A] -> GSI 16 (level, low) -> IRQ 19
ACPI: PCI Interrupt 0000:00:1d.1[B] -> GSI 19 (level, low) -> IRQ 21
ACPI: PCI Interrupt 0000:00:1d.2[C] -> GSI 18 (level, low) -> IRQ 22
ACPI: PCI Interrupt 0000:00:1f.1[A] -> GSI 18 (level, low) -> IRQ 22
ACPI: PCI Interrupt 0000:02:05.0[A] -> GSI 17 (level, low) -> IRQ 23
ACPI: PCI Interrupt 0000:02:08.0[A] -> GSI 20 (level, low) -> IRQ 16
ACPI: PCI Interrupt 0000:02:09.0[A] -> GSI 19 (level, low) -> IRQ 21
ACPI: PCI Interrupt 0000:02:0d.0[A] -> GSI 21 (level, low) -> IRQ 17
ACPI: PCI Interrupt 0000:03:08.0[A] -> GSI 22 (level, low) -> IRQ 20
ACPI: PCI Interrupt 0000:03:08.1[B] -> GSI 23 (level, low) -> IRQ 18
ACPI: PCI Interrupt 0000:03:08.2[C] -> GSI 16 (level, low) -> IRQ 19
ACPI: PCI Interrupt 0000:03:09.0[A] -> GSI 23 (level, low) -> IRQ 18
ACPI: PCI Interrupt 0000:03:0a.0[A] -> GSI 16 (level, low) -> IRQ 19

Es ergibt sich folgendes aktives Setup bei mir:

00:1d.0[A]     IRQ 19    OnBoard USB UHCI Controller #1  (verwende ich nicht -> pciback.hide + nicht in DomU verwenden!)
00:1d.1[B]     IRQ 21    OnBoard USB UHCI Controller #2  (verwende ich nicht -> pciback.hide + nicht in DomU verwenden!)
00:1d.2[C]     IRQ 22    OnBoard USB UHCI Controller #3  (verwende ich nicht -> pciback.hide + nicht in DomU verwenden!)
----------------------------------------------------------------------------------------------
00:1f.1[A]     IRQ 22    OnBoard IDE interface -> Dom0 (CD + DVD)
02:05.0[A]     IRQ 23    SATA Controller #0    -> Dom0 (2x 160GB RAID1)
02:08.0[A]     IRQ 16    OnBoard Ethernet      -> Dom0 (GREEN)
02:09.0[A]     IRQ 21    ISDN [Fritz]          -> DomU exchange4linux + ISDN/Fax
02:0d.0[A]     IRQ 17    Fast Ethernet 10/100  -> Dom0 (RED)
03:0a.0[A]     IRQ 19    SATALink/SATARaid #1  -> Dom0 (Backup Disk)
03:08.0[A]     IRQ 20    USB #1   PCI-MultiI/O -> DomU File/Print/Mail Server
----------------------------------------------------------------------------------------------
03:08.1[B]     IRQ 18    USB #2   PCI-MultiI/O           (verwende ich nicht -> pciback.hide + nicht in DomU  verwenden!)
03:08.2[C]     IRQ 19    USB #3   PCI-MultiI/O           (verwende ich nicht -> pciback.hide + nicht in DomU  verwenden!)
03:09.0[B]     IRQ 18    FireWire PCI-MultiI/O           (verwende ich nicht -> pciback.hide + nicht in DomU  verwenden!)

Man sieht, ich habe noch den IRQ 18 nicht verwendet und könnte den FireWire Adapter oder einen weiteren USB-Port nutzen.

Ich habe sicherheitshalber die störenden PCI-Geräte (weil sie einen IRQ benutzen, der anderweitig in Verwendung ist) mittels pciback.hide aus der Dom0 entfernt, damit keine Treiber geladen werden. Zusätzlich verwende ich momentan auch noch die kernel Optionen nousb und noirqdebug zum booten der Dom0.

Warum der ganze HickHack?

Z.B. der OnBoard(!) USB-Port (der an dem mein USB-Drucker in der DomU des File/Print Server hing) benutzt den gleichen IRQ 22 wie der OnBoard IDE Controller (diese Zuordnung ist fest verdrahtet auf dem MB). Wenn ich die DomU herunterfahre, wird der IRQ 22 "disabled".

-> Ab dem Moment hat auch die IDE-Disk des Hostsystems ein Problem :-( Es hat auch nur das anstöpseln des USB-Druckers genügt, dass die Disk teilweise keinen Interrupt mehr bekommen hat!

Meine Vermutung/Analyse: XEN trennt die PCI-Geräte soweit in den VMs voneinander ab, dass PCI-Geräte welche normalerweise mit einem "shared IRQ" in einem System problemlos laufen, in unterschiedlichen VM-Systemen nicht laufen!

=> Benutze einen IRQ >>>NIE<<< in unterschiedlichen VMs !!!

Seitdem ich das beachte, kann ich tatsächlich beide SATA-Controller inkl. der Multi I/O Karte (USB + FireWire) zusammen mit der zusätzlichen ISDN-Karte und der 2.ten NW-Karte stabil benutzen. (Hab ich nicht mehr dran geglaubt!!)

Uuffff, das hat mich echt viel Arbeit und Nerven gekostet, hoffe ihr wisst das zu schätzen :-)