内核定时器函数内的add_timer不需要调度吗?

时间:2016-05-24 16:47:53

标签: linux-kernel linux-device-driver interrupt interrupt-handling

当我们使用内核定时器时,内核定时器在软件中断中运行,因此内核定时器功能在定时器中断上下文中运行。

void timer_func(unsigned long arg)
{
    my_timer.expires = jiffies + HZ;
    add_timer(&my_timer);
}

那么内核定时器函数内的add_timer()不需要调度吗? 因为在中断上下文调度被禁用。

2 个答案:

答案 0 :(得分:1)

是的,Route::get ('password/email', 'Auth\PasswordController@getEmail'); Route::post('password/email', 'Auth\PasswordController@postEmail'); // Password reset routes... Route::get('password/reset/{token}', 'Auth\PasswordController@getReset'); Route::post('password/reset', 'Auth\PasswordController'); 函数可用于中断上下文。在计时器回调函数中调用它是重复执行某些操作的标准方法。

答案 1 :(得分:0)

我认为OP意味着“它如何在中断ctx中运行?”。 因此,add_timer()本身不会直接调用schedule();它调用mod_timer():

void add_timer(struct timer_list *timer)
{
    BUG_ON(timer_pending(timer));
    mod_timer(timer, timer->expires);
}
EXPORT_SYMBOL(add_timer);

并且正如上面的代码注释所显示的那样:

"...
 * The kernel will do a ->function(->data) callback from the
 * timer interrupt at the ->expires point in the future. The
 * current time is 'jiffies'.
..."

所以它不直接调用schedule();它将在到期时调用您的计时器功能。请注意,计时器功能在(软)中断上下文中运行,因此不要做任何直接或间接调用schedule()的事情。