- 论坛徽章:
- 46
|
假如当前我的时钟配置成NOHZ_MODE_LOWRES ,低分辨率下的动态时钟,我看代码有可能造成定时器超期之后还没有执行的问题,待后续有tick到来的时候会一齐补上,例如我想延迟2ms,但实际上有可能延迟了10ms才执行
我的问题是,是否有我上述说的问题?
static inline void __run_timers(struct tvec_base *base)
{
struct timer_list *timer;
spin_lock_irq(&base->lock);
while (time_after_eq(jiffies, base->timer_jiffies)) {/*这里是一个while循环,说明有可能是经过多个tick*/
struct list_head work_list;
struct list_head *head = &work_list;
int index = base->timer_jiffies & TVR_MASK;
/*
* Cascade timers:
*/
if (!index &&
(!cascade(base, &base->tv2, INDEX(0))) &&
(!cascade(base, &base->tv3, INDEX(1))) &&
!cascade(base, &base->tv4, INDEX(2)))
cascade(base, &base->tv5, INDEX(3));
++base->timer_jiffies;/*每次加一个tick*/ list_replace_init(base->tv1.vec + index, &work_list);
while (!list_empty(head)) {/*执行定时器的函数*/
void (*fn)(unsigned long);
unsigned long data;
timer = list_first_entry(head, struct timer_list,entry);
fn = timer->function;
data = timer->data;
timer_stats_account_timer(timer);
base->running_timer = timer;
detach_timer(timer, 1);
spin_unlock_irq(&base->lock);
call_timer_fn(timer, fn, data);
spin_lock_irq(&base->lock);
}
}
base->running_timer = NULL;
spin_unlock_irq(&base->lock);
} |
|