AMD GPU에서 발생하는 Linux의 sleep-awake 문제를 해결한 방법

3 weeks ago 5

  • 문제 발생: Windows와 Linux를 듀얼 부팅하는 데스크탑에서, Linux에서 고용량 RAM 사용 시 절전 모드로 전환하면 시스템이 충돌하는 문제가 발생함. 시스템을 깨우면 검은 화면이 나타나거나 응답이 없는 상태가 됨. 이 문제는 amdgpu 드라이버의 전원/메모리 관리 버그로 인한 것임.

  • 문제 진단: Gigabyte B550M DS3H 메인보드와 AMD RX 570 GPU를 사용하는 시스템에서 Arch Linux를 실행 중. 시스템 충돌 후 journalctl을 통해 로그를 확인했으며, amdgpu_device_suspend에서 메모리 부족(OOM) 오류가 발생함을 발견함. NVMe 드라이버가 시스템 재개 시 초기화에 실패하여 시스템이 멈추고 로그가 기록되지 않음.

  • 해결 시도: 여러 절전 모드를 시도하는 systemd 설정을 변경하고, 비동기 절전을 비활성화하여 문제를 단순화하려 했으나 근본적인 문제는 해결되지 않음. amdgpu의 TTM 버퍼 제거 과정에서 충돌이 발생함을 확인함.

  • 문제 원인: 시스템이 S3 절전 모드에 들어가면 PCIe GPU의 전원이 차단되어 VRAM 데이터가 손실됨. 이를 방지하기 위해 GPU 드라이버는 VRAM을 시스템 RAM으로 백업해야 하나, Linux amdgpu 드라이버는 충분한 RAM이 없을 경우 메모리 부족으로 시스템이 충돌함.

  • 해결책: Mario Limonciello가 VRAM을 디스크 기반 저장소가 중지되기 전에 백업하도록 커널 패치를 작성함. 이 패치는 VRAM 백업을 dpm_suspend() 대신 dpm_prepare() 단계에서 수행하도록 변경하여, 메모리 부족 시 절전을 중단할 수 있도록 함.

  • 추가 문제 해결: 사용자가 VRAM을 사용자 공간에서 백업하도록 하는 스크립트를 작성하여, 시스템 절전 전 VRAM을 시스템 RAM으로 이동시킴. 그러나 여러 3D 앱이 실행 중일 때는 VRAM이 계속 GPU로 이동하여 충돌이 발생할 수 있음.

  • 최종 해결: 전원 관리 알림 API를 사용하여 PM_SUSPEND_PREPARE 단계에서 VRAM을 백업하도록 변경함. 이로 인해 스왑이 비활성화되기 전에 VRAM을 시스템 RAM으로 이동할 수 있게 되어 문제를 해결함.

  • 결론: 이 문제는 여러 사람의 노력과 다양한 시도를 통해 해결되었으며, Linux 커널 6.14에 포함될 예정임.

Read Entire Article