5

不可靠的黑客指南 Linux 内核指出

您可以知道您处于硬件中断中,因为 in_irq() 返回 true。
小心。请注意,如果禁用中断,这将返回误报(见下文)。

在 Linux 内核 2.6.32 或 x86 上的更新版本中,是否真的in_irq()可能返回非零而不是在 hardirq 上下文中?

在我对内核 2.6.32 (Debian 6) 和 3.4 (OpenSUSE 12.1) 的实验中,in_irq()从进程上下文调用时总是返回 0,即使它是在 和 之间调用local_irq_disable()local_irq_enable()。当我使用禁用中断而不是local_irq*.

从内核的源代码中,我目前看不到如何in_irq()返回误报。有人可以澄清一下吗?

编辑:我也尝试了*_irqsave()*_irq()spinlock API 以及local_irq_save()/ local_irq_restore(),结果是一样的,也就是说,in_irq()当中断被禁用时返回 0 。通过 x86 上的机器指令显式禁用中断cli也不会强制 in_irq() 返回非零值。

4

1 回答 1

3

in_irq()是一个包装器,它查看 中的一些位preempt_count,它是thread_info结构中的一个 int,值 0 表示它没有被抢占,所以它不在 irq 中。

local_irq_disable()本身不会影响该计数,但影响,因此可能导致误报。你说你使用了自旋锁功能,你用过这个吗?如果是这样,请查看 preempt_count 的值是否在变化。spin_lock_irqsave()

编辑:只是为了涵盖所有基础,检查以确保启用内核抢占。

于 2013-02-12T16:00:52.350 回答