我的显卡有时会崩溃。这很烦人,但我忍受它 - 通常我只是用 重新启动图形sudo systemctl restart lightdm.service
,或者如果需要重新启动整个系统。
在这个特定的实例中,systemctl
呼叫挂起,我不想重启因为我在机器上有一项长期运行的工作。
崩溃记录dmesg
为
[944520.212254] Call Trace:
[944520.212256] [<ffffffff818384d5>] schedule+0x35/0x80
[944520.212257] [<ffffffff8183b625>] schedule_timeout+0x1b5/0x270
[944520.212280] [<ffffffffc0235244>] ? dce_v6_0_program_watermarks+0x514/0x720 [amdgpu]
[944520.212282] [<ffffffffc0196d2c>] kcl_fence_default_wait+0x1cc/0x260 [amdkcl]
[944520.212287] [<ffffffff815b4f50>] ? fence_free+0x20/0x20
显然amdgpu
模块崩溃了。我想重新启动它,所以我尝试了
sudo modprobe -r amdgpu
modprobe: FATAL: Module amdgpu is in use.
当我试图找出谁在使用时amdgpu
我得到
lsmod | grep amdgpu
amdgpu 2129920 7
amdttm 102400 1 amdgpu
amdkcl 32768 1 amdgpu
i2c_algo_bit 16384 1 amdgpu
drm_kms_helper 155648 1 amdgpu
drm 364544 10 drm_kms_helper,amdgpu,amdkcl,amdttm
基本上有 7 个“东西”在使用该模块,我不知道如何找到它们并删除该amdgpu
模块。
问题: 有没有什么合理的方法可以在不重新启动系统的情况下重新加载模块?或者有更好的方法来取回我的视频吗?
答案1
正如 @Chris Stryczynski 所说,sudo cat /sys/kernel/debug/dri/N/amdgpu_gpu_recover
这是重新加载 amdgpu 内核模块的正确方法,或者您可以使用amdgpu.gpu_recovery=1
内核参数启动系统,以便在崩溃时自动重置它。
但这些选项的用处不大,因为显示服务器(Xorg 或 Wayland)必须重新初始化其图形堆栈,而桌面环境无法执行此操作。 (尚未实现。)
使用 gpu_recovery 内核参数,即使不可见,您也可以保存您的工作,然后重新启动。
答案2
https://github.com/RadeonOpenCompute/ROCK-Kernel-Driver/issues/11#issuecomment-450696825
如果您不想自动尝试这些重置,或者未检测到锁定,则应该能够使用 debugfs 机制来执行手动 GPU 重置,即使您尚未设置 gpu_recovery 参数。为此,(以 root 身份)读取 /sys/kernel/debug/dri/N/amdgpu_gpu_recover。在本例中,N 是您希望在 DRI 子系统中重置的 GPU 的编号。
这对我来说从来没有用过......但我想我还是会发布它。