AMDGPU

出自 ArchWiki
(重定向自 AMD

AMDGPU 是 AMD Radeon 显卡自 Graphics Core Next 系列以来的开源图形驱动程序。

选择合适的驱动程序

根据您拥有的显卡,在 Xorg#AMD 中找到合适的驱动程序。此驱动程序支持 Southern Islands (GCN 1,2012 年发布) 及更高版本的显卡。AMD 没有计划支持 pre-GCN GPU。

不支持的 GPU 的所有者可以使用开源 ATI 驱动程序。

安装

安装 mesa 软件包,该软件包同时提供用于 3D 加速的 DRI 驱动程序和用于 加速视频解码 的 VA-API/VDPAU 驱动程序。

实验性

对于某些用户来说,使用 mesa 的上游实验性构建版本可能是有价值的。

安装 mesa-gitAUR 软件包,该软件包提供用于 3D 加速的 DRI 驱动程序。

  • 为了获得 32 位应用程序支持,另请从 mesa-git 仓库或 AUR 安装 lib32-mesa-gitAUR 软件包。
  • 对于 DDX 驱动程序(在 Xorg 中提供 2D 加速),安装 xf86-video-amdgpu-gitAUR 软件包。
  • 对于使用 mesa-git 仓库的 Vulkan 支持,安装 vulkan-radeon-git 软件包。可选地,安装 lib32-vulkan-radeon-git 软件包以获得 32 位应用程序支持。如果从 AUR 构建 mesa-gitAUR,则不需要这样做。
提示: 不希望经历编译 mesa-gitAUR 软件包过程的用户可以使用 mesa-git 非官方用户仓库。

启用南方群岛 (SI) 和海岛 (CIK) 支持

官方支持的内核 启用了 AMDGPU 对南方群岛 (GCN 1,2012 年发布) 和海岛 (GCN 2,2013 年发布) 显卡的支持。amdgpu 内核驱动程序需要在 radeon 之前加载。您可以通过运行 lspci -k 来检查加载了哪个内核驱动程序。它应该像这样

$ lspci -k -d ::03xx
01:00.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] Curacao PRO [Radeon R7 370 / R9 270/370 OEM]
	Subsystem: Gigabyte Technology Co., Ltd Device 226c
	Kernel driver in use: amdgpu
	Kernel modules: radeon, amdgpu

如果未使用 amdgpu 驱动程序,请按照下一节中的说明进行操作。

加载 amdgpu 驱动程序

amdgpuradeon 模块的 模块参数 均为 cik_support=si_support=

它们需要设置为内核参数或 modprobe 配置文件,并取决于显卡的 GCN 版本。

如果您不确定拥有哪个内核显卡,则可以使用这两个参数。

提示: dmesg 可能会指示要使用的正确内核参数:[..] amdgpu 0000:01:00.0: Use radeon.cik_support=0 amdgpu.cik_support=1 to override
在内核命令行中设置模块参数

设置以下 内核参数 之一

  • 南方群岛 (SI):radeon.si_support=0 amdgpu.si_support=1
  • 海岛 (CIK):radeon.cik_support=0 amdgpu.cik_support=1

指定正确的模块顺序

确保 amdgpu 已在 Mkinitcpio#MODULES 数组中设置为第一个模块,例如 MODULES=(amdgpu radeon)

设置内核模块参数

对于南方群岛 (SI),使用 si_support=1 内核模块参数,对于海岛 (CIK),使用 cik_support=1

/etc/modprobe.d/amdgpu.conf
options amdgpu si_support=1
options amdgpu cik_support=1
/etc/modprobe.d/radeon.conf
options radeon si_support=0
options radeon cik_support=0

确保 modconf/etc/mkinitcpio.conf 中的 HOOKS 数组中,并重新生成 initramfs

编译支持 amdgpu 驱动程序的内核

在构建或编译 内核 时,应在配置中设置 CONFIG_DRM_AMDGPU_SI=Y 和/或 CONFIG_DRM_AMDGPU_CIK=Y

ACO 编译器

ACO 编译器 是由 Valve Corporation 创建和开发的开源着色器编译器,旨在直接与 LLVM 编译器AMDVLK 驱动程序 以及 Windows 10 竞争。与 LLVM 和 AMDVLK 相比,它提供了更短的编译时间,并且在游戏时性能更好。

一些基准测试可以在 GitHub 和 Phoronix (1) (2) (3) 上查看。

mesa 版本 20.2 起,ACO 是默认的着色器编译器。

加载

amdgpu 内核模块应该在系统启动时自动加载。

如果它没有加载

它可能已加载,但加载较晚,在 X 服务器需要它之后。在这种情况下,请参阅 内核模式设置#提前 KMS 启动

Xorg 配置

Xorg 将自动加载驱动程序,并将使用您显示器的 EDID 来设置原始分辨率。配置仅在调整驱动程序时才需要。

如果您想要手动配置,请创建 /etc/X11/xorg.conf.d/20-amdgpu.conf,并添加以下内容

/etc/X11/xorg.conf.d/20-amdgpu.conf
Section "OutputClass"
     Identifier "AMD"
     MatchDriver "amdgpu"
     Driver "amdgpu"
EndSection

使用此部分,您可以启用功能并调整驱动程序设置,在设置驱动程序选项之前,请先参阅 amdgpu(4)

无撕裂渲染

TearFree 控制使用硬件页面翻转机制来防止撕裂。默认情况下,对于旋转的输出、应用了 RandR 变换的输出以及 RandR 1.4 从属输出,TearFree 将处于启用状态,而对于其他所有内容,则处于禁用状态。或者,您可以分别使用 truefalse 将其配置为始终启用或始终禁用。

Option "TearFree" "true"

您也可以使用 xrandr 临时启用 TearFree

$ xrandr --output output --set TearFree on

其中 output 应类似于 DisplayPort-0HDMI-A-0,并且可以通过运行 xrandr -q 获取。

DRI 级别

DRI 设置要启用的最大 DRI 级别。有效值为 2 (DRI2) 或 3 (DRI3)。如果 Xorg 版本 >= 1.18.3,则默认值为 3 (DRI3),否则使用 DRI2

Option "DRI" "3"

可变刷新率

参见 可变刷新率

10 位色彩

警告: 许多应用程序在启用 10 位色彩时可能会出现图形伪影或崩溃。这尤其包括 Steam,它会因 X 错误而崩溃。

较新的 AMD 显卡支持 10bpc 色彩,但默认设置为 24 位色彩,并且必须显式启用 30 位色彩。如果应用程序也支持此功能,则启用它可以减少渐变中的可见条带/伪影。要检查您的显示器是否支持它,请在您的 Xorg 日志文件 (例如 /var/log/Xorg.0.log~/.local/share/xorg/Xorg.0.log) 中搜索 "EDID"

[   336.695] (II) AMDGPU(0): EDID for output DisplayPort-0
[   336.695] (II) AMDGPU(0): EDID for output DisplayPort-1
[   336.695] (II) AMDGPU(0): Manufacturer: DEL  Model: a0ec  Serial#: 123456789
[   336.695] (II) AMDGPU(0): Year: 2018  Week: 23
[   336.695] (II) AMDGPU(0): EDID Version: 1.4
[   336.695] (II) AMDGPU(0): Digital Display Input
[   336.695] (II) AMDGPU(0): 10 bits per channel

要检查当前是否已启用,请搜索 "Depth")

[   336.618] (**) AMDGPU(0): Depth 30, (--) framebuffer bpp 32
[   336.618] (II) AMDGPU(0): Pixel depth = 30 bits stored in 4 bytes (32 bpp pixmaps)

使用默认配置,它将改为显示深度为 24,其中 24 位存储在 4 个字节中。

要检查 10 位是否有效,请退出 Xorg(如果正在运行),然后运行 Xorg -retro,这将显示一个黑白网格,然后按 Ctrl-Alt-F1Ctrl-C 退出 X,并运行 Xorg -depth 30 -retro。如果这工作正常,则 10 位工作正常。

要通过 startx 以 10 位启动,请使用 startx -- -depth 30。要永久启用它,请创建或添加到

/etc/X11/xorg.conf.d/20-amdgpu.conf
Section "Screen"
	Identifier "asdf"
	DefaultDepth 30
EndSection

减少输出延迟

如果您想最大限度地减少延迟,可以禁用页面翻转和无撕裂

/etc/X11/xorg.conf.d/20-amdgpu.conf
Section "OutputClass"
     Identifier "AMD"
     MatchDriver "amdgpu"
     Driver "amdgpu"
     Option "EnablePageFlip" "off"
     Option "TearFree" "false"
EndSection

请参阅 游戏#减少 DRI 延迟 以进一步减少延迟。

注意: 设置这些选项可能会导致出现撕裂和短暂的伪影。

功能特性

视频加速

参见 硬件视频加速#AMD/ATI

监控

监控您的 GPU 通常用于检查温度以及 GPU 的 P 状态。

CLI

  • amdgpu_top — 用于显示 AMDGPU 使用率的工具
https://github.com/Umio-Yasuno/amdgpu_top || amdgpu_topAUR
  • nvtop — 用于 AMD、Intel 和 NVIDIA 的 GPU 进程监控
https://github.com/Syllo/nvtop || nvtop
  • radeontop — GPU 利用率查看器,包括总活动百分比和各个块
https://github.com/clbr/radeontop || radeontop

GUI

  • amdgpu_top — 用于显示 AMDGPU 使用率的工具
https://github.com/Umio-Yasuno/amdgpu_top || amdgpu_topAUR
  • AmdGuid — 一个完全用 Rust 编写的基本风扇控制 GUI。
https://github.com/Eraden/amdgpud || amdguid-wayland-binAUR, amdguid-glow-binAUR
  • TuxClocker — 一个 Qt5 监控和超频工具。
https://github.com/Lurkki14/tuxclocker || tuxclockerAUR

手动

要检查 GPU 的 P 状态,请执行

$ cat /sys/class/drm/card0/device/pp_od_clk_voltage

要监控 GPU,请执行

# watch -n 0.5 cat /sys/kernel/debug/dri/0/amdgpu_pm_info

要检查 GPU 利用率,请执行

$ cat /sys/class/drm/card0/device/gpu_busy_percent

要检查 GPU 频率,请执行

$ cat /sys/class/drm/card0/device/pp_dpm_sclk

要检查 GPU 温度,请执行

$ cat /sys/class/drm/card0/device/hwmon/hwmon*/temp1_input

要检查 VRAM 频率,请执行

$ cat /sys/class/drm/card0/device/pp_dpm_mclk

要检查 VRAM 使用率,请执行

$ cat /sys/class/drm/card0/device/mem_info_vram_used

要检查 VRAM 大小,请执行

$ cat /sys/class/drm/card0/device/mem_info_vram_total

超频

自 Linux 4.17 起,一旦您在启动时启用了以下功能,就可以通过 /sys/class/drm/card0/device/pp_od_clk_voltage 调整显卡的时钟和电压。

启动参数

需要通过附加 内核参数 amdgpu.ppfeaturemask=0xffffffff 来解锁对 sysfs 中调整时钟和电压的访问。

并非所有位都已定义,并且随着时间的推移可能会添加新功能。设置所有 32 位可能会启用不稳定的功能,从而导致诸如屏幕闪烁或从挂起恢复后损坏的问题。设置 PP_OVERDRIVE_MASK 位 (0x4000) 并结合默认 ppfeaturemask 应该就足够了。要为您的系统计算合理的参数,请执行

$ printf 'amdgpu.ppfeaturemask=0x%x\n' "$(($(cat /sys/module/amdgpu/parameters/ppfeaturemask) | 0x4000))"

手动(默认)

注意: 在 sysfs 中,诸如 /sys/class/drm/... 之类的路径只是符号链接,并且在重新启动之间可能会更改。持久位置可以在 /sys/devices/ 中找到,例如 /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/。相应地调整命令以获得可靠的结果。

有关所有可能选项的深入信息,请阅读内核文档 amdgpu thermal control

要将例如 Polaris GPU 上最大 P 状态 7 的 GPU 时钟设置为 1209MHz 和 900mV 电压,请运行

# echo "s 7 1209 900" > /sys/class/drm/card0/device/pp_od_clk_voltage

相同的过程可以应用于 VRAM,例如 Polaris 5xx 系列显卡上的最大 P 状态 2

# echo "m 2 1850 850" > /sys/class/drm/card0/device/pp_od_clk_voltage
警告: 仔细检查输入的值,因为错误可能会立即导致致命的硬件损坏!

要应用,请运行

# echo "c" > /sys/class/drm/card0/device/pp_od_clk_voltage

要检查是否成功,请在 3D 负载下读出时钟和电压

# watch -n 0.5  cat /sys/kernel/debug/dri/0/amdgpu_pm_info

您可以使用以下命令重置为默认值

# echo "r" > /sys/class/drm/card0/device/pp_od_clk_voltage

也可以禁止驱动程序切换到某些 P 状态,例如,解决深度省电 P 状态的问题,例如闪烁的伪影或卡顿。要在显卡上强制使用最高的 VRAM P 状态,同时仍然允许 GPU 本身以较低的时钟速度运行,请首先找到最高的可能 P 状态,然后设置它

$ cat /sys/class/drm/card0/device/pp_dpm_mclk
0: 96Mhz *
1: 456Mhz 
2: 675Mhz 
3: 1000Mhz 
# echo "manual" > /sys/class/drm/card0/device/power_dpm_force_performance_level
# echo "3" >  /sys/class/drm/card0/device/pp_dpm_mclk

仅允许三个最高的 GPU P 状态

# echo "5 6 7" > /sys/class/drm/card0/device/pp_dpm_sclk

要将 GPU 的允许最大功耗设置为例如 50 瓦,请运行

# echo 50000000 > /sys/class/drm/card0/device/hwmon/hwmon0/power1_cap
注意: 以上步骤已在 Polaris RX 560 显卡上测试过。不同的 GPU 可能有不同的行为或错误。

辅助

如果您不倾向于完全手动超频 GPU,社区提供了一些超频工具来帮助您超频和监控 AMD GPU。

CLI 工具
  • amdgpu-clocks — 一个可用于监控和设置 AMD GPU 自定义电源状态的脚本。它还提供了一个 Systemd 服务,以便在启动时自动应用设置。
https://github.com/sibradzic/amdgpu-clocks || amdgpu-clocks-gitAUR
GUI 工具
  • TuxClocker — 一个 Qt5 监控和超频工具。
https://github.com/Lurkki14/tuxclocker || tuxclockerAUR
  • CoreCtrl — 一个具有类似 WattMan UI 的 GUI 超频工具,支持每个应用程序的配置文件。
https://gitlab.com/corectrl/corectrl || corectrl
  • LACT — 一个用于查看信息和控制 AMD GPU 的 GTK 工具。
https://github.com/ilya-zlobintsev/LACT || lact
警告: LACT 守护程序与 power-profiles-daemon 冲突。您可以在后者中禁用 amdgpu_dpm 以避免冲突。(1)

启动时启动

一种方法是使用 systemd 单元,如果您希望您的设置在启动时自动应用,请考虑查看此 Reddit 帖子 以配置并在启动时应用您的设置。

另一种方法是对某些值使用 udev 规则,例如,设置低性能级别以节省能源

/etc/udev/rules.d/30-amdgpu-low-power.rules
ACTION=="add", SUBSYSTEM=="drm", DRIVERS=="amdgpu", ATTR{device/power_dpm_force_performance_level}="low"

性能级别

AMDGPU 提供多种性能级别,文件 power_dpm_force_performance_level 用于此目的,可以在以下级别之间进行选择

  • auto:在驱动程序中动态选择当前情况的最佳电源配置文件。
  • low:时钟被强制设置为最低功耗状态。
  • high:时钟被强制设置为最高功耗状态。
  • manual:用户可以手动调整为每个时钟域启用的电源状态(用于设置 #电源配置文件
  • profile_standardprofile_min_sclkprofile_min_mclkprofile_peak:时钟和电源门控被禁用,并且时钟设置为不同的分析情况。此模式建议用于分析特定工作负载

要将 AMDGPU 设备设置为使用低性能级别,可以执行以下命令

# echo "low" > /sys/class/drm/card0/device/power_dpm_force_performance_level
注意: 性能级别更改应在每次启动时重新应用,请参阅 #启动时启动 以实现自动化。

电源配置文件

AMDGPU 通过电源配置文件提供多种优化,其中最常用的是用于 OpenCL 密集型应用程序的计算模式。可以使用以下命令列出可用的电源配置文件

$ cat /sys/class/drm/card0/device/pp_power_profile_mode
NUM        MODE_NAME     SCLK_UP_HYST   SCLK_DOWN_HYST SCLK_ACTIVE_LEVEL     MCLK_UP_HYST   MCLK_DOWN_HYST MCLK_ACTIVE_LEVEL
  0   BOOTUP_DEFAULT:        -                -                -                -                -                -
  1   3D_FULL_SCREEN:        0              100               30                0              100               10
  2     POWER_SAVING:       10                0               30                -                -                -
  3            VIDEO:        -                -                -               10               16               31
  4               VR:        0               11               50                0              100               10
  5        COMPUTE *:        0                5               30               10               60               25
  6           CUSTOM:        -                -                -                -                -                -
注意: card0 标识您机器中的特定 GPU,如果有多​​个 GPU,请务必寻址正确的 GPU。

要使用特定的电源配置文件,您应该首先使用以下命令启用对其的手动控制

# echo "manual" > /sys/class/drm/card0/device/power_dpm_force_performance_level

然后通过写入与其关联的 NUM 字段来选择电源配置文件,例如,要启用 COMPUTE,请运行

# echo "5" > /sys/class/drm/card0/device/pp_power_profile_mode
注意: 电源配置文件更改应在每次启动时重新应用,请参阅 #启动时启动 以实现自动化。

启用 GPU 显示缩放

本文或章节是与 xrandr 合并的候选对象。

注释: 不特定于 AMDGPU。(在 Talk:AMDGPU#将“启用 GPU 显示缩放”移动到 xrandr 中讨论)

要避免使用显示器内置的缩放器,并在不使用显示器的原始分辨率时改用 GPU 自己的缩放器,请执行

$ xrandr --output output --set "scaling mode" scaling_mode

"scaling mode" 的可能值为:NoneFullCenterFull aspect

  • 要显示可用的输出和设置,请执行
    $ xrandr --prop
  • 要为每个可用的输出设置 scaling mode = Full aspect,请执行
    $ for output in $(xrandr --prop | grep -E -o -i "^[A-Z\-]+-[0-9]+"); do xrandr --output "$output" --set "scaling mode" "Full aspect"; done

故障排除

模块参数

amdgpu 模块将多个配置参数 (modinfo amdgpu | grep mask) 隐藏在仅在 内核源代码 中记录的掩码中。

Xorg 或应用程序无法启动

  • 打开 glxgears 后出现 "(EE) AMDGPU(0): [DRI2] DRI2SwapBuffers: drawable has no back or front?" 错误,可以打开 Xorg 服务器但 OpenGL 应用程序崩溃。
  • "(EE) AMDGPU(0): Given depth (32) is not supported by amdgpu driver" 错误,Xorg 将无法启动。

将 Xorg 下的屏幕深度设置为 16 或 32 将导致问题/崩溃。为避免这种情况,您应该使用标准的 24 位屏幕深度,方法是将此添加到您的 "screen" 部分

/etc/X11/xorg.conf.d/10-screen.conf
Section "Screen"
       Identifier     "Screen"
       DefaultDepth    24
       SubSection      "Display"
               Depth   24
       EndSubSection
EndSection

屏幕伪影和频率问题

动态电源管理 可能会导致在以较高频率(任何高于 60Hz 的频率)显示到显示器时出现屏幕伪影,这是由于 GPU 时钟速度管理方式的问题[1][2]

一种解决方法 [3] 是将 highlow 保存在 /sys/class/drm/card0/device/power_dpm_force_performance_level 中。

为了使其持久化,您可以创建一个 udev 规则

/etc/udev/rules.d/30-amdgpu-pm.rules
KERNEL=="card0", SUBSYSTEM=="drm", DRIVERS=="amdgpu", ATTR{device/power_dpm_force_performance_level}="high"

要确定 KERNEL 名称,请执行

$ find /sys/class/drm/ -regextype awk -regex '.+/card[0-9]+' -printf '%f\n'

还有一个 GUI 解决方案 [4],您可以在其中使用 radeon-profile-gitAURradeon-profile-daemon-gitAUR 管理 "power_dpm"。

更改内核版本也有助于消除此问题。例如,在 6.12.9 中似乎已修复。

Chromium 中的伪影

如果您在 Chromium 中看到伪影,强制使用基于 vulkan 的后端可能会有所帮助。转到 chrome://flags启用 #ignore-gpu-blocklist#enable-vulkan

R9 390 系列性能低下和/或不稳定

如果您在使用 AMD R9 390 系列显卡时遇到问题 [5],请将 radeon.cik_support=0 radeon.si_support=0 amdgpu.cik_support=1 amdgpu.si_support=1 amdgpu.dc=1 设置为 内核参数,以强制使用 amdgpu 驱动程序而不是 radeon。

如果仍然无效,禁用 DPM 可能会有所帮助,将 radeon.cik_support=0 radeon.si_support=0 amdgpu.cik_support=1 amdgpu.si_support=1 添加到 内核参数

在 "[drm] IP block:gmc_v8_0 is hung!" 内核错误下冻结

如果您在使用 GPU 密集型任务期间遇到冻结和内核崩溃,并出现内核错误 "[drm] IP block:gmc_v8_0 is hung!" [6],一种解决方法是将 amdgpu.vm_update_mode=3 设置为 内核参数,以强制使用 CPU 完成 GPUVM 页表更新。缺点在此处列出 [7]

屏幕闪烁白色/灰色

当您更改分辨率或连接到外部显示器时,如果屏幕闪烁或保持白色,请添加 amdgpu.sg_display=0 作为 内核参数

在 Vega 显卡上玩游戏时系统冻结或崩溃

动态电源管理 可能会由于 GPU 时钟速度管理方式的问题,导致在游戏时系统完全冻结。[8] 一种解决方法是禁用动态电源管理,有关详细信息,请参阅 ATI#动态电源管理

WebRenderer (Firefox) 损坏

当用户强制启用 WebRenderer 时,可能会出现伪影和其他异常情况(例如,无法选择扩展选项)。解决方法是回退到 OpenGL 合成。

双倍速或“花栗鼠”音频,或者连接 4K@60Hz 设备时没有音频

有时是由于 AMDGPU 设备和通过 HDMI 连接的 4K 显示器之间的通信问题引起的。一种可能的解决方法是通过显示器的内置设置启用 HDR 或“超高清深色”。在许多基于 Android 的电视上,这意味着将其设置为“标准”而不是“最佳”。

独立 amdgpu 显卡的电源管理/动态重新激活问题

如果您遇到内核驱动程序已加载,但独立显卡仍然不可用于游戏或在使用期间被禁用(类似于 [9])的问题,您可以通过设置 内核参数 amdgpu.runpm=0 来解决此问题,这可以防止 dGPU 在运行时动态断电。

kfd: amdgpu: TOPAZ 在 kfd 中不受支持

在系统日志或内核消息密钥环中,可能会出现严重级别错误消息

kfd: amdgpu: TOPAZ not supported in kfd

如果您不打算使用 Radeon Open Compute,则可以安全地忽略此消息。TOPAZ 不支持它,因为它们是旧 GPU。[10] [11]

MCLK 锁定在最大值 (1000MHz) 或最小值 (96MHz) 导致空闲功耗过高,并造成游戏性能低下(在 6.4 内核上)

在高分辨率和高刷新率下,MCLK (显存/内存时钟) 可能会锁定在最高时钟频率 (1000MHz) [12] [13],从而导致更高的 GPU 空闲功耗。在 Linux 内核 6.4.x 上,MCLK 时钟频率会锁定在最低值 (96MHz),导致游戏性能低下 [14] [15]

这很可能是由于显示器没有对受影响的分辨率和刷新率使用具有低 V-Blank 值的 Coordinated Video Timings (CVT) 造成的,请参阅此 gist 以获取解决方法。

挂起到内存 (Suspend to RAM) 失败

当系统进入 S3 状态时,amdgpu 内核模块尝试将 VRAM 缓冲到 RAM 中,以防止 VRAM 衰减导致的数据丢失,因为 VRAM 没有得到充分的刷新。

如果您使用了大量 VRAM 并且可用 RAM 不足,这可能会失败,即使有足够的 SWAP 内存可用,因为 IO 子系统可能在此之前已被挂起。

您会看到类似这样的信息

kernel: systemd-sleep: page allocation failure: order:0, mode:0x100c02(GFP_NOIO|__GFP_HIGHMEM|__GFP_HARDWALL), nodemask=(null),cpuset=/,mems_allowed=0
kernel: Call Trace:
kernel:  <TASK>
kernel:  dump_stack_lvl+0x47/0x60
kernel:  warn_alloc+0x165/0x1e0
kernel:  __alloc_pages_slowpath.constprop.0+0xd7d/0xde0
kernel:  __alloc_pages+0x32d/0x350
kernel:  ttm_pool_alloc+0x19f/0x600 [ttm 0bd92a9d9dccc3a4f19554535860aaeda76eb4f4]

作为一种解决方法,用户空间服务 可以确保分配足够的 RAM 来缓冲 VRAM,方法是在系统挂起之前换出足够的 RAM。

关机和挂起失败

此文章或章节需要扩充。

原因: 缺少内核信息和错误报告。(在Talk:AMDGPU中讨论)

hid_sensor_*_3d 内核模块组可能会导致系统在启动、关机和挂起时卡死。进程列表将显示多个 udev-worker 实例,这些实例在系统睡眠时无法冻结。

您会看到类似这样的信息

kernel: PM: suspend entry (deep)
kernel: Filesystems sync: 0.002 seconds
kernel: Freezing user space processes
kernel: Freezing user space processes failed after 20.004 seconds (1 tasks refusing to freeze, wq_busy=0):
kernel: task:(udev-worker)   state:D stack:0     pid:479   tgid:479   ppid:422    flags:0x00004006
kernel: Call Trace:
kernel:  <TASK>
kernel:  __schedule+0x3db/0x1520
kernel:  ? srso_alias_return_thunk+0x5/0xfbef5
kernel:  ? __wake_up_common+0x78/0xa0
kernel:  ? srso_alias_return_thunk+0x5/0xfbef5

要解决此问题,请通过创建例如 /etc/modprobe.d/blacklist-hid_sensors.conf 来禁用有问题的模块。

blacklist hid_sensor_accel_3d
blacklist hid_sensor_gyro_3d
blacklist hid_sensor_magn_3d

另请参阅