Cómo se resolvió el problema de suspensión y reactivación de Linux en GPUs AMD
(nyanpasu64.gitlab.io)-
Aparición del problema: En una desktop con arranque dual de Windows y Linux, ocurría un fallo al entrar en modo de suspensión en Linux cuando se usaba una gran cantidad de RAM. Al reactivar el sistema, aparecía una pantalla negra o quedaba sin respuesta. Este problema se debía a un bug de administración de energía/memoria en el driver
amdgpu. -
Diagnóstico del problema: Se estaba ejecutando Arch Linux en un sistema con motherboard Gigabyte B550M DS3H y GPU AMD RX 570. Tras los fallos del sistema, se revisaron los logs con
journalctly se descubrió un error de falta de memoria (OOM) enamdgpu_device_suspend. El driver NVMe no lograba inicializarse al reanudar el sistema, por lo que este se congelaba y no se registraban logs. -
Intentos de solución: Se modificó la configuración de systemd para probar varios modos de suspensión y se desactivó la suspensión asíncrona para simplificar el problema, pero no se resolvió la causa de fondo. También se confirmó que el fallo ocurría durante el proceso de eliminación de buffers TTM de
amdgpu. -
Causa del problema: Cuando el sistema entra en modo de suspensión S3, se corta la energía de la GPU PCIe y se pierden los datos en la VRAM. Para evitarlo, el driver de la GPU debe respaldar la VRAM en la RAM del sistema, pero el driver
amdgpude Linux provocaba una falla por falta de memoria si no había RAM suficiente. -
Solución: Mario Limonciello escribió un parche del kernel para respaldar la VRAM antes de que se detenga el almacenamiento basado en disco. Este parche cambia el respaldo de VRAM de la etapa
dpm_suspend()adpm_prepare(), de modo que la suspensión pueda abortarse si falta memoria. -
Resolución de problemas adicional: El usuario escribió un script para respaldar la VRAM desde espacio de usuario, moviéndola a la RAM del sistema antes de la suspensión. Sin embargo, si había varias apps 3D ejecutándose, la VRAM podía seguir moviéndose hacia la GPU y provocar fallos.
-
Solución final: Se cambió el proceso para respaldar la VRAM en la etapa
PM_SUSPEND_PREPAREusando la API de notificación de administración de energía. Gracias a esto, la VRAM puede moverse a la RAM del sistema antes de que se desactive el swap, resolviendo el problema. -
Conclusión: Este problema se resolvió gracias al esfuerzo de varias personas y múltiples intentos, y está previsto que se incluya en Linux kernel 6.14.
1 comentarios
Opiniones de Hacker News
Hay dudas sobre la suposición de que, cuando una desktop entra en modo de suspensión S3, el sistema corta la energía de la GPU PCIe
udevadmpara obtener información del dispositivoEl autor de memreserver comparte su experiencia depurando problemas de suspensión en Linux
Se explica por qué es difícil implementar la función de suspensión en Linux y lo complicado que resulta depurarla
Un usuario de una ThinkPad basada en Ryzen comenta que está teniendo problemas de suspensión en Linux y espera con interés la versión 6.14
Se comparte la opinión de que el problema de "suspensión/despertar" es un problema NP-completo
Se plantea que esto podría ayudar a quienes usan una laptop Framework AMD con expansión de GPU y dual boot Linux/Windows
Un usuario que está sufriendo un problema en el que la PC casi se congela después de suspender con una GPU AMD sigue intentando resolverlo
Se comparte la opinión de que siempre ha tenido problemas con la suspensión mientras usa Linux
Se comparte una experiencia depurando problemas de suspensión en hardware IoT
Se explica que la gestión de memoria y las condiciones de OOM siguen siendo problemas difíciles en Linux