|
[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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |