Timer 如何修改内核计时器\u列表超时

Timer 如何修改内核计时器\u列表超时,timer,linux-kernel,timeout,linux-device-driver,kernel-module,Timer,Linux Kernel,Timeout,Linux Device Driver,Kernel Module,我正在为内核模块中的一些参数实现超时 因此,我使用struct timer\u 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 globa

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

因此,我使用
struct timer\u 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\u func
中执行工作,并再次调用
tick_timer
重置计时器

接下来,我想将
delay
实现为一个sysctl条目。 但更改应立即调用
勾选计时器
功能,并使用新的
延迟
重置计时器。那么,我如何才能检测到这种变化,并删除任何当前计时器或重置它


如果存在任何内核线程来检测
延迟的变化

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

添加sysctl条目时,还需要为其设置处理程序(
ctl\u table->proc\u handler
)。此处理程序定义了在调用entry的读/写方法时执行的操作。标准的
proc\u 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
功能修改计时器的超时时间