[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

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.