紀錄一下近期kernel為了NMI(non-maskable interrupt)的情況設計的一個 printk() 加強機制。
我們都知道,原本 NMI 發生時,如果剛好某個 core 正把 printk lock 拿住,就不能在 NMI handler 中去使用printk(),否則會 deadlock。
SUSE 工程師 Petr Mladek 提了一個patch[1],可以針對 NMI 的情況繼續使用 printk()。
基本的想法:在發生 NMI 時,呼叫 printk_nmi_enter(),printk內部就會切換到另一個printk func,log 就會推進單獨的buffer,離開 NMI context 後,再呼叫 printk_nmi_exit() 切回原本printk實作,然後起一個 irq worker,worker後續會把 NMI buffer copy 進__log_buf。
想法很簡單,但實作上許多tricky之處,請詳閱 patch 說明,或...printk() 任何情況直接用下去就對了 XD
簡單地說就是把NMI的printk做成是non-blocking的,然後用soft_irq的形式放在buffer,等有空的時候就會去執行,對吧?
回覆刪除