Cách khắc phục sự cố sleep-wake trên Linux xảy ra với GPU AMD
(nyanpasu64.gitlab.io)-
Sự cố phát sinh: Trên máy desktop dual-boot Windows và Linux, khi dùng nhiều RAM trong Linux rồi chuyển sang chế độ ngủ, hệ thống bị treo. Khi đánh thức máy, màn hình đen xuất hiện hoặc hệ thống rơi vào trạng thái không phản hồi. Vấn đề này bắt nguồn từ lỗi quản lý nguồn/bộ nhớ của driver amdgpu.
-
Chẩn đoán vấn đề: Hệ thống chạy Arch Linux với bo mạch chủ Gigabyte B550M DS3H và GPU AMD RX 570. Sau khi hệ thống bị treo, tác giả kiểm tra log bằng
journalctlvà phát hiện lỗi hết bộ nhớ (OOM) xảy ra trongamdgpu_device_suspend. Driver NVMe không khởi tạo lại được khi hệ thống resume, khiến máy bị treo và không ghi được log. -
Các lần thử khắc phục: Tác giả thay đổi thiết lập systemd để thử nhiều chế độ ngủ khác nhau và tắt chế độ ngủ bất đồng bộ nhằm đơn giản hóa vấn đề, nhưng không xử lý được nguyên nhân gốc. Sau đó xác nhận xung đột xảy ra trong quá trình amdgpu loại bỏ bộ đệm TTM.
-
Nguyên nhân: Khi hệ thống vào chế độ ngủ S3, nguồn của GPU PCIe bị ngắt nên dữ liệu trong VRAM bị mất. Để tránh điều này, driver GPU phải sao lưu VRAM sang RAM hệ thống, nhưng driver amdgpu trên Linux có thể làm hệ thống treo do hết bộ nhớ nếu không đủ RAM trống.
-
Giải pháp: Mario Limonciello đã viết một bản vá kernel để sao lưu VRAM trước khi bộ nhớ lưu trữ dựa trên đĩa bị dừng. Bản vá này chuyển việc sao lưu VRAM từ giai đoạn
dpm_suspend()sangdpm_prepare(), để có thể hủy quá trình sleep nếu xảy ra thiếu bộ nhớ. -
Xử lý thêm các vấn đề phát sinh: Tác giả viết một script để cho phép sao lưu VRAM từ user space, chuyển VRAM sang RAM hệ thống trước khi máy sleep. Tuy nhiên, khi nhiều ứng dụng 3D đang chạy, VRAM vẫn có thể tiếp tục bị chuyển sang GPU và gây treo.
-
Cách khắc phục cuối cùng: Tác giả thay đổi để dùng API thông báo quản lý nguồn, sao lưu VRAM ở giai đoạn
PM_SUSPEND_PREPARE. Nhờ đó, VRAM có thể được chuyển sang RAM hệ thống trước khi swap bị vô hiệu hóa, qua đó giải quyết vấn đề. -
Kết luận: Vấn đề này đã được giải quyết nhờ nỗ lực của nhiều người và nhiều lần thử nghiệm khác nhau, và dự kiến sẽ được đưa vào Linux kernel 6.14.
1 bình luận
Ý kiến Hacker News
Có ý kiến nghi ngờ giả định rằng khi máy bàn vào chế độ ngủ S3 thì hệ thống sẽ cắt nguồn GPU PCIe
udevudevadmđể lấy thông tin thiết bịTác giả của memreserver chia sẻ trải nghiệm từng gỡ lỗi để xử lý sự cố ngủ trên Linux
Có người giải thích vì sao việc triển khai tính năng ngủ trên Linux lại khó và việc gỡ lỗi cũng khó khăn
Một người dùng ThinkPad dùng Ryzen cho biết đang gặp lỗi ngủ trên Linux và kỳ vọng vào phiên bản 6.14
Có ý kiến nói rằng họ đã nhận ra vấn đề "sleep/wake" là một bài toán NP-đầy đủ
Có người cho rằng bài viết này sẽ hữu ích với người dùng laptop Framework AMD có GPU mở rộng và chạy dual-boot Linux/Windows
Một người dùng đang cố khắc phục lỗi PC gần như bị treo sau khi ngủ trên GPU AMD
Có ý kiến chia sẻ rằng từ trước đến nay họ luôn gặp vấn đề với tính năng ngủ khi dùng Linux
Có người chia sẻ kinh nghiệm từng gỡ lỗi vấn đề ngủ trên phần cứng IoT
Có ý kiến giải thích rằng quản lý bộ nhớ và điều kiện OOM vẫn là những vấn đề khó trên Linux