在启动时禁用 GPE ACPI 中断?

在启动时禁用 GPE ACPI 中断?

如果我寻找 ACPI 中断,我会发现:

/sys/firmware/acpi/interrupts/sci:   55414
/sys/firmware/acpi/interrupts/error:       0
/sys/firmware/acpi/interrupts/gpe00:       0   invalid
/sys/firmware/acpi/interrupts/gpe01:       0   invalid
/sys/firmware/acpi/interrupts/gpe02:       0   invalid
/sys/firmware/acpi/interrupts/gpe03:       0   invalid
/sys/firmware/acpi/interrupts/gpe04:       0   invalid
/sys/firmware/acpi/interrupts/gpe05:       0   invalid
/sys/firmware/acpi/interrupts/gpe06:       0   enabled
/sys/firmware/acpi/interrupts/gpe07:       0   enabled
/sys/firmware/acpi/interrupts/gpe08:       0   invalid
/sys/firmware/acpi/interrupts/gpe09:       0   disabled
/sys/firmware/acpi/interrupts/gpe10:       0   enabled
/sys/firmware/acpi/interrupts/gpe11:       0   invalid
/sys/firmware/acpi/interrupts/gpe12:       0   invalid
/sys/firmware/acpi/interrupts/gpe13:       0   invalid
/sys/firmware/acpi/interrupts/gpe14:       1   enabled
/sys/firmware/acpi/interrupts/gpe15:       0   invalid
/sys/firmware/acpi/interrupts/gpe16:       1   enabled
/sys/firmware/acpi/interrupts/gpe0A:       0   invalid
/sys/firmware/acpi/interrupts/gpe17:   54753   enabled
/sys/firmware/acpi/interrupts/gpe0B:       0   invalid
/sys/firmware/acpi/interrupts/gpe18:       0   invalid
/sys/firmware/acpi/interrupts/gpe0C:       0   invalid
/sys/firmware/acpi/interrupts/gpe19:       0   invalid
/sys/firmware/acpi/interrupts/gpe0D:       0   disabled
/sys/firmware/acpi/interrupts/gpe0E:       0   invalid
/sys/firmware/acpi/interrupts/gpe20:       0   invalid
/sys/firmware/acpi/interrupts/gpe0F:       0   invalid
/sys/firmware/acpi/interrupts/gpe21:       0   invalid
/sys/firmware/acpi/interrupts/gpe22:       0   invalid
/sys/firmware/acpi/interrupts/gpe23:       0   enabled
/sys/firmware/acpi/interrupts/gpe24:       0   invalid
/sys/firmware/acpi/interrupts/gpe25:       0   invalid
/sys/firmware/acpi/interrupts/gpe26:       0   invalid
/sys/firmware/acpi/interrupts/gpe1A:       0   invalid
/sys/firmware/acpi/interrupts/gpe27:       0   invalid
/sys/firmware/acpi/interrupts/gpe1B:       0   invalid
/sys/firmware/acpi/interrupts/gpe28:       0   invalid
/sys/firmware/acpi/interrupts/gpe1C:       0   invalid
/sys/firmware/acpi/interrupts/gpe29:       0   invalid
/sys/firmware/acpi/interrupts/gpe1D:       0   invalid
/sys/firmware/acpi/interrupts/gpe1E:       0   invalid
/sys/firmware/acpi/interrupts/gpe30:       0   invalid
/sys/firmware/acpi/interrupts/gpe1F:       0   invalid
/sys/firmware/acpi/interrupts/gpe31:       0   invalid
/sys/firmware/acpi/interrupts/gpe32:       0   invalid
/sys/firmware/acpi/interrupts/gpe33:       0   invalid
/sys/firmware/acpi/interrupts/gpe34:       0   invalid
/sys/firmware/acpi/interrupts/gpe35:       0   invalid
/sys/firmware/acpi/interrupts/gpe36:       0   invalid
/sys/firmware/acpi/interrupts/gpe2A:       0   invalid
/sys/firmware/acpi/interrupts/gpe37:       0   invalid
/sys/firmware/acpi/interrupts/gpe2B:       0   invalid
/sys/firmware/acpi/interrupts/gpe38:       0   invalid
/sys/firmware/acpi/interrupts/gpe2C:       0   invalid
/sys/firmware/acpi/interrupts/gpe39:       0   invalid
/sys/firmware/acpi/interrupts/gpe2D:       0   invalid
/sys/firmware/acpi/interrupts/gpe2E:       0   invalid
/sys/firmware/acpi/interrupts/gpe2F:       0   invalid
/sys/firmware/acpi/interrupts/gpe3A:       0   invalid
/sys/firmware/acpi/interrupts/gpe3B:       0   invalid
/sys/firmware/acpi/interrupts/gpe3C:       0   invalid
/sys/firmware/acpi/interrupts/gpe3D:       0   invalid
/sys/firmware/acpi/interrupts/gpe3E:       0   invalid
/sys/firmware/acpi/interrupts/gpe3F:       0   invalid
/sys/firmware/acpi/interrupts/sci_not:       0
/sys/firmware/acpi/interrupts/ff_pmtimer:       0   invalid
/sys/firmware/acpi/interrupts/ff_rt_clk:       0   disabled
/sys/firmware/acpi/interrupts/gpe_all:   55414
/sys/firmware/acpi/interrupts/ff_gbl_lock:       0   enabled
/sys/firmware/acpi/interrupts/ff_pwr_btn:       0   enabled
/sys/firmware/acpi/interrupts/ff_slp_btn:       0   invalid

