如何修改内核timer_list超时

时间:2015-07-13 10:22:43

标签: timer linux-kernel timeout linux-device-driver kernel-module

我正在为我的内核模块中的某些参数实现超时。

所以我使用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 个答案:

答案 0 :(得分: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功能修改计时器的超时。