From: "Jan Beulich" The PM timer code updates vxtime.last_tsc, but this update was done incorrectly in two ways: - offset_delay being in microseconds requires multiplying with cpu_mhz rather than cpu_khz - the multiplication of offset_delay and cpu_khz (both being 32-bit values) on most current CPUs would overflow (observed value of the delay was approximately 4000us, yielding an overflow for frequencies starting a little above 1GHz) Signed-off-by: Jan Beulich Signed-off-by: Andi Kleen Signed-off-by: Andrew Morton --- arch/x86_64/kernel/pmtimer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff -puN arch/x86_64/kernel/pmtimer.c~x86_64-fix-last_tsc-calculation-of-pm-timer arch/x86_64/kernel/pmtimer.c --- devel/arch/x86_64/kernel/pmtimer.c~x86_64-fix-last_tsc-calculation-of-pm-timer 2006-05-29 14:16:21.000000000 -0700 +++ devel-akpm/arch/x86_64/kernel/pmtimer.c 2006-05-29 14:16:21.000000000 -0700 @@ -68,7 +68,7 @@ int pmtimer_mark_offset(void) offset_delay = delta % (USEC_PER_SEC / HZ); rdtscll(tsc); - vxtime.last_tsc = tsc - offset_delay * cpu_khz; + vxtime.last_tsc = tsc - offset_delay * (u64)cpu_khz / 1000; /* don't calculate delay for first run, or if we've got less then a tick */ _