英语

IRQ 标志状态跟踪

作者:

由 Ingo Molnar <mingo@redhat.com> 发起

“irq-flags 跟踪”功能“跟踪”硬中断 (hardirq) 和软中断 (softirq) 状态,即它为感兴趣的子系统提供了一个机会,以便在内核中发生的每个 hardirqs-off/hardirqs-on、softirqs-off/softirqs-on 事件时得到通知。

CONFIG_TRACE_IRQFLAGS_SUPPORT 是 CONFIG_PROVE_SPIN_LOCKING 和 CONFIG_PROVE_RW_LOCKING 能够由通用锁调试代码提供的必要条件。否则,在架构上只会提供 CONFIG_PROVE_MUTEX_LOCKING 和 CONFIG_PROVE_RWSEM_LOCKING - 这些是在 IRQ 上下文中不使用的锁 API。(rwsems 的一个例外已得到解决)

对此的架构支持肯定不属于“微不足道”的范畴,因为很多底层汇编代码都处理 irq-flags 状态变化。但是,架构可以通过一种相当直接且无风险的方式启用 irq-flags 跟踪。

想要支持此功能的架构首先需要进行一些代码组织更改

  • 在其架构级别的 Kconfig 文件中添加并启用 TRACE_IRQFLAGS_SUPPORT

然后还需要进行一些功能上的更改来实现 irq-flags 跟踪支持

  • 在底层入口代码中,添加(构建条件)对 trace_hardirqs_off()/trace_hardirqs_on() 函数的调用。锁验证器密切监视“实际” irq-flags 是否与“虚拟” irq-flags 状态匹配,如果两者不匹配,则会大声抱怨(并自行关闭)。通常,架构对 irq-flags 跟踪的大部分支持都花在这种状态下:查看 lockdep 抱怨,尝试找出我们尚未覆盖的汇编代码,修复并重复。一旦系统启动并工作,并且在 irq-flags 跟踪函数中没有 lockdep 抱怨,架构支持就完成了。

  • 如果该架构有不可屏蔽的中断,则需要通过 lockdep_off()/lockdep_on() 将其从 irq 跟踪[和锁验证]机制中排除。

一般来说,架构中有一个不完整的 irq-flags 跟踪实现没有任何风险:lockdep 会检测到这一点并自行关闭。也就是说,锁验证器仍然是可靠的。由于 irq 跟踪错误,不应该发生崩溃。(除非汇编更改通过修改不应修改的条件或寄存器来破坏其他代码)