Unreliable Guide To Hacking The Linux Kernel指出in_irq()是可靠的嗎?
你可以告訴你在一個硬件中斷,因爲in_irq()返回true。
注意。請注意,如果中斷被禁用,這將返回誤報(見下文)。
難道in_irq()
可能返回非零,而不是在Linux內核2.6.32的hardirq上下文或x86上的更新?
在我的實驗與內核2.6.32(Debian的6)和3.4(OpenSUSE中12.1),從in_irq()
即使它被稱爲local_irq_disable()
和之間的進程上下文調用時總是返回0。當我使用禁用中斷而不是local_irq*
的自旋鎖功能時,結果相同。
從內核的源代碼,我目前看不到如何in_irq()
可以返回一個誤報。任何人都可以澄清這一點?
編輯:我還試圖既*_irqsave()
和*_irq()
自旋鎖API以及local_irq_save()
/local_irq_restore()
,結果是相同的,也就是,返回in_irq()
0當中斷被禁用。在x86上通過cli
機器指令明確禁用中斷也不會強制in_irq()返回非零值。
CONFIG_PREEMPT當然是'y'。是的,我檢查了spinlock API的* _irqsave,* _irq和* _bh變體。在每種情況下,即使在自旋鎖被鎖定的情況下,in_irq()也返回0。 – Eugene
是的,我看到'in_irq()'的實現。這就是爲什麼我不明白爲什麼它不會在我的機器上產生誤報。 – Eugene
當自旋鎖被鎖定或中斷在您的實驗中被其他方式禁用時,in_irq()是否返回非零值? – Eugene