[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] x86 time: Read platform time before locally-extrapolated time during
# HG changeset patch # User Keir Fraser <keir.fraser@xxxxxxxxxx> # Date 1209631544 -3600 # Node ID 013a47065e8c4e815e3b1aba0883341c19238e82 # Parent 483d006cc60765357dcdb66ab0fc43c955ecd8fe 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 <dwinchell@xxxxxxxxxxxxxxx> Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx> --- xen/arch/x86/time.c | 14 +++++++++----- 1 files changed, 9 insertions(+), 5 deletions(-) diff -r 483d006cc607 -r 013a47065e8c xen/arch/x86/time.c --- a/xen/arch/x86/time.c Fri Apr 25 13:46:27 2008 +0100 +++ b/xen/arch/x86/time.c Thu May 01 09:45:44 2008 +0100 @@ -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 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(); + curr_master_stime = read_platform_stime(); + curr_local_stime = get_s_time(); rdtscll(curr_tsc); - curr_local_stime = get_s_time(); - curr_master_stime = read_platform_stime(); local_irq_enable(); #if 0 _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |