Linux Device Driver - printk_ratelimit

前篇 : Linux Device Driver - module parameter

在 Linux Device Driver 3rd 的 4.2.5 章節, 介紹到 printk_ratelimit().
用之前範例程式 修改, 寫了一個 example : 

https://github.com/neojou/linuxdevicedriver/tree/master/testwifi-printk-1 


printk 在 device driver 是一個蠻常用的 debug function. 
但有時候如果在短時間印出大量的訊息, 可能會造成日誌滿溢, 或拖慢系統, 
或訊息太多反而無法 debug .. , 這時候就可以用到 printk_ratelimit()

這種情況, 最常發生在 ISR (中斷處理函式) 的 debug
因為一般程式, 軟體在撰寫時, 不會特別寫迴圈印很多訊息
( 範例中的是為了測試 printk_ratelimit() 行為, 一般不會這樣寫 )
但 ISR 有可能我們雖然裡面只寫一行 printk, 但因為短時間發生太多中斷 
( 譬如中斷沒清除, 或 HW bug) 導致印太多 printk, 這時候就可以用這函式. 

例如範例中 usb_intf.c 的 module init function, 
我們在離開前刻意 while loop 做 printk 

printk_ratelimit() 會判斷目前情況是否可以印, 可以回傳 1 , 不行回傳 0 
他的判斷方式, 主要來自兩個參數

/proc/sys/kernel/printk_ratelimit 
   the number of seconds to wait before re-enabling messages
   在重新能打印前等待的秒數

/proc/sys/kernel/printk_ratelimit_burst  
    the number of messages accepted before ratelimiting
    限速前能打印的個數

以 Ubuntu kernel 4.4.3 來看 
   printk_ratelimit : 5
   printk_ratelimit_burst : 10 

會發現 insmod 完 dmesg 中, 有 10 筆 "module init ret=... " 


PS: /proc 是 linux 虛擬的檔案, 會佔記憶體, 但不佔像硬碟的存取空間
      比較常用的像
            module 
            cpuinfo
            meminfo 
            ... 


   

留言

熱門文章