如何修改内核timer_list超时

How to modify kernel timer_list timeout

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

所以我正在使用 struct timer_list 和关联的 API 来实现 12 秒计时器。

正如我在 IBM developer Works 内核定时器指南中提到的那样:

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

中的变化

内核没有检测变量变化的机制。相反,您应该执行相应的操作 before/after 您的 代码更改 您的 变量。

添加 sysctl 条目时,您还为其设置了处理程序(ctl_table->proc_handler)。此处理程序定义了在调用 read/write 入口方法时执行的操作。标准 proc_do* 仅函数 set/get 变量值,因此您应该定义您的处理程序。像这样:

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函数修改定时器的超时时间。