From: BitKeeper B. <ri...@su...> - 2004-10-03 22:31:34
|
ChangeSet 1.1357, 2004/10/01 17:31:30+01:00, cl...@fr... Rearrange time init so that xtime and processed_system_time don't start out of sync. Update wall_to_monotonic when we update time from xen. time.c | 28 ++++++++++++++++++---------- 1 files changed, 18 insertions(+), 10 deletions(-) diff -Nru a/linux-2.6.8.1-xen-sparse/arch/xen/i386/kernel/time.c b/linux-2.6.8.1-xen-sparse/arch/xen/i386/kernel/time.c --- a/linux-2.6.8.1-xen-sparse/arch/xen/i386/kernel/time.c 2004-10-02 13:04:03 -04:00 +++ b/linux-2.6.8.1-xen-sparse/arch/xen/i386/kernel/time.c 2004-10-02 13:04:03 -04:00 @@ -363,8 +363,10 @@ static inline void do_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) { - s64 delta; - long sec_diff; + time_t wtm_sec, sec; + s64 delta. nsec; + long sec_diff, wtm_nsec; + long wtm_nsec; __get_time_values_from_xen(); @@ -412,10 +414,17 @@ } /* Update our unsynchronised xtime appropriately. */ - xtime.tv_sec = shadow_tv.tv_sec; - xtime.tv_nsec = shadow_tv.tv_usec * NSEC_PER_USEC; + sec = shadow_tv.tv_sec; + nsec = shadow_tv.tv_usec * NSEC_PER_USEC; - last_update_from_xen = xtime.tv_sec; + __normalize_time(&sec, &nsec); + wtm_sec = wall_to_monotonic.tv_sec + (xtime.tv_sec - sec); + wtm_nsec = wall_to_monotonic.tv_nsec + (xtime.tv_nsec - nsec); + + set_normalized_timespec(&xtime, sec, nsec); + set_normalized_timespec(&wall_to_monotonic, wtm_sec, wtm_nsec); + + last_update_from_xen = sec; } #ifdef CONFIG_XEN_PRIVILEGED_GUEST @@ -590,16 +599,15 @@ return; } #endif - xtime.tv_sec = HYPERVISOR_shared_info->wc_sec; + __get_time_values_from_xen(); + xtime.tv_sec = shadow_tv.tv_sec; wall_to_monotonic.tv_sec = -xtime.tv_sec; - xtime.tv_nsec = HYPERVISOR_shared_info->wc_usec * NSEC_PER_USEC; + xtime.tv_nsec = shadow_tv.tv_usec * NSEC_PER_USEC; wall_to_monotonic.tv_nsec = -xtime.tv_nsec; + processed_system_time = shadow_system_time; cur_timer = select_timer(); printk(KERN_INFO "Using %s for high-res timesource\n",cur_timer->name); - - __get_time_values_from_xen(); - processed_system_time = shadow_system_time; time_irq = bind_virq_to_irq(VIRQ_TIMER); |