[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH RFC] handle tsc_tolerance during migration between identical hosts
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; + 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; + } + printk("%s: d%u: dom0 has %lu kHz, domU expects %u kHz, difference of %u is %s tolerance of %u. (HVM scaling ratio: %llu)\n", __func__, d->domain_id, cpu_khz, gtsc_khz, khz_diff, tolerated ? "within" : "outside", opt_tsc_tolerance, has_hvm_container_domain(d) ? hvm_get_tsc_scaling_ratio(d->arch.tsc_khz) : 0 ); /* * In default mode use native TSC if the host has safe TSC and: * HVM/PVH: host and guest frequencies are the same (either @@ -1931,10 +1945,8 @@ void tsc_set_info(struct domain *d, * PV: guest has not migrated yet (and thus arch.tsc_khz == cpu_khz) */ if ( tsc_mode == TSC_MODE_DEFAULT && host_tsc_is_safe() && - (has_hvm_container_domain(d) ? - (d->arch.tsc_khz == cpu_khz || - hvm_get_tsc_scaling_ratio(d->arch.tsc_khz)) : - incarnation == 0) ) + (tolerated || + (has_hvm_container_domain(d) && hvm_get_tsc_scaling_ratio(d->arch.tsc_khz))) ) { case TSC_MODE_NEVER_EMULATE: d->arch.vtsc = 0; Attachment:
signature.asc _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |