Linux Device Drivers ─
節制printk訊息產生速率
一般而言,正常運作狀態下不應該產生任何訊息,只有在發生了須要注意的異常狀態時,才可使用printk()。
但是printk()也是有被包含在無窮回圈裡的可能而導致嚴重的後果。對於需要偶爾輸出提醒訊息的情況,最好的解法是設立一個有調節作用的工具函式。
int printk_ratelimit(void);
每當你打算輸出可能會被經常重複的訊息之前,應該要先呼叫此函式,若傳回非零值才可印出訊息。範例如下:
Makefile
CFILES=hello.c
APP=prtk
KERNELDIR ?= $(shell pwd)/../../..
PWD := $(shell pwd)
obj-$(CONFIG_EMIL_LDD) := $(APP).o
$(APP)-objs := $(CFILES:.c=.o)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
$(MAKE) -C $(KERNELDIR) M=$(PWD) clean
hello.c
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
static int __init_hello(void)
{
int i=0;
for(i=0;i<1000;i++) {
if(printk_ratelimit())
printk(KERN_INFO "Hello, world(%d)\n",i);
}
return 0;
}
static void __exit_hello(void)
{
printk(KERN_INFO "Goodbye, cruel world\n");
}
module_init(__init_hello);
module_exit(__exit_hello);
Test…
# insmod prtk.ko
Hello, world(0)
Hello, world(1)
Hello, world(2)
Hello, world(3)
Hello, world(4)
Hello, world(5)
Hello, world(6)
Hello, world(7)
Hello, world(8)
Hello, world(9)
#
# rmmod prtk.ko
Goodbye, cruel world
printk_ratelimit()的原理是追蹤已有多少訊息被送到操控台,若訊息量超過臨界點,printk_ratelimit()就傳回0,並丟棄訊息。
透過/proc檔案系統,可在user-space影響printk_ratelimit()的工作參數。
透過/proc/sys/kernel/printk_ratelimit可調整「間隔秒數」 - 訊息量超過臨界值之後,要等多少秒,才可以恢復訊息的傳達。
透過/proc/sys/kernel/printk_ratelimit_burst可調整「臨界值」 - 計算訊息量最多輸出量,計算單位是「列數」。
printk_ratelimit預設為5秒
printk_ratelimit_burst預設為10列
留言列表