Como o problema de suspensão e reativação do Linux em GPUs AMD foi resolvido
(nyanpasu64.gitlab.io)-
Ocorrência do problema: Em um desktop com dual boot de Windows e Linux, ocorria uma falha no sistema ao entrar em modo de suspensão no Linux quando havia uso intenso de RAM. Ao reativar o sistema, aparecia uma tela preta ou ele ficava sem resposta. Esse problema era causado por um bug de gerenciamento de energia/memória no driver
amdgpu. -
Diagnóstico do problema: O sistema, com placa-mãe Gigabyte B550M DS3H e GPU AMD RX 570, estava rodando Arch Linux. Após os travamentos, os logs foram verificados com
journalctl, e foi identificado um erro de falta de memória (OOM) emamdgpu_device_suspend. O driver NVMe falhava ao inicializar durante a retomada do sistema, fazendo com que ele travasse e impedindo o registro dos logs. -
Tentativas de solução: Foram alteradas configurações do systemd para testar vários modos de suspensão e tentou-se simplificar o problema desativando a suspensão assíncrona, mas a causa raiz não foi resolvida. Também foi confirmado que o travamento ocorria durante o processo de remoção do buffer TTM do
amdgpu. -
Causa do problema: Quando o sistema entra no modo de suspensão S3, a alimentação da GPU PCIe é cortada e os dados da VRAM são perdidos. Para evitar isso, o driver da GPU precisa fazer backup da VRAM para a RAM do sistema, mas o driver
amdgpuno Linux acabava derrubando o sistema por falta de memória quando não havia RAM suficiente. -
Solução: Mario Limonciello escreveu um patch para o kernel que faz backup da VRAM antes que o armazenamento baseado em disco seja suspenso. O patch altera o backup da VRAM da etapa
dpm_suspend()para a etapadpm_prepare(), permitindo interromper a suspensão caso falte memória. -
Resolução de problemas adicional: O usuário escreveu um script para fazer backup da VRAM a partir do espaço do usuário, movendo a VRAM para a RAM do sistema antes da suspensão. No entanto, quando vários apps 3D estavam em execução, a VRAM podia continuar sendo movida para a GPU, o que ainda podia causar travamentos.
-
Solução final: A mudança final foi usar a API de notificação de gerenciamento de energia para fazer backup da VRAM na etapa
PM_SUSPEND_PREPARE. Com isso, foi possível mover a VRAM para a RAM do sistema antes de o swap ser desativado, resolvendo o problema. -
Conclusão: O problema foi resolvido graças ao esforço de várias pessoas e a diversas tentativas, e a correção deve ser incluída no Linux kernel 6.14.
1 comentários
Comentários do Hacker News
Há dúvidas sobre a suposição de que, quando o desktop entra no modo de suspensão S3, o sistema corta a energia da GPU PCIe
udevadmpara obter informações do dispositivoO autor do memreserver compartilha a experiência de ter feito debugging para resolver problemas de suspensão no Linux
Explica por que implementar a função de suspensão no Linux é difícil e como o debugging também é complicado
Um usuário de ThinkPad baseado em Ryzen relata problemas de suspensão no Linux e está esperando pela versão 6.14
Compartilha a opinião de que percebeu que o problema de "suspender/despertar" é um problema NP-completo
Sugere que isso será útil para usuários de notebooks Framework AMD com expansão de GPU e dual boot Linux/Windows
Um usuário que está enfrentando um problema em que o PC praticamente trava após a suspensão em uma GPU AMD está tentando resolver a situação
Compartilha a opinião de que sempre teve problemas de suspensão ao usar Linux
Compartilha a experiência de ter feito debugging de problemas de suspensão em hardware IoT
Explica que o gerenciamento de memória e as condições de OOM ainda são problemas difíceis no Linux