Comment résoudre le problème de veille/réveil de Linux sur les GPU AMD
(nyanpasu64.gitlab.io)-
Survenue du problème : sur un PC de bureau en double démarrage Windows/Linux, un plantage se produisait lors du passage en veille sous Linux quand une grande quantité de RAM était utilisée. Au réveil, le système affichait un écran noir ou ne répondait plus. Le problème était dû à un bug de gestion de l’alimentation/de la mémoire dans le pilote
amdgpu. -
Diagnostic : le système utilisait une carte mère Gigabyte B550M DS3H et un GPU AMD RX 570, sous Arch Linux. Après les plantages, les journaux ont été examinés via
journalctl, ce qui a révélé une erreur de mémoire insuffisante (OOM) dansamdgpu_device_suspend. Le pilote NVMe échouait aussi à se réinitialiser lors de la reprise, ce qui figeait le système et empêchait l’écriture des journaux. -
Tentatives de résolution : des modifications de configuration systemd ont été essayées pour tester plusieurs modes de veille, et la veille asynchrone a été désactivée afin de simplifier le problème, mais sans corriger la cause racine. Il a été confirmé que le plantage se produisait pendant le processus d’éviction des tampons TTM d’
amdgpu. -
Cause du problème : quand le système entrait en veille S3, l’alimentation du GPU PCIe était coupée, ce qui entraînait la perte des données en VRAM. Pour l’éviter, le pilote GPU devait sauvegarder la VRAM dans la RAM système, mais le pilote
amdgpude Linux pouvait faire planter le système par manque de mémoire si la RAM disponible était insuffisante. -
Solution : Mario Limonciello a écrit un patch du noyau pour sauvegarder la VRAM avant l’arrêt du stockage sur disque. Ce patch déplace la sauvegarde de la VRAM de l’étape
dpm_suspend()vers l’étapedpm_prepare(), ce qui permet d’interrompre la mise en veille en cas de manque de mémoire. -
Résolution de problèmes supplémentaire : l’utilisateur a écrit un script pour sauvegarder la VRAM depuis l’espace utilisateur, en déplaçant la VRAM vers la RAM système avant la mise en veille. Cependant, lorsque plusieurs applications 3D étaient en cours d’exécution, la VRAM pouvait continuer à être transférée vers le GPU, provoquant encore des plantages.
-
Résolution finale : le comportement a été modifié pour sauvegarder la VRAM à l’étape
PM_SUSPEND_PREPAREvia l’API de notification de gestion de l’alimentation. Cela a permis de déplacer la VRAM vers la RAM système avant la désactivation du swap, ce qui a résolu le problème. -
Conclusion : ce problème a été résolu grâce aux efforts de plusieurs personnes et à diverses tentatives, et le correctif devrait être inclus dans le noyau Linux 6.14.
1 commentaires
Commentaires sur Hacker News
Certains remettent en question l’hypothèse selon laquelle, quand un desktop entre en veille S3, le système coupe l’alimentation du GPU PCIe
udevpour corriger celaudevadmpermet d’obtenir des informations sur les périphériquesL’auteur de memreserver partage son expérience de débogage pour résoudre des problèmes de veille sous Linux
Certains expliquent pourquoi l’implémentation de la veille sous Linux est difficile, ainsi que la complexité du débogage
Un utilisateur de ThinkPad basé sur Ryzen indique rencontrer des problèmes de veille sous Linux et attend beaucoup de la version 6.14
Un commentaire dit avoir réalisé que les problèmes de « veille/réveil » sont un problème NP-complet
Certains estiment que cela aidera les utilisateurs de portables Framework AMD avec extension GPU et dual boot Linux/Windows
Un utilisateur dont le PC devient presque inutilisable après la veille avec un GPU AMD cherche activement une solution
Plusieurs personnes disent avoir toujours eu des problèmes de veille sous Linux
Un intervenant partage son expérience de débogage de problèmes de veille sur du matériel IoT
Certains expliquent que la gestion mémoire et les conditions d’OOM restent des problèmes difficiles sous Linux