[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH RFC 4/6] x86/time: refactor read_platform_stime()
To fetch the last read from the clocksource which was used to calculate system_time. In the case of clocksource=tsc we will use it to set tsc_timestamp. Signed-off-by: Joao Martins <joao.m.martins@xxxxxxxxxx> --- xen/arch/x86/time.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/xen/arch/x86/time.c b/xen/arch/x86/time.c index df42d31..3f96ce6 100644 --- a/xen/arch/x86/time.c +++ b/xen/arch/x86/time.c @@ -509,6 +509,7 @@ static s_time_t stime_platform_stamp; /* System time at below platform time */ static u64 platform_timer_stamp; /* Platform time at above system time */ static u64 plt_stamp64; /* 64-bit platform counter stamp */ static u64 plt_stamp; /* hardware-width platform counter stamp */ +static u64 plt_stamp_counter; /* last read since read_counter */ static struct timer plt_overflow_timer; static s_time_t __read_platform_stime(u64 platform_time) @@ -567,7 +568,7 @@ static void plt_overflow(void *unused) set_timer(&plt_overflow_timer, NOW() + plt_overflow_period); } -static s_time_t read_platform_stime(void) +static s_time_t read_platform_stime(u64 *stamp) { u64 count; s_time_t stime; @@ -575,8 +576,11 @@ static s_time_t read_platform_stime(void) ASSERT(!local_irq_is_enabled()); spin_lock(&platform_timer_lock); - count = plt_stamp64 + ((plt_src.read_counter() - plt_stamp) & plt_mask); + plt_stamp_counter = plt_src.read_counter(); + count = plt_stamp64 + ((plt_stamp_counter - plt_stamp) & plt_mask); stime = __read_platform_stime(count); + if (stamp) + *stamp = plt_stamp_counter; spin_unlock(&platform_timer_lock); return stime; @@ -694,7 +698,7 @@ void cstate_restore_tsc(void) if ( boot_cpu_has(X86_FEATURE_NONSTOP_TSC) ) return; - write_tsc(stime2tsc(read_platform_stime())); + write_tsc(stime2tsc(read_platform_stime(NULL))); } /*************************************************************************** @@ -1005,7 +1009,7 @@ int cpu_frequency_change(u64 freq) local_irq_disable(); /* Platform time /first/, as we may be delayed by platform_timer_lock. */ - t->stime_master_stamp = read_platform_stime(); + t->stime_master_stamp = read_platform_stime(NULL); /* TSC-extrapolated time may be bogus after frequency change. */ /*t->stime_local_stamp = get_s_time();*/ t->stime_local_stamp = t->stime_master_stamp; @@ -1323,7 +1327,7 @@ static void time_calibration_tsc_rendezvous(void *_r) if ( r->master_stime == 0 ) { - r->master_stime = read_platform_stime(); + r->master_stime = read_platform_stime(NULL); r->master_tsc_stamp = rdtsc(); } atomic_inc(&r->semaphore); @@ -1415,7 +1419,7 @@ void init_percpu_time(void) local_irq_save(flags); t->local_tsc_stamp = rdtsc(); - now = read_platform_stime(); + now = read_platform_stime(NULL); local_irq_restore(flags); t->stime_master_stamp = now; -- 2.1.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |