Zweite GPU in Linux deaktivieren

Nero1

Captain
Registriert
Nov. 2009
Beiträge
3.771
Hi zusammen,

ich benötige mal eine Rückversicherung von den Linux-Profis hier :D

Folgende Ausgangslage:
In meinem PC werkelt neben der Vega 64 noch eine RX 550. Die ist primär dafür gedacht als Host-GPU für Linux neben Windows IOMMU Passthrough VM Gedöns zu werkeln und meinen Host quasi am Leben zu lassen. Da das aktuell aber noch weit weg von spruchreif ist würde ich in der Zwischenzeit gerne die kleine RX deaktivieren um Strom zu sparen (in Windows ist die Vega im Idle bei 7 Watt, die RX bei 20 Watt lt. Treiber o.O).

Dazu habe ich im Netz ne ganze Weile vergeblich gesucht und bin schlussendlich bei diesem Codestück hier gelandet:
Bash:
echo 1 >> /sys/bus/pci/devices/[pci-Kennung der gpu]/remove

In gleicher Manier kann man womöglich auch einen Rescan anstoßen um sie vermutlich wieder zum Leben zu erwecken(?). Bevor ich das Command aber versuche möchte ich doch lieber nachfragen ob da jemand hier Erfahrung mit hat und weiß was dabei genau passiert?

Ich werde da selber auch noch etwas recherchieren aber gemeinsam ist man ja immer gern mal schneller bei der Lösung :)

Vielen Dank im Voraus o/
Nero
 
echo 0 >> /sys/bus/pci/devices/[pci-Kennung der gpu]/remove

macht wieder an :)

wird klar was es macht?
 
Warum die GPU nicht einfach ausbauen ?
 
madmax2010 schrieb:
wird klar was es macht?
Ja schon, wollte nur sicher gehen, dass es dann nicht direkt die GPU aus dem PCI Tree entfernt oder so und ich dann Handstände machen muss damit sie irgendwann wieder erkannt wird :D Bin zwar nicht gänzlich unerfahren was Linux anbelangt, aber im PCI-Handling steck ich dann doch nicht so tief drin.

Also kann ich mir das quasi als Skript iwo hinlegen und gut? Bleibt das dann persistent über Boots hinweg oder müsste ich das pro Start durchführen?

DitaSoft schrieb:
Warum die GPU nicht einfach ausbauen ?
Weil das viel zu umständlich ist und ich dann jedes Mal, wenn ich weiter experimentieren will, sie erst einbauen müsste. Da würde ich sie lieber laufen lassen als dauernd ein- und auszubauen.

Edit:
Okay, einfach mal 1 auf /remove schieben bringt das System zum Freeze, so einfach wirds dann wohl doch nicht :D Aber ist immerhin nicht persistent, das ist schon mal gut. Muss ich morgen mal weiter schauen, ob's da ne bessere Möglichkeit gibt.
 
Zuletzt bearbeitet:
Hier sind meine Skripte:


Bash:
modprobe vfio-pci
echo "1002 6798" > /sys/bus/pci/drivers/vfio-pci/new_id
echo "0000:02:00.0"  > /sys/bus/pci/devices/0000\:02\:00.0/driver/unbind
echo "0000:02:00.0"  > /sys/bus/pci/drivers/vfio-pci/bind


Und wieder zurück:

Bash:
lspci  -k -s 2:00.0 | grep "in use" | grep amdgpu
if [ $? -eq 0 ]; then
echo "amdgpu wird bereits verwendet"
exit 1
fi

echo "0000:02:00.0"  > /sys/bus/pci/devices/0000\:02\:00.0/driver/unbind
echo "0000:02:00.0"  > /sys/bus/pci/drivers/amdgpu/bind

Vor dem Ausführen habe ich auch mal in den Standby geschaltet, damit die Grafikkarte zurückgesetzt wird.

Zum Ausschalten. AMD hat ja den Zero-Power-Modus, ich schätze aber, dass der durch den Treiber eingeschaltet wird.
Was ich festgestellt habe: Binde ich die Karte an den vfio-Treiber, fahre eine VM hoch und dann wieder runter, verbraucht die Karte etwas weniger.

Später habe ich die Grafikkarte direkt dem vfio-Treiber zugewiesen.
 
  • Gefällt mir
Reaktionen: Nero1
Nero1 schrieb:
Edit:
Okay, einfach mal 1 auf /remove schieben bringt das System zum Freeze, so einfach wirds dann wohl doch nicht :D Aber ist immerhin nicht persistent, das ist schon mal gut. Muss ich morgen mal weiter schauen, ob's da ne bessere Möglichkeit gibt.

Das ist nicht persistent. Nach einem Reboot ist alles wieder wie früher.

Ich würde es mal mit "power/control" probieren. Die Begriffe lauten "on" für aktiv und "auto" für inaktiv. Bei USB klappt das in Abhängigkeit der Hardware. (Ich nutze es für die Maus.)

s.a.
https://www.kernel.org/doc/Documentation/usb/power-management.txt
 
  • Gefällt mir
Reaktionen: Nero1
Vielen Dank @linuxBenutzer und @froschmeister, das sind doch mal gute Ansätze für weitere Tests :)

