Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
Please login to access the resource
SUSE:SLE-12-SP1:GA
xen.4507
576001df-x86-time-use-local-stamp-in-TSC-calibr...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 576001df-x86-time-use-local-stamp-in-TSC-calibration-fast-path.patch of Package xen.4507
References: bsc#970135 # Commit b64438c7c1495a7580d1bb9d8ba644f3705e1ffb # Date 2016-06-14 15:08:47 +0200 # Author Jan Beulich <jbeulich@suse.com> # Committer Jan Beulich <jbeulich@suse.com> x86/time: use correct (local) time stamp in constant-TSC calibration fast path This looks like a copy and paste mistake in commit 1b6a99892d ("x86: Simpler time handling when TSC is constant across all power saving states"), responsible for occasional many-microsecond cross-CPU skew of what NOW() returns. Also improve the correlation between local TSC and stime stamps obtained at the end of the two calibration handlers: Compute the stime one from the TSC one, instead of doing another rdtsc() for that compuation. Signed-off-by: Jan Beulich <jbeulich@suse.com> Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com> --- a/xen/arch/x86/time.c +++ b/xen/arch/x86/time.c @@ -751,19 +751,25 @@ static unsigned long get_cmos_time(void) * System Time ***************************************************************************/ -s_time_t get_s_time(void) +static s_time_t get_s_time_fixed(u64 tsc) { struct cpu_time *t = &this_cpu(cpu_time); - u64 tsc, delta; + u64 delta; s_time_t now; - rdtscll(tsc); + if ( !tsc ) + rdtscll(tsc); delta = tsc - t->local_tsc_stamp; now = t->stime_local_stamp + scale_delta(delta, &t->tsc_scale); return now; } +s_time_t get_s_time(void) +{ + return get_s_time_fixed(0); +} + uint64_t tsc_ticks2ns(uint64_t ticks) { struct cpu_time *t = &this_cpu(cpu_time); @@ -1025,7 +1031,7 @@ static void local_time_calibration(void) /* Atomically read cpu_calibration struct and write cpu_time struct. */ local_irq_disable(); t->local_tsc_stamp = c->local_tsc_stamp; - t->stime_local_stamp = c->stime_master_stamp; + t->stime_local_stamp = c->stime_local_stamp; t->stime_master_stamp = c->stime_master_stamp; local_irq_enable(); update_vcpu_system_time(current); @@ -1302,7 +1308,7 @@ static void time_calibration_tsc_rendezv } rdtscll(c->local_tsc_stamp); - c->stime_local_stamp = get_s_time(); + c->stime_local_stamp = get_s_time_fixed(c->local_tsc_stamp); c->stime_master_stamp = r->master_stime; raise_softirq(TIME_CALIBRATE_SOFTIRQ); @@ -1332,7 +1338,7 @@ static void time_calibration_std_rendezv } rdtscll(c->local_tsc_stamp); - c->stime_local_stamp = get_s_time(); + c->stime_local_stamp = get_s_time_fixed(c->local_tsc_stamp); c->stime_master_stamp = r->master_stime; raise_softirq(TIME_CALIBRATE_SOFTIRQ);
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor