Index: linux-2.6.7/include/linux/timex.h =================================================================== --- linux-2.6.7.orig/include/linux/timex.h +++ linux-2.6.7/include/linux/timex.h @@ -429,6 +429,8 @@ GET_TI_NSECS(time_interpolator_get_counter(),time_interpolator); } +extern unsigned int ti_debug; + static inline void time_interpolator_update(long delta_nsec) { unsigned long counter=time_interpolator_get_counter(); @@ -441,10 +443,16 @@ * interpolator clock is running slightly slower than the regular clock. */ - if (delta_nsec < 0 || (unsigned long) delta_nsec < offset) + if (delta_nsec < 0 || (unsigned long) delta_nsec < offset) { + if (ti_debug) + printk(KERN_INFO "continue O=%lu delta=%ld offset=%lu ti_offset=%lu set to %ld nanoseconds.\n",GET_TI_NSECS(counter,time_interpolator),delta_nsec,offset,time_interpolator->offset,offset - delta_nsec); time_interpolator->offset = offset - delta_nsec; - else + } else { + if (ti_debug) + printk(KERN_INFO "reset O=%lu delta=%ld offset=%lu ti_offset=%lu skipping %ld nanoseconds.\n",GET_TI_NSECS(counter,time_interpolator),delta_nsec,offset,time_interpolator->offset,delta_nsec-offset); + time_interpolator->offset = 0; /* Early tick. Resync */ + } time_interpolator->last_counter = counter; } Index: linux-2.6.7/kernel/timer.c =================================================================== --- linux-2.6.7.orig/kernel/timer.c +++ linux-2.6.7/kernel/timer.c @@ -1429,6 +1429,7 @@ struct time_interpolator *time_interpolator; static struct time_interpolator *time_interpolator_list; static spinlock_t time_interpolator_lock = SPIN_LOCK_UNLOCKED; +unsigned int ti_debug; static inline int is_better_time_interpolator(struct time_interpolator *new) @@ -1443,6 +1444,7 @@ register_time_interpolator(struct time_interpolator *ti) { ti->nsec_per_cyc = (NSEC_PER_SEC << ti->shift) / ti->frequency; + printk(KERN_INFO "new time_interpolator: freq=%ld cyc=%d ns short by=%d ns.\n",ti->frequency,ti->nsec_per_cyc, (NSEC_PER_SEC << ti->shift) % ti->frequency); spin_lock(&time_interpolator_lock); write_seqlock_irq(&xtime_lock); if (is_better_time_interpolator(ti))