我试图理解以下消息的含义:
irq N:nobody cared (try booting with the "irqpoll" option)
这是否意味着 IRQ 处理程序即使收到中断也不处理响应?或者调度程序未能调用 irq 处理程序?
这是在什么情况下发生的?
我试图理解以下消息的含义:
irq N:nobody cared (try booting with the "irqpoll" option)
这是否意味着 IRQ 处理程序即使收到中断也不处理响应?或者调度程序未能调用 irq 处理程序?
这是在什么情况下发生的?
这意味着要么没有为该 irq 注册处理程序,要么返回的状态表明 irq 不适合他(来自他支持的硬件),以防共享中断可能是有故障的硬件/固件或错误的驱动程序
理想情况下,上述消息后面应该有一个堆栈跟踪,它应该可以帮助您确定哪个子系统导致了问题。此消息意味着中断处理程序由于开销而被卡住,并且没有返回,从而导致系统禁用 IRQ#X。在固件有问题的情况下会出现这种情况。
该irqpoll
选项需要添加到 grub.conf,这意味着,当未处理中断时,搜索所有已知的中断处理程序以查找适当的处理程序,并检查每个计时器中断的所有处理程序。这有时对于让固件损坏的系统运行很有用。grub.conf 中的内核命令行应如下所示:
内核 /vmlinuz-version ro root=/dev/sda1 quiet 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 显示了一个未知设备,该设备曾经是“卡”
重新启动后,卡消失了,再也看不到了。
因此,该错误也可能显示硬件故障。
看这里:
static inline int bad_action_ret(irqreturn_t action_ret)
{
if (likely(action_ret <= (IRQ_HANDLED | IRQ_WAKE_THREAD)))
return 0;
return 1;
}