วิธีแก้ปัญหา sleep-awake ของ Linux ที่เกิดบน AMD GPU
(nyanpasu64.gitlab.io)-
การเกิดปัญหา: บนเดสก์ท็อปที่ทำ dual boot ระหว่าง Windows และ Linux พบว่าเมื่อใช้งาน RAM ปริมาณมากบน Linux แล้วเข้าสู่โหมดสลีป ระบบจะล่ม เมื่อลองปลุกระบบกลับขึ้นมาจะพบหน้าจอดำหรือระบบไม่ตอบสนอง ปัญหานี้เกิดจากบั๊กด้านการจัดการพลังงาน/หน่วยความจำของไดรเวอร์
amdgpu -
การวิเคราะห์ปัญหา: ระบบที่ใช้เมนบอร์ด Gigabyte B550M DS3H และ GPU AMD RX 570 กำลังรัน Arch Linux หลังระบบล่ม ได้ตรวจสอบล็อกผ่าน
journalctlและพบว่าเกิดข้อผิดพลาดหน่วยความจำไม่พอ (OOM) ในamdgpu_device_suspendไดรเวอร์ NVMe ไม่สามารถเริ่มต้นใหม่ได้สำเร็จตอนระบบกลับมาทำงาน ทำให้ระบบค้างและไม่สามารถบันทึกล็อกได้ -
ความพยายามในการแก้ปัญหา: มีการปรับตั้งค่า systemd เพื่อทดลองโหมดสลีปหลายแบบ และปิดการสลีปแบบ asynchronous เพื่อทำให้ปัญหาง่ายต่อการวิเคราะห์ขึ้น แต่ก็ยังไม่สามารถแก้ต้นตอของปัญหาได้ พบว่าระบบล่มระหว่างขั้นตอนนำ TTM buffer ของ
amdgpuออก -
สาเหตุของปัญหา: เมื่อระบบเข้าสู่โหมดสลีป S3 ไฟเลี้ยงของ PCIe GPU จะถูกตัด ทำให้ข้อมูลใน VRAM สูญหาย เพื่อป้องกันสิ่งนี้ ไดรเวอร์ GPU ต้องสำรอง VRAM ไปยัง RAM ของระบบ แต่ไดรเวอร์
amdgpuบน Linux จะล่มด้วยอาการหน่วยความจำไม่พอหากมี RAM ไม่เพียงพอ -
แนวทางแก้ไข: Mario Limonciello ได้เขียนเคอร์เนลแพตช์เพื่อให้สำรอง VRAM ไปยังสตอเรจบนดิสก์ก่อนที่ดิสก์เบสสตอเรจจะหยุดทำงาน แพตช์นี้เปลี่ยนให้การสำรอง VRAM เกิดขึ้นในขั้น
dpm_prepare()แทนdpm_suspend()เพื่อให้สามารถยกเลิกการเข้าสลีปได้หากหน่วยความจำไม่พอ -
การแก้ปัญหาเพิ่มเติม: ผู้ใช้ได้เขียนสคริปต์ให้สำรอง VRAM จาก user space โดยย้าย VRAM ไปยัง RAM ของระบบก่อนเข้าสู่โหมดสลีป อย่างไรก็ตาม เมื่อมีแอป 3D หลายตัวกำลังทำงานอยู่ VRAM อาจถูกย้ายกลับไปที่ GPU ต่อเนื่องและทำให้ระบบล่มได้
-
การแก้ไขขั้นสุดท้าย: มีการเปลี่ยนไปใช้ power management notifier API เพื่อสำรอง VRAM ในขั้น
PM_SUSPEND_PREPAREส่งผลให้สามารถย้าย VRAM ไปยัง RAM ของระบบได้ก่อนที่ swap จะถูกปิดใช้งาน จึงแก้ปัญหานี้ได้ -
สรุป: ปัญหานี้ถูกแก้ไขได้จากความพยายามของหลายคนและการลองผิดลองถูกหลายแบบ และมีกำหนดจะถูกรวมเข้าใน Linux kernel 6.14
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
มีข้อสงสัยเกี่ยวกับสมมติฐานที่ว่าเมื่อเดสก์ท็อปเข้าสู่โหมดสลีป S3 ระบบจะตัดไฟของ GPU แบบ PCIe
udevadmเพื่อดึงข้อมูลอุปกรณ์ได้ผู้เขียน memreserver แชร์ประสบการณ์การดีบักเพื่อแก้ปัญหาสลีปบน Linux
อธิบายว่าทำไมการทำฟีเจอร์สลีปบน Linux จึงยาก และทำไมการดีบักจึงลำบาก
ผู้ใช้ ThinkPad ที่ใช้ Ryzen รายหนึ่งบอกว่ากำลังเจอปัญหาสลีปบน Linux และกำลังรอเวอร์ชัน 6.14
มีความเห็นว่าตนเพิ่งตระหนักว่า ปัญหา "สลีป/ปลุก" เป็นปัญหาแบบ NP-complete
มีความเห็นว่านี่น่าจะช่วยผู้ใช้ Framework AMD laptop ที่ใช้ GPU expansion และทำ dual boot Linux/Windows ได้
ผู้ใช้ที่กำลังเจอปัญหาหลังสลีปแล้ว PC แทบค้างบน AMD GPU กำลังพยายามแก้ปัญหาอยู่
มีความเห็นว่าเจอปัญหาสลีปมาตลอดตั้งแต่ใช้ Linux
มีการแชร์ประสบการณ์การดีบักปัญหาสลีปบนฮาร์ดแวร์ IoT
อธิบายว่าการจัดการหน่วยความจำและเงื่อนไข OOM ยังคงเป็นปัญหาที่ยากบน Linux