IRQ標誌狀態追蹤

作者:

由Ingo Molnar <mingo@redhat.com>開始

“irq-flags 追蹤”特性“追蹤”硬中斷和軟中斷狀態,即,它為感興趣的子系統提供了一個機會,以便在核心中發生的每個硬中斷關閉/硬中斷開啟、軟中斷關閉/軟中斷開啟事件時收到通知。

CONFIG_PROVE_SPIN_LOCKING和CONFIG_PROVE_RW_LOCKING需要CONFIG_TRACE_IRQFLAGS_SUPPORT才能由通用鎖除錯程式碼提供。否則,架構上只會提供CONFIG_PROVE_MUTEX_LOCKING和CONFIG_PROVE_RWSEM_LOCKING - 這些是在IRQ上下文中不使用的鎖定API。(rwsem的例外情況已解決)

對此的架構支援肯定不屬於“瑣碎”類別,因為許多底層彙編程式碼都處理irq-flags狀態更改。但是,可以以相當簡單且無風險的方式啟用架構的irq-flags-tracing。

想要支援此功能的架構首先需要進行一些程式碼組織更改

  • 在其架構級別的Kconfig檔案中新增並啟用TRACE_IRQFLAGS_SUPPORT

然後還需要進行一些功能更改才能實現irq-flags-tracing支援

  • 在底層入口程式碼中新增(構建條件)對trace_hardirqs_off()/trace_hardirqs_on()函式的呼叫。鎖驗證器密切關注“真實”irq-flags是否與“虛擬”irq-flags狀態匹配,如果兩者不匹配,則會大聲抱怨(並關閉自身)。通常,架構支援irq-flags-tracing的大部分時間都花在這個狀態上:檢視lockdep抱怨,嘗試找出我們尚未覆蓋的彙編程式碼,修復並重復。一旦系統啟動並工作,並且在irq-flags-tracing函式中沒有lockdep抱怨,則架構支援就完成了。

  • 如果該架構具有非遮蔽中斷,則需要透過lockdep_off()/lockdep_on()將這些中斷從irq-tracing[和鎖驗證]機制中排除。

一般來說,在架構中擁有不完整的irq-flags-tracing實現沒有風險:lockdep會檢測到這一點並關閉自身。也就是說,鎖驗證器仍然是可靠的。由於irq-tracing錯誤應該不會發生崩潰。(除非彙編更改透過修改不應該修改的條件或暫存器來破壞其他程式碼)