From: Albert Cahalan <albert@users.sourceforge.net>

This should improve timekeeping a bit @ 1000 HZ.



 kernel/timer.c |    9 +++++++++
 1 files changed, 9 insertions(+)

diff -puN kernel/timer.c~1000HZ-time-accuracy-fix kernel/timer.c
--- 25/kernel/timer.c~1000HZ-time-accuracy-fix	2003-07-26 00:49:01.000000000 -0700
+++ 25-akpm/kernel/timer.c	2003-07-26 00:49:01.000000000 -0700
@@ -606,6 +606,15 @@ static void second_overflow(void)
     else
 	time_adj += (time_adj >> 2) + (time_adj >> 5);
 #endif
+#if HZ == 1000
+    /* Compensate for (HZ==1000) != (1 << SHIFT_HZ).
+     * Add 1.5625% and 0.78125% to get 1023.4375; => only 0.05% error (p. 14)
+     */
+    if (time_adj < 0)
+	time_adj -= (-time_adj >> 6) + (-time_adj >> 7);
+    else
+	time_adj += (time_adj >> 6) + (time_adj >> 7);
+#endif
 }
 
 /* in the NTP reference this is called "hardclock()" */

_