# HG changeset patch # User yamahata@xxxxxxxxxxxxx # Date 1178077601 -32400 # Node ID 913ebb498872e522fcd78e5def7b6a3ee461e672 # Parent 9313d0ce09f85e0d883bc5378d1fc9ca7a55a932 add missing exclusion in time_resume() and steal time accounting reinitialization after resume. PATCHNAME: fix_time_resume Signed-off-by: Isaku Yamahata diff -r 9313d0ce09f8 -r 913ebb498872 linux-2.6-xen-sparse/arch/ia64/kernel/time.c --- a/linux-2.6-xen-sparse/arch/ia64/kernel/time.c Tue Apr 24 09:26:32 2007 -0600 +++ b/linux-2.6-xen-sparse/arch/ia64/kernel/time.c Wed May 02 12:46:41 2007 +0900 @@ -267,6 +267,60 @@ static void init_missing_ticks_accountin per_cpu(processed_stolen_time, cpu) = runstate->time[RUNSTATE_runnable] + runstate->time[RUNSTATE_offline]; } + +static int xen_ia64_settimefoday_after_resume = 0; +static int __init __xen_ia64_settimeofday_after_resume(char *str) +{ + xen_ia64_settimefoday_after_resume = 1; + return 1; +} +__setup("xen_ia64_settimefoday_after_resume", + __xen_ia64_settimeofday_after_resume); + +/* Called after suspend, to resume time. */ +void +time_resume(void) +{ + unsigned int cpu; + + /* Just trigger a tick. */ + ia64_cpu_local_tick(); + + if (xen_ia64_settimefoday_after_resume) { + /* do_settimeofday() resets timer interplator */ + struct timespec xen_time; + int ret; + efi_gettimeofday(&xen_time); + + ret = do_settimeofday(&xen_time); + WARN_ON(ret); + } else { +#if 0 + /* adjust EFI time */ + struct timespec my_time = CURRENT_TIME; + struct timespec xen_time; + static timespec diff; + struct xen_domctl domctl; + int ret; + + efi_gettimeofday(&xen_time); + diff = timespec_sub(&xen_time, &my_time); + domctl.cmd = XEN_DOMCTL_settimeoffset; + domctl.domain = DOMID_SELF; + domctl.u.settimeoffset.timeoffset_seconds = diff.tv_sec; + ret = HYPERVISOR_domctl_op(&domctl); + WARN_ON(ret); +#endif + /* Time interpolator remembers the last timer status. + Forget it */ + write_seqlock_irq(&xtime_lock); + time_interpolator_reset(); + write_sequnlock_irq(&xtime_lock); + } + + for_each_online_cpu(cpu) + init_missing_ticks_accounting(cpu); +} #else #define init_missing_ticks_accounting(cpu) do {} while (0) #endif diff -r 9313d0ce09f8 -r 913ebb498872 linux-2.6-xen-sparse/arch/ia64/xen/hypervisor.c --- a/linux-2.6-xen-sparse/arch/ia64/xen/hypervisor.c Tue Apr 24 09:26:32 2007 -0600 +++ b/linux-2.6-xen-sparse/arch/ia64/xen/hypervisor.c Wed May 02 12:46:41 2007 +0900 @@ -844,19 +844,6 @@ direct_remap_pfn_range(struct vm_area_st } -/* Called after suspend, to resume time. */ -void -time_resume(void) -{ - extern void ia64_cpu_local_tick(void); - - /* Just trigger a tick. */ - ia64_cpu_local_tick(); - - /* Time interpolator remembers the last timer status. Forget it */ - time_interpolator_reset(); -} - /////////////////////////////////////////////////////////////////////////// // expose p2m table #ifdef CONFIG_XEN_IA64_EXPOSE_P2M