我编写了一个服务脚本来在启动时禁用此功能:

#!/bin/bash

### BEGIN INIT INFO
# Provides:          disable-gpe17
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start daemon at boot time
# Description:       Enable service provided by daemon.
### END INIT INFO

logger -t gpe17 -s "Disabling gpe17 interrupts..."

/etc/pm/sleep.d/30_disable_gpe17 thaw

exit 0

这调用了我的 PM 脚本:

#!/bin/sh

echo 0 > /sys/firmware/acpi/interrupts/gpe17 2>/dev/null

我已经使这两个脚本都可执行,并添加disable-gpe17到启动脚本中:

sudo update-rc.d disable-gpe17 defaults

当我查看启动日志时,我没有看到系统日志条目的记录表明 gpe17 已被禁用。

有没有更好的方法(也许是 udev)来禁用启动时的某些中断?如果没有,为什么我的服务脚本没有在启动时运行?

我使用的是 MacBook Pro 11.5,运行内核 3.19 和 Ubuntu 14.04。

答案1

我有同样的问题,我需要为 kworker 禁用 gpe16 和 gpe17 以停止占用 CPU。我按照这里找到的食谱进行操作:http://sudoremember.blogspot.com.au/2013/05/high-cpu-usage-due-to-kworker.html

一个缩写(并已更正,至少对于我的例子)版本如下:

$ sudo -s
# echo "disable" > /sys/firmware/acpi/interrupts/gpe16
# echo "disable" > /sys/firmware/acpi/interrupts/gpe17

您现在应该可以看到 CPU 负载/听到风扇转动的声音。确保在重新启动时再次发生这种情况 - 仍然是在 root 权限下:

# crontab -e

这将打开您最喜欢的编辑器。添加这些行:

@reboot echo "disable" > /sys/firmware/acpi/interrupts/gpe16 
@reboot echo "disable" > /sys/firmware/acpi/interrupts/gpe17

由于挂起模式对我不起作用,我没有费心遵循有关如何创建脚本以在挂起后恢复时重新激活这些设置的其余说明。

答案2

在 Linux 4.19 中,我发现禁用 GPE ( echo "disable" > /sys/firmware/acpi/interrupts/gpe17) 并不能再解决这个问题。即使 GPE 被禁用,数字仍然在增加并且 CPU 仍然忙碌。自 Linux 4.10 以来,新的解决方案似乎是屏蔽而不是禁用:

# echo mask > /sys/firmware/acpi/interrupts/gpe17

或者使用启动参数acpi_mask_gpe=0x17(在 Debian/Ubuntu 中将其添加到/etc/default/grubGRUB_CMDLINE_LINUX_DEFAULT,然后运行update-grub并重新启动)。

有关更多详细信息,请参阅Linux 内核提交 9c4aa1ee它首先合并在 Linux 4.10-rc3 中,并且错误报告链接到那里。

答案3

我在旧 Macbook 2006 上运行 Lubuntu 20.10、5.8 内核时遇到同样的问题。就我而言,解决方案是使用 Peter Nowee 建议。

我将启动参数添加acpi_mask_gpe=0x17到 GRUB 并重新启动。这样就解决了CPU占用率高的问题。

我发现这个命令有问题: grep . -r /sys/firmware/acpi/interrupts/

问题: /sys/firmware/acpi/interrupts/gpe17: 3491042 EN enabled unmasked

答案4

在 Linux Lite 5.2、MacBook Pro 9.2、Bios 233.0.0.0 (6/10/2020) 上,我遇到了 gpe17 和 sci 中断问题。

上述 Peter Nowee 的解决方案有效!

我用systemctl屏蔽了它:

  1. 创建文件/etc/systemd/system/mask-gpe17.service
  2. 将以下行复制到其中并保存文件:
    [Unit]
    Description=Mask GPE 17
    
    [Service]
    ExecStart=/usr/bin/bash -c 'echo "mask" > /sys/firmware/acpi/interrupts/gpe17'
    
    [Install]
    WantedBy=multi-user.target
    
  3. 创建文件/etc/systemd/system/mask-sci.service
  4. 将以下行复制到其中并保存文件:
    [Unit]
    Description=Mask SCI
    
    [Service]
    ExecStart=/usr/bin/bash -c 'echo "mask" > /sys/firmware/acpi/interrupts/sci'
    
    [Install]
    WantedBy=multi-user.target
    
  5. 然后在终端中启用服务:
    sudo systemctl enable mask-gpe17.service
    
    sudo systemctl enable mask-sci.service
    

相关内容