你需要在del_timer()后再次调用init_timer()

时间:2013-11-14 13:43:52

标签: linux timer module kernel

我有一个创建计时器的Linux模块,其中一些可能会在处理函数期间再次添加自己。

在其他一些情况下,使用del_timer_sync()删除计时器(可能在它关闭之前)。

在这种情况下,我是否需要在下一个init_timer()之前再次对结构进行add_timer(调用,或者这只是浪费(宝贵的)中断延迟?

1 个答案:

答案 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();
  ...
}

希望将来帮助别人。