PCI passthrough
Function Level Reset
Mi az az FLR és miért érdekel minket? Egy eszköz általában akkor indul el, amikor a számítógép elindul, és akkor áll le, amikor a számítógép kikapcsol. Virtuális gépnél azonban akad egy kis probléma. A host elől elrejtett eszközhöz nem nyúl hozzá semmi bekapcsolásnál, ez nem is zavaró. Mikor bekapcsolás után először odaadjuk egy virtuális gépnek, az inicializálja és használja ahogy kell.
Aztán újraindítanánk a virtuális gépet és az megint megpróbálja inicializálni az eszközt. Az eszköz azonban végig áram alatt volt, nem indult újra, így nem hagyja magát. Erre a virtuális gép operációs rendszertől függően különböző egzotikus hibajelenségeket tud produkálni. Windows alatt ez általában egy mezei kékhalál formájában jelenik meg.
Hirdetés
Erre találták ki a FLR-et, ami újraindítja az eszközt anélkül, hogy meg kéne szakítani annak áramellátását. Ezt azonban ma még igen kevés videokártya támogatja. Hogy megtudjuk a mi eszközeink képesek-e erre, adjuk ki a következő parancsot:
sudo lspci -vv
Erre egy elég terjedelmes kimenetet kapunk. Keressük meg a minket érdeklő eszközöket. Az én kimenetemből egy részlet:
01:00.0 VGA compatible controller: Advanced Micro Devices [AMD] nee ATI Barts PRO [ATI Radeon HD 6800 Series] (prog-if 00 [VGA controller])
Subsystem: Giga-byte Technology Device 21f8
Control: I/O- Mem- BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Interrupt: pin A routed to IRQ 18
Region 0: Memory at c0000000 (64-bit, prefetchable) [disabled] [size=256M]
Region 2: Memory at fddc0000 (64-bit, non-prefetchable) [disabled] [size=128K]
Region 4: I/O ports at ce00 [disabled] [size=256]
[virtual] Expansion ROM at fdd00000 [disabled] [size=128K]
Capabilities: [50] Power Management version 3
Flags: PMEClk- DSI- D1+ D2+ AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-)
Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
Capabilities: [58] Express (v2) Legacy Endpoint, MSI 00
DevCap: MaxPayload 256 bytes, PhantFunc 0, Latency L0s <4us, L1 unlimited
ExtTag+ AttnBtn- AttnInd- PwrInd- RBE+ FLReset-
DevCtl: Report errors: Correctable- Non-Fatal- Fatal- Unsupported-
RlxdOrd+ ExtTag- PhantFunc- AuxPwr- NoSnoop+
MaxPayload 128 bytes, MaxReadReq 512 bytes
DevSta: CorrErr+ UncorrErr- FatalErr- UnsuppReq+ AuxPwr- TransPend-
LnkCap: Port #0, Speed 2.5GT/s, Width x16, ASPM L0s L1, Latency L0 <64ns, L1 <1us
ClockPM- Surprise- LLActRep- BwNot-
LnkCtl: ASPM Disabled; RCB 64 bytes Disabled- Retrain- CommClk+
ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt-
LnkSta: Speed 2.5GT/s, Width x16, TrErr- Train- SlotClk+ DLActive- BWMgmt- ABWMgmt-
DevCap2: Completion Timeout: Range ABCD, TimeoutDis+
DevCtl2: Completion Timeout: 50us to 50ms, TimeoutDis-
LnkCtl2: Target Link Speed: 2.5GT/s, EnterCompliance- SpeedDis-, Selectable De-emphasis: -6dB
Transmit Margin: Normal Operating Range, EnterModifiedCompliance- ComplianceSOS-
Compliance De-emphasis: -6dB
LnkSta2: Current De-emphasis Level: -6dB, EqualizationComplete-, EqualizationPhase1-
EqualizationPhase2-, EqualizationPhase3-, LinkEqualizationRequest-
Capabilities: [a0] MSI: Enable- Count=1/1 Maskable- 64bit+
Address: 0000000000000000 Data: 0000
Capabilities: [100 v1] Vendor Specific Information: ID=0001 Rev=1 Len=010 <?>
Capabilities: [150 v1] Advanced Error Reporting
UESta: DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq- ACSViol-
UEMsk: DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq- ACSViol-
UESvrt: DLP+ SDES+ TLP- FCP+ CmpltTO- CmpltAbrt- UnxCmplt- RxOF+ MalfTLP+ ECRC- UnsupReq- ACSViol-
CESta: RxErr- BadTLP- BadDLLP- Rollover- Timeout- NonFatalErr+
CEMsk: RxErr- BadTLP- BadDLLP- Rollover- Timeout- NonFatalErr+
AERCap: First Error Pointer: 00, GenCap+ CGenEn- ChkCap+ ChkEn-
Kernel driver in use: pciback
Látható a "Capabilities -> DevCap -> FLReset-"-ból, hogy az én videokártyám nem támogatja ezt a funkciót. Az USB 3.0 vezérlőim igen, ott a FLReset+ virít.
Mit jelent ez a gyakorlatban? Fizikai gépindításonként egyszer indíthatok el egy olyan virtuális gépet aminek odaadom ezt a kártyát. Ha nem nyúl semmilyen eszközhöz, vagy csak olyan eszközhöz nyúl ami támogatja az FLR-t akkor semmi gond, de amint valami hozzányúl a kártyához, utána már csak fizikai gépújraindítás után adhatom oda egy másik (vagy akár ugyanannak) a virtuális gépnek.
De hát ez majdnem olyan mintha dualboot-olnánk, nem? Nem egészen. Egyszer elindítom a Windowsos virtuális gépet, utána visszaváltok Debianra ha úgy érzem. Közben azonban a Windows nem áll le, fut tovább, csak én éppen nem látom a videokimenetét. Ha visszaváltok ugyanott lesz, még a boot időt sem kell kivárnom.
Update 2012 okt 18:
Igen gyorsan meg lehet utálni a Microsoftot amiért kitalálta a kétszeres újraindítást megkövetelő frissítéseket.
USB vezérlő átadása
Ha végeztünk a Windows telepítésével, akkor akár oda is adhatjuk az USB vezérlőket a virtuális gépnek. Állítsuk le a Windowst, majd adjuk hozzá a konfigurációs fájlhoz a következő sorokat:
pci=[
'02:00.0' , '07:00.0'
]
Indítsuk el újra a virtuális gépet. Ha találunk az alaplap gyártójának weboldalán drivert ahhoz az eszközhöz amit át akarunk adni, töltsük le. Ha nincs, akkor imádkozzunk, hogy a Windows beépített driverei működőképesek lesznek. A tapasztalatom azt mutatja, hogy ha nem működik a beépített driverekkel akkor a Windows beépített "problémamegoldás-keresés az interneten" csodája se tud nekünk segíteni, de ne legyen igazam. Gyártó honlapjáról beszerzett driverek szinte biztos, hogy működni fognak.
A működés tesztelése elég egyszerű: dugj egy pendrive-ot a megfelelő USB aljzatba és ha a Windows felismeri, akkor öröm és boldogság.
A cikk még nem ért véget, kérlek, lapozz!



