To: akpm, linus Cc: lkml Subject: [PATCH] M68k time update M68k: Update time adjustment code cfr. other architectures. (perhaps do_gettimeofday() is a good candidate for consolidation across archs?) --- time.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) --- linux-2.6.5/arch/m68k/kernel/time.c 2004-02-29 09:30:37.000000000 +0100 +++ linux-m68k-2.6.5/arch/m68k/kernel/time.c 2004-04-08 10:38:42.000000000 +0200 @@ -120,14 +120,28 @@ extern unsigned long wall_jiffies; unsigned long seq; unsigned long usec, sec, lost; + unsigned long max_ntp_tick = tick_usec - tickadj; do { seq = read_seqbegin_irqsave(&xtime_lock, flags); usec = mach_gettimeoffset(); lost = jiffies - wall_jiffies; - if (lost) - usec += lost * (1000000/HZ); + + /* + * If time_adjust is negative then NTP is slowing the clock + * so make sure not to go into next possible interval. + * Better to lose some accuracy than have time go backwards.. + */ + if (unlikely(time_adjust < 0)) { + usec = min(usec, max_ntp_tick); + + if (lost) + usec += lost * max_ntp_tick; + } + else if (unlikely(lost)) + usec += lost * tick_usec; + sec = xtime.tv_sec; usec += xtime.tv_nsec/1000; } while (read_seqretry_irqrestore(&xtime_lock, seq, flags));