【问题标题】:Calling mod_timer from inside timer callback function从定时器回调函数内部调用 mod_timer
【发布时间】:2014-06-30 11:56:33
【问题描述】:

我正在为 linux 编写一个内核模块,我希望我的计时器能够自行重新设置。为此,我想从定时器的回调函数内部调用mod_timer,如图:

static void sched_send(unsigned long data)
{
    send_now();
    mod_timer(&test_timer, jiffies+(get_interval()*HZ));
}

static void timer_start(void)
{
    set_log_msg("Meep meep!");

    test_timer.function = sched_send;
    test_timer.expires = jiffies + HZ*get_interval();
}

但是,我读过mod_timer 删除了计时器并重新添加了它。会不会造成问题?如果是这样,是否有更好的方法为内核模块创建重复计时器?

【问题讨论】:

    标签: c linux linux-kernel


    【解决方案1】:

    从定时器回调中执行mod_timer 是安全的。

    来自内核源代码(kernel/timer.c):

    /* mod_timer(timer, expires) is equivalent to:
    *
    *     del_timer(timer); timer->expires = expires; add_timer(timer);
    *     ...
    */
    

    至于del_timer

    /*
    * del_timer - deactive a timer.
    * @timer: the timer to be deactivated
    *
    * del_timer() deactivates a timer - this works on both active and inactive
    * timers. 
    * ...
    */
    

    正如 Peter 所说,您需要在想要启动/重新启动计时器的任何时候调用 add_timer

    【讨论】:

      【解决方案2】:

      您的函数timer_start() 在设置函数和到期时间后必须调用add_timer()。一旦计时器功能触发,您的计时器将不再处于活动状态,因此您只需将.expires 字段重置为新值并再次调用add_timer()。确保提供一种干净的方式来停止重新安排计时器,例如在模块卸载时。

      send_now();
      if(!terminate_timer) {
          test_timer.expires = jiffies + HZ*get_interval();
          add_timer(&test_timer);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-05
        • 1970-01-01
        • 1970-01-01
        • 2021-10-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多