AMDGPU

出自 ArchWiki

AMDGPU 是 AMD Radeon 显卡的开源图形驱动,自 Graphics Core Next 系列开始。

选择正确的驱动

根据您拥有的显卡,在 Xorg#AMD 中找到正确的驱动。此驱动支持 Southern Islands (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 非官方用户仓库。

启用 Southern Islands (SI) 和 Sea Islands (CIK) 支持

官方支持的内核 启用了 AMDGPU 对 Southern Islands (GCN 1,发布于 2012 年) 和 Sea Islands (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
在内核命令行中设置模块参数

设置以下 内核参数 之一

  • Southern Islands (SI): radeon.si_support=0 amdgpu.si_support=1
  • Sea Islands (CIK): radeon.cik_support=0 amdgpu.cik_support=1

指定正确的模块顺序

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

设置内核模块参数

对于 Southern Islands (SI),使用 si_support=1 内核模块参数,对于 Sea Islands (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 控制使用硬件页面翻转机制来防止撕裂。默认情况下,TearFree 将对旋转的输出、应用了 RandR 转换的输出以及 RandR 1.4 从属输出启用,而对其余所有内容禁用。或者,您可以分别使用 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,其中 4 字节存储 24 位。

要检查 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 散热控制 的内核文档。

要将例如 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] 是将 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 或“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 内核 6.4.x 上,MCLK 以最低 (96MHz) 时钟频率运行,导致游戏性能低下 [14] [15]

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

挂起到 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

另请参阅