我正在尝试理解以下消息的含义:
irq N:nobody cared (try booting with the "irqpoll" option)
这是否意味着 IRQ 处理程序即使收到中断也不会处理响应?或者调度程序未能调用 irq 处理程序?
这是在什么情况下发生的?
这意味着要么没有为该 irq 注册处理程序 或者在共享中断的情况下返回状态表明 irq 不适合他(来自他支持的硬件) 可能是有故障的硬件/固件或有缺陷的驱动程序
理想情况下,上述消息后面应该有堆栈跟踪,这应该可以帮助您确定哪个子系统导致了问题。此消息意味着中断处理程序由于开销而卡住,并且没有返回,从而导致系统禁用 IRQ#X。这在有错误的固件的情况下会出现。
需要将
irqpoll
选项添加到 grub.conf 中,这意味着,当未处理中断时,在所有已知的中断处理程序中搜索适当的处理程序,并检查每个计时器中断上的所有处理程序。有时这对于让固件损坏的系统运行很有用。 grub.conf 中的内核命令行应如下所示:
kernel /vmlinuz-version ro root=/dev/sda1 安静 irqpoll
最小可运行 QEMU 示例
QEMU 有一个名为
edu
的教育设备,它可以生成中断,非常适合探索这一点。
首先,我为其创建了一个最小的 Linux PCI 设备驱动程序,它可以正确处理中断。
现在我们可以通过从代码中注释掉
request_irq
和 free_irq
来轻松生成错误。
然后,如果我们运行生成 IRQ 的用户层程序,我们会得到:
irq 11: nobody cared (try booting with the "irqpoll" option)
后跟堆栈跟踪。
正如其他人提到的:未处理的 IRQ。
以我为例,在重新加载驱动程序后,因为网卡在短时间内出现了数十亿个错误。
modprobe -r ixgbe && modprobe ixgbe
lspci 显示了一个未知设备,其中“卡”曾经位于
重启后该卡就消失了,再也看不到了。
因此该错误也可能显示硬件故障。
我在 Lenovo m625q 瘦客户端上升级 BIOS 后收到相同的消息。
irqpoll
确实修复了错误,但我不喜欢这个解决方案。我也不想因为懒惰而降级固件。这最终导致我做了更多的工作..
我在
dmesg
中遇到的错误指向声卡。
我发现欺骗操作系统可以使事情顺利进行而不会出现错误。
acpi_osi=! acpi_osi='Windows 2013'
我首先尝试了
Windows 2015
,它对应于Windows 10初始版本。 (2013年是windows 8.1,参考linux源码),但是无法完全启动。
查看适合您的特定固件使用的可用选项
(cd /tmp && mkdir acpi && cd acpi && sudo acpidump -b && for i in *; do echo $i:; strings -a $i | grep -i windows; done)
感谢出色的答案:https://unix.stackexchange.com/a/609989/14907
我认为值得尝试或诉诸
irqpoll
,这可能会或可能不会产生可衡量的性能影响。我想取决于失败的设备/驱动程序及其使用情况。
看这里:
static inline int bad_action_ret(irqreturn_t action_ret)
{
if (likely(action_ret <= (IRQ_HANDLED | IRQ_WAKE_THREAD)))
return 0;
return 1;
}