linuxBenutzer schrieb:
Bash:
modprobe vfio-pci
echo "1002 6798" > /sys/bus/pci/drivers/vfio-pci/new_id
echo "0000:02:00.0" > /sys/bus/pci/devices/0000\:02\:00.0/driver/unbind
echo "0000:02:00.0" > /sys/bus/pci/drivers/vfio-pci/bind
Wenn ich das richtig verstehe mal kurz in Worten:
  1. Laden des vfio-pci Kernel Moduls
  2. Vergeben einer neuen vfio-pci Id (die kann nehme ich an generisch sein oder muss die irgendwo zusätzlich konfiguriert werden, um sie zu nutzen?)
  3. Unbind der GPU vom bisherigen Treiber, damit sie frei zur Verfügung steht (ist das äquivalent zu einem "ich bin nicht mehr da" idle/poweroff state?)
  4. Bind an den zugehörigen vfio-pci Treiber für die Nutzung in der VM, wie Punkt 3 mit der passenden lspci Nummer der GPU
Ist das so korrekt? Und die Skripte wurden dann jeweils vor der VM respektive nach Beendigung der VM ausgeführt, um die GPU vom Linux Host zu lösen bzw. wieder an ihn zu binden, richtig?

linuxBenutzer schrieb:
Später habe ich die Grafikkarte direkt dem vfio-Treiber zugewiesen.
Wie geht das? Grub-Parameter?
 
Zu 2.
Da wird gesagt, das der vfio-Treiber jetzt auch für Geräte mit PCI-ID 1002 6798 zuständig ist.
(Auch wenn du zwei davon hast)
Die Id ist die PCI-Id von deiner Grafikkarte, rauszufinden mit:
Bash:
# lspci -nn | grep VGA
00:02.0 VGA compatible controller [0300]: Intel Corporation 2nd Generation Core Processor Family Integrated Graphics Controller [8086:0126] (rev 09)
Das war jetzt von meinem Laptop 8086 ist der Hersteller Intel (1002 bei AMD), 0126 ist Gerätenummer, in meinem Skript stand 6798 für Radeon 7970
Da musst du mit lspci Werte für deine Karte rausfinden. 1002:687f für VEGA64 laut dem hier:
pci-ids.ucw.cz/read/PC/1002/687f

Zu 3.
Ja. Die Karte im speziellen PCI-Slot ist damit erstmal "frei", kein Treiber ist für die zuständig und schreibt nicht auf der Karte rum. "Power off", da wird beim Unbinden einfach die Funktion DeInit ausgeführt. Und wenn da steht,die Karte soll in einen besonderen Modus geschaltet werden, dann ja, sonnst nicht.

Also ich fahre den Rechner hoch. Der Amdgpu-Treiber findet die Karte für die er zuständig ist, macht sein Init, die Karte wird benutzt. Verbrauch etwa 20W.
Ich mache Unbinden, bzw. weise dem Vfio zu, Verbrauch 20W, vielleicht etwas weniger.
Schalte ich den Rechner in Standby und wieder ein, Verbrauch etwa 10W. Die Karte bleibt uninitialisiert, der Vfio macht nicht viel.

Wenn du die Karte dem Linux "entreißt", darf die Karte grade nicht benutzt werden, durch X-Server oder so.

zu 4.
Ja.

An vfio binden wenn du die Karte in VM benutzen willst. Zurück nur wenn du die Karte in Linux benutzen willst.

Ich habe die Nutzung der Karte durch Xorg ausgeschlossen. Durch xorg.conf oder durch zuweisen an vfio ode pcistub, bevor der Amdgpu-Treiber sich die Karte krallt.
Wenn ich die Karte an Linux zurückgegeben habe, habe ich PRIME benutzt.
 
  • Gefällt mir
Reaktionen: Nero1
Nero1 schrieb:
Wie geht das? Grub-Parameter?
Es gibt mehrere Möglichkeiten. Ich hatte das aber benutzt als ich den Kernel selber kompiliert hatte und ohne Initrd gestartet habe, da war es etwas einfacher.
Nun ist, soweit ich das verstanden habe, der Amdgpu-Treiber in Initrd drin und wird früh geladen.
Dann muss vfio- oder pcistub-Treiber auch in Initrd rein und davor geladen werden.

Ich werde mal mein altes Linux booten und schauen.
 
Folgendes hatte ich in der grub.cfg:
Bash:
pci-stub.ids=1002:6658
Das geht aber glaube ich nur wenn der pci-stub-Treber im Kernel drin ist.

Dann hatte ich folgende Datei erstellt: /etc/modrobe.d/vfio.conf
Bash:
options vfio-pci ids=1002:731f,1002:ab38,1002:6658,1002:6798,1002:aaa0,8086:1d2d
softdep radeon pre: vfio-pci
softdep amdgpu pre: vfio-pci
softdep snd_hda_intel pre: vfio-pci
softdep ehci-pci pre: vfio-pci

Da wird gesagt, dass vfio-pci vor amdgpu geladen werden soll und sich gleich angegebene Geräte krallt.

Welcher Treiber gerade für ein Gerät zuständig ist kannst du damit anschauen:
Bash:
#lspci -k

Das habe ich noch dazu gefunden:

GPU Passthrough with KVM and Debian Linux

Binding a GPU to vfio-pci in Debian Buster

So richtig nachschauen wie das genau funktioniert kann ich nicht mehr, weil ich alles umgebaut habe und das Ganze anders betreibe, aber es hat 10 Jahre lang ganz gut funktioniert.

Bei Fragen einfach melden.
 
  • Gefällt mir
Reaktionen: Ginlock und Nero1
Zurück
Oben