[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] Ping: [PATCH v2 2/6] x86/time: correctly honor late clearing of TSC related feature flags
Ping? >>> On 03.08.16 at 15:00, <JBeulich@xxxxxxxx> wrote: > As such clearing of flags may have an impact on the selected rendezvous > function, handle such in a central place. > > But don't allow such feature flags to be cleared during CPU hotplug: > Platform and local system times may have diverged significantly by > then, potentially causing noticably (even if only temporary) strange > behavior. As we're anyway expecting only sufficiently similar CPUs to > appear during hotplug, this shouldn't be introducing new limitations. > > Reported-by: Joao Martins <joao.m.martins@xxxxxxxxxx> > Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> > Tested-by: Dario Faggioli <dario.faggioli@xxxxxxxxxx> > Tested-by: Joao Martins <joao.m.martins@xxxxxxxxxx> > > --- a/xen/arch/x86/cpu/mwait-idle.c > +++ b/xen/arch/x86/cpu/mwait-idle.c > @@ -1162,8 +1162,8 @@ static int mwait_idle_cpu_init(struct no > } > > if (state > 2 && !boot_cpu_has(X86_FEATURE_NONSTOP_TSC) && > - !pm_idle_save) > - setup_clear_cpu_cap(X86_FEATURE_TSC_RELIABLE); > + !pm_idle_save && system_state < SYS_STATE_active) > + clear_tsc_cap(X86_FEATURE_TSC_RELIABLE); > > cx = dev->states + dev->count; > cx->type = state; > --- a/xen/arch/x86/time.c > +++ b/xen/arch/x86/time.c > @@ -1353,6 +1353,24 @@ static void time_calibration(void *unuse > &r, 1); > } > > +void __init clear_tsc_cap(unsigned int feature) > +{ > + void (*rendezvous_fn)(void *) = time_calibration_std_rendezvous; > + > + if ( feature ) > + setup_clear_cpu_cap(feature); > + > + /* If we have constant-rate TSCs then scale factor can be shared. */ > + if ( boot_cpu_has(X86_FEATURE_CONSTANT_TSC) ) > + { > + /* If TSCs are not marked as 'reliable', re-sync during rendezvous. > */ > + if ( !boot_cpu_has(X86_FEATURE_TSC_RELIABLE) ) > + rendezvous_fn = time_calibration_tsc_rendezvous; > + } > + > + time_calibration_rendezvous_fn = rendezvous_fn; > +} > + > static struct { > s_time_t local_stime, master_stime; > } ap_bringup_ref; > @@ -1478,7 +1496,7 @@ static int __init verify_tsc_reliability > { > printk("%s: TSC warp detected, disabling TSC_RELIABLE\n", > __func__); > - setup_clear_cpu_cap(X86_FEATURE_TSC_RELIABLE); > + clear_tsc_cap(X86_FEATURE_TSC_RELIABLE); > } > } > > @@ -1491,13 +1509,7 @@ int __init init_xen_time(void) > { > tsc_check_writability(); > > - /* If we have constant-rate TSCs then scale factor can be shared. */ > - if ( boot_cpu_has(X86_FEATURE_CONSTANT_TSC) ) > - { > - /* If TSCs are not marked as 'reliable', re-sync during rendezvous. > */ > - if ( !boot_cpu_has(X86_FEATURE_TSC_RELIABLE) ) > - time_calibration_rendezvous_fn = > time_calibration_tsc_rendezvous; > - } > + clear_tsc_cap(0); > > open_softirq(TIME_CALIBRATE_SOFTIRQ, local_time_calibration); > > --- a/xen/include/asm-x86/time.h > +++ b/xen/include/asm-x86/time.h > @@ -70,6 +70,7 @@ void tsc_get_info(struct domain *d, uint > void force_update_vcpu_system_time(struct vcpu *v); > > int host_tsc_is_safe(void); > +void clear_tsc_cap(unsigned int feature); > void cpuid_time_leaf(uint32_t sub_idx, uint32_t *eax, uint32_t *ebx, > uint32_t *ecx, uint32_t *edx); > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |