in_irq()可靠吗?

时间:2013-02-04 07:31:14

标签: linux-kernel x86 kernel irq

Unreliable Guide To Hacking The Linux Kernel表示

  

你可以告诉你是在硬件中断,因为in_irq()返回true   的注意即可。请注意,如果禁用中断,这将返回误报(见下文)。

真的情况是in_irq()可能在Linux内核2.6.32或更新的x86上没有在hardirq上下文中返回非零吗?

在我使用内核2.6.32(Debian 6)和3.4(OpenSUSE 12.1)的实验中,in_irq()在从进程上下文调用时始终返回0,即使它是在local_irq_disable()和{local_irq_enable()之间调用的{1}}。当我使用禁用中断而不是local_irq*的自旋锁功能时,结果是一样的。

从内核的源代码来看,我目前无法看到in_irq()如何返回误报。任何人都可以澄清这个吗?

编辑:我还尝试了*_irqsave()*_irq()螺旋锁API以及local_irq_save() / local_irq_restore(),结果相同,即{{1禁用中断时返回0。通过x86上的in_irq()机器指令显式禁用中断也不会强制in_irq()返回非零值。

1 个答案:

答案 0 :(得分:3)

in_irq()looks at some bits in preempt_count的包装器,它是thread_info结构中的int,值为0意味着它不会被抢占,所以它不在irq中。

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

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