如何修改内核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
函数修改定时器的超时时间。
我正在为我的内核模块中的一些参数实现超时。
所以我正在使用 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
函数修改定时器的超时时间。