【问题标题】:Do you need to call init_timer() again after a del_timer()在 del_timer() 之后是否需要再次调用 init_timer()
【发布时间】:2013-11-27 13:25:15
【问题描述】:

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

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

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

【问题讨论】:

    标签: linux timer module kernel


    【解决方案1】:

    要回答我自己的问题,如果我打算再次访问该结构,我相信我确实需要在任何 del_timer() 或 del_timer_sync() 之后初始化我的结构 - 例如,在执行 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();
      ...
    }
    

    希望以后能对其他人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-11
      • 1970-01-01
      • 1970-01-01
      • 2019-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-12
      相关资源
      最近更新 更多