AMDGPU

出自 ArchWiki
(重定向自 Amdgpu

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

选择正确的驱动程序

根据您拥有的显卡,在 Xorg#AMD 中找到正确的驱动程序。此驱动程序支持 南方群岛 (GCN 1,2012 年发布) 及更高版本的显卡。AMD 没有计划支持 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) 支持

官方支持的内核 启用对南方群岛(GCN 1,2012 年发布)和海岛(GCN 2,2013 年发布)显卡的 AMDGPU 支持。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

指定正确的模块顺序

确保已在 Mkinitcpio#MODULES 数组中将 amdgpu 设置为第一个模块,例如 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_top
  • 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_top
  • 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 散热控制 的内核文档。

要将 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 — 一个 GTK 工具,用于查看信息和控制您的 AMD GPU。
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 将导致问题/崩溃。为了避免这种情况,您应该通过将此添加到您的“screen”部分来使用标准的 24 位屏幕深度

/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] 变通方法是在 /sys/class/drm/card0/device/power_dpm_force_performance_level 中保存 highlow

要使其持久化,您可以创建一个 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 设置为内核参数,以强制 GPUVM 页表更新使用 CPU 完成。缺点在此处列出 [7]

屏幕闪烁白色/灰色

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

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

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

WebRenderer (Firefox) 损坏

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

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

这有时是由 AMDGPU 设备和通过 HDMI 连接的 4K 显示器之间的通信问题引起的。一种可能的变通方法是通过显示器的内置设置启用 HDR 或 “Ultra HD Deep Color”。在许多基于 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 锁定在 MAX (1000MHz) 或 MIN (96MHz) 导致游戏性能低下(在 6.4 内核上)而导致的高空闲功耗

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

这可能是由于显示器未使用协调视频时序 (CVT) 以及受影响的分辨率和刷新率的低 V-Blank 值,请参阅 此 gist 以获取解决方法。

无法挂起到 RAM

当系统进入 S3 时,amdgpu 内核模块尝试在 RAM 中缓冲 VRAM,以防止通过 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

另请参阅