[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH RFC] handle tsc_tolerance during migration between identical hosts



On 11/04/17 11:39, Olaf Hering wrote:
> Testing has shown that domUs with 'tsc_mode=default' can be migrated
> safely between identical hardware, even if the measured clock frequency
> differs by a few kHz. A change like shown below would allow to migrate
> between "2.nnGHz" hosts without enforcing emulation. If the domU is
> migrated to a host with "2.mmGHz" the frequency jump might have bad
> effects, and tsc emulation might be good even if it comes with a
> perfromance penalty.
> 
> The change below adds a new boot option to set a tolerance value.
> I think its up to the host admin to decide, therefore a global option
> should be enough.
> 
> Any opinions, also on the name of the cmdline option?
> 
> 
> Olaf
> 
> 
> --- a/xen/arch/x86/time.c
> +++ b/xen/arch/x86/time.c
> @@ -43,6 +43,9 @@
>  static char __initdata opt_clocksource[10];
>  string_param("clocksource", opt_clocksource);
>  
> +static unsigned int __read_mostly opt_tsc_tolerance;
> +integer_param("tsc_tolerance", opt_tsc_tolerance);
> +
>  unsigned long __read_mostly cpu_khz;  /* CPU clock frequency in kHz. */
>  DEFINE_SPINLOCK(rtc_lock);
>  unsigned long pit0_ticks;
> @@ -1882,6 +1885,8 @@ void tsc_set_info(struct domain *d,
>                    uint32_t tsc_mode, uint64_t elapsed_nsec,
>                    uint32_t gtsc_khz, uint32_t incarnation)
>  {
> +    uint32_t khz_diff, tolerated;

Newline missing.

> +    printk(XENLOG_WARNING "%s: %u %x %lx %x %x\n", __func__, d->domain_id, 
> tsc_mode, (unsigned long)elapsed_nsec, gtsc_khz, incarnation);
>      if ( is_idle_domain(d) || is_hardware_domain(d) )
>      {
>          d->arch.vtsc = 0;
> @@ -1924,6 +1929,15 @@ void tsc_set_info(struct domain *d,
>          d->arch.vtsc_offset = get_s_time() - elapsed_nsec;
>          d->arch.tsc_khz = gtsc_khz ?: cpu_khz;
>          set_time_scale(&d->arch.vtsc_to_ns, d->arch.tsc_khz * 1000);
> +        khz_diff = 0;
> +        if (gtsc_khz)
> +            khz_diff = cpu_khz > gtsc_khz ? cpu_khz - gtsc_khz : gtsc_khz - 
> cpu_khz;
> +        if (opt_tsc_tolerance) {
> +            tolerated = khz_diff <= opt_tsc_tolerance;
> +        } else {
> +            tolerated = d->arch.tsc_khz == cpu_khz;
> +        }

Why so complicated?

khz_diff = cpu_khz > d->arch.tsc_khz ? cpu_khz - d->arch.tsc_khz
                                     : d->arch.tsc_khz - cpu_khz;
tolerated = khz_diff <= opt_tsc_tolerance;

should work as well.


Juergen

_______________________________________________
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®.