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功能来执行。