- 论坛徽章:
- 6
|
回复 10# amarant
一直的理解是,软件只能挽回一个丢失的时钟中断,如果丢了两个也会被认为期间只丢了一个。具体代码没去看过,我的理解对吗
不是的。内核会挽救所有丢失的中断。
tick_sched_timer---->tick_do_update_jiffies64(now)
这个函数根据两次更新jiffies的时间差,来判断中间丢失几次jiffies更新,从而挽救丢失的jiffies。- /*
- * Must be called with interrupts disabled !
- */
- static void tick_do_update_jiffies64(ktime_t now)
- {
- unsigned long ticks = 0;
- ktime_t delta;
- /*
- * Do a quick check without holding xtime_lock:
- */
- delta = ktime_sub(now, last_jiffies_update);
- if (delta.tv64 < tick_period.tv64)
- return;
- /* Reevalute with xtime_lock held */
- write_seqlock(&xtime_lock);
- delta = ktime_sub(now, last_jiffies_update);
- if (delta.tv64 >= tick_period.tv64) {
- delta = ktime_sub(delta, tick_period);
- last_jiffies_update = ktime_add(last_jiffies_update,
- tick_period);
- /* Slow path for long timeouts */
- if (unlikely(delta.tv64 >= tick_period.tv64)) {
- s64 incr = ktime_to_ns(tick_period);
- ticks = ktime_divns(delta, incr);
- last_jiffies_update = ktime_add_ns(last_jiffies_update,
- incr * ticks);
- }
- do_timer(++ticks);
- /* Keep the tick_next_period variable up to date */
- tick_next_period = ktime_add(last_jiffies_update, tick_period);
- }
- write_sequnlock(&xtime_lock);
- }
复制代码 |
|