]> git.hungrycats.org Git - linux/commitdiff
[PATCH] M68k time update
authorGeert Uytterhoeven <geert@linux-m68k.org>
Tue, 13 Apr 2004 00:32:12 +0000 (17:32 -0700)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Tue, 13 Apr 2004 00:32:12 +0000 (17:32 -0700)
M68k: Update time adjustment code cfr. other architectures.
(perhaps do_gettimeofday() is a good candidate for consolidation across archs?)

arch/m68k/kernel/time.c

index d81e7031ffd0778c196be3897654e35f0038f431..d85616f14e9dd60a570d994e8c884620b3be6d42 100644 (file)
@@ -120,14 +120,28 @@ void do_gettimeofday(struct timeval *tv)
        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));