1

我在我的內核模塊中實現了一些參數的超時。如何修改內核timer_list timeout

因此我使用struct timer_list和Associated API來實現12秒定時器。

,以便在IBM開發者提到的工作指南內核定時器使用:

struct timer_list my_timer; 
init_timer_on_stack(&my_timer); 

void tick_timer() 
{ 
    my_timer.expires = jiffies + delay * HZ; //delay is global variable int = 12. 
    my_timer.data=0; 
    my_timer.function = my_timer_func; 
    add_timer(&my_timer); 
} 

所以我的每一個計時器到期我做我的工作,my_timer_func,並再次呼籲tick_timer重置計時器的時間。

接下來,我想實現delay作爲sysctl條目。 但是,更改應立即調用tick_timer函數並用新的delay重置計時器。那麼我怎樣才能檢測到這個變化並刪除當前的定時器或重置它。

如有任何內核線程檢測內核沒有這樣的機制在delay

回答

1

的變化對檢測變量的變化。相反,您應該在之前/之後執行相應的操作,您的代碼更改您的變量。

當您添加sysctl條目時,您還可以爲其設置處理程序(ctl_table->proc_handler)。這個處理器定義了一些動作,當調用入口的讀/寫方法時這些動作被執行。標準proc_do*函數只能設置/獲取變量的值,所以你應該定義你的處理程序。事情是這樣的:

int my_handler(struct ctl_table *table, int write, 
    void __user *buffer, size_t *lenp, loff_t *ppos) 
{ 
    // Call standard helper.. 
    int res = proc_dointvec(table, write, buffer, lenp, ppos); 
    if(write && !res) { 
     // Additional actions on successfull write. 
    } 
    return res; 
} 

的定時器超時的修改可以用mod_timer功能來執行。