我有一个创建计时器的Linux
模块,其中一些可能会在处理函数期间再次添加自己。
在其他一些情况下,使用del_timer_sync()
删除计时器(可能在它关闭之前)。
在这种情况下,我是否需要在下一个init_timer()
之前再次对结构进行add_timer(
调用,或者这只是浪费(宝贵的)中断延迟?
答案 0 :(得分:2)
要回答我自己的问题,我相信我需要在任何del_timer()或del_timer_sync()后面的init_timer()我的结构,如果我打算再次访问结构 - 例如,当做一个timer_pending()或者什么的时候在模块清理期间。
我认为在编写可能重用计时器的内核模块的情况下,最好的办法是:
static struct timer_list my_timer;
...
static void remove_my_timer(void)
{
if (timer_pending(&my_timer))
{
del_timer_sync(&my_timer);
init_timer(&my_timer);
}
}
static void arm_my_timer(...)
{
remove_my_timer();
my_timer.expires = ...;
my_timer.data = ...;
my_timer.function = ...;
add_timer(&my_timer);
}
...
int __init init_my_device(void)
{
...
init_timer(&my_timer);
...
}
void __exit cleanup_my_device(void)
{
...
remove_my_timer();
...
}
希望将来帮助别人。