From fff03db7d506d63e9a37bcfd1cf4e106179ac237 Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Thu, 1 May 2008 09:45:44 +0100 Subject: [PATCH] x86 time: Read platform time before locally-extrapolated time during calibration and frequency changes. This places the variable delay (acquiring the platform_timer_lock) safely as the very first thing we do, avoiding a variable delay /between/ computing the two timestamps. Problem diagnosed by Dave Winchell Signed-off-by: Keir Fraser --- xen/arch/x86/time.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/xen/arch/x86/time.c b/xen/arch/x86/time.c index ccefc50cf2..6bec5cb1c6 100644 --- a/xen/arch/x86/time.c +++ b/xen/arch/x86/time.c @@ -759,12 +759,13 @@ int cpu_frequency_change(u64 freq) } local_irq_disable(); - rdtscll(curr_tsc); - t->local_tsc_stamp = curr_tsc; + /* Platform time /first/, as we may be delayed by platform_timer_lock. */ t->stime_master_stamp = read_platform_stime(); /* TSC-extrapolated time may be bogus after frequency change. */ /*t->stime_local_stamp = get_s_time();*/ t->stime_local_stamp = t->stime_master_stamp; + rdtscll(curr_tsc); + t->local_tsc_stamp = curr_tsc; set_time_scale(&t->tsc_scale, freq); local_irq_enable(); @@ -834,11 +835,14 @@ static void local_time_calibration(void *unused) prev_local_stime = t->stime_local_stamp; prev_master_stime = t->stime_master_stamp; - /* Disable IRQs to get 'instantaneous' current timestamps. */ + /* + * Disable IRQs to get 'instantaneous' current timestamps. We read platform + * time first, as we may be delayed when acquiring platform_timer_lock. + */ local_irq_disable(); - rdtscll(curr_tsc); - curr_local_stime = get_s_time(); curr_master_stime = read_platform_stime(); + curr_local_stime = get_s_time(); + rdtscll(curr_tsc); local_irq_enable(); #if 0 -- 2.39.5