2013-02-04 151 views
5

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()返回非零值。

回答

3

in_irq()是一個包裝,looks at some bits in preempt_count,它是一個int在thread_info結構和值0意味着它沒有被搶佔,所以它不是在irq。

local_irq_disable()本身並不影響該計數,但spin_lock_irqsave()does,這樣可能會導致誤報。你說你使用了自旋鎖功能,你用過這個嗎?如果是,請查看preempt_count的值是否正在改變。

編輯:只是爲了覆蓋所有的基地,檢查以確保啓用內核搶佔。

+0

CONFIG_PREEMPT當然是'y'。是的,我檢查了spinlock API的* _irqsave,* _irq和* _bh變體。在每種情況下,即使在自旋鎖被鎖定的情況下,in_irq()也返回0。 – Eugene

+0

是的,我看到'in_irq()'的實現。這就是爲什麼我不明白爲什麼它不會在我的機器上產生誤報。 – Eugene

+0

當自旋鎖被鎖定或中斷在您的實驗中被其他方式禁用時,in_irq()是否返回非零值? – Eugene