2022年1月1日 星期六

Linux mint crash frequently with AMD CPU/GPU

自從換了Asrock Deskmini A300 + AMD 2400G之後
很常碰到系統hang住的狀況
可能是Hang住,隔了一下子畫面綠屏,再隔一下子系統自動重啟
也可能就單純hang住,系統還活著,可以從其他機器ssh連回這台機器,登入後看dmesg或journalctl,看看是什麼原因
也可能hang住,系統就死了

當發生問題時,觀察dmesg或journalctl,常可以看到amdgpu的異常訊息,例如下面這樣的訊息
(不是固定一種類型,可能會有幾種訊息)
Oct 14 23:23:17 A300 kernel: amdgpu 0000:38:00.0: [mmhub0] retry page fault (src_id:0 ring:0 vmid:4 pasid:32769, for process Xorg pid 897 thread Xorg:cs0 pid 963)
Oct 14 23:23:17 A300 kernel: amdgpu 0000:38:00.0:   in page starting at address 0x00008001016e0000 from client 18
Oct 14 23:23:17 A300 kernel: amdgpu 0000:38:00.0: VM_L2_PROTECTION_FAULT_STATUS:0x00440051
Oct 14 23:23:17 A300 kernel: amdgpu 0000:38:00.0:          MORE_FAULTS: 0x1
Oct 14 23:23:17 A300 kernel: amdgpu 0000:38:00.0:          WALKER_ERROR: 0x0
Oct 14 23:23:17 A300 kernel: amdgpu 0000:38:00.0:          PERMISSION_FAULTS: 0x5
Oct 14 23:23:17 A300 kernel: amdgpu 0000:38:00.0:          MAPPING_ERROR: 0x0
Oct 14 23:23:17 A300 kernel: amdgpu 0000:38:00.0:          RW: 0x1
或是
Oct 12 23:33:19 A300 kernel: amdgpu 0000:38:00.0:          RW: 0x1
Oct 12 23:33:19 A300 kernel: [drm:amdgpu_job_timedout [amdgpu]] *ERROR* ring sdma0 timeout, signaled seq=328615, emitted seq=328617
Oct 12 23:33:19 A300 kernel: [drm:amdgpu_job_timedout [amdgpu]] *ERROR* Process information: process Xorg pid 949 thread Xorg:cs0 pid 960
Oct 12 23:33:19 A300 kernel: amdgpu 0000:38:00.0: GPU reset begin!
Oct 12 23:33:19 A300 kernel: amdgpu 0000:38:00.0: GPU reset succeeded, trying to resume

從網路上找到的資料可以發現,發生問題的Kernel版本,從4.19一直到5.x都有發生
所以應該是跟Kernel無關
比較具體的分析,大多是說Linux調整CPU的C-state時,可能會踩到CPU的Bug或啥的

所以
有的文章建議在BIOS內修改C-State相關設定
但我在A300的BIOS內找不到相關的設定,所以這個方法我沒辦法測試

有的文章建議 Write "high" into /sys/class/drm/card0/device/power_dpm_force_level
去避免GPU進入省電模式啥的,但這個我調整了還是碰到Crash

有的文章建議在kernel cmdline參數加上idle=nomwait amdgpu.noretry=0,避免kernel頻繁重啟gpu,具體原因是啥我不清楚
這個方式最初我有調整過,但後來一段時間後又復發,因此我不太確定這個作法到底有沒有效

最近我找到這兩篇文章
https://community.amd.com/t5/graphics/solved-random-reboots-and-crashes-ryzen-and-amd-gpu-under-linux/td-p/441637
https://bugzilla.kernel.org/show_bug.cgi?id=206903#c135

文章建議在kernel cmdline加上amdgpu.ppfeaturemask=0xffffbffd
讓kernel禁用特定電源管理功能
詳細的bitmask定義在kernel.org那篇文章中有介紹

我的kernel版本,目前是5.4.0-91-generic
修改ppfeaturemask後,到目前大概接近三個星期,當機的機率有明顯改善
所以來寫一下作法跟來源,留個紀錄

修改/etc/default/grub,加上紅字的ppfeaturemask參數
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash amdgpu.ppfeaturemask=0xffffbffd"
編輯之後, sudo update-grub 更新grub conf
update-grub會重建一次所有grub的設置,把預設參數帶進去

接著重新啟動系統,進入系統後,cat /proc/cmdline觀察當下kernel的參數
確認參數已經生效,修改就完成了

最後就是放上一包乖乖,希望他可以順順利利(crossfinger)

沒有留言:

張貼留言

Fix msmtp does not work in old ubuntu/debian version

主要是舊版msmtp沒有處理好email header 現在的smtp伺服器會檢查mail header 寄件人跟帳號不一致不給寄 收件人不是合法mail address自然不能寄 #!/bin/bash # Workaround until mtmsp >= 1.8....