Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:bmwiedemann:reproducible:distribution:ring1
xen
xen.bug1026236.suse_vtsc_tolerance.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File xen.bug1026236.suse_vtsc_tolerance.patch of Package xen
suse_vtsc_tolerance=<val> Reference: bsc#1026236 To avoid emulation of vTSC after live migration or save/restore allow different clock frequency up to the specified value. If the frequency is within the allowed range TSC access by the domU will be performed at native speed. Otherwise TSC access will be emulated. It is up to the hostadmin to decide how much tolerance all running domUs can actually handle. The default is zero tolerance. --- a/xen/arch/x86/time.c +++ b/xen/arch/x86/time.c @@ -47,6 +47,9 @@ static char __initdata opt_clocksource[10]; string_param("clocksource", opt_clocksource); +static unsigned int __ro_after_init opt_suse_vtsc_tolerance; +integer_param("suse_vtsc_tolerance", opt_suse_vtsc_tolerance); + unsigned long __read_mostly cpu_khz; /* CPU clock frequency in kHz. */ DEFINE_SPINLOCK(rtc_lock); unsigned long pit0_ticks; @@ -2720,6 +2723,8 @@ int tsc_set_info(struct domain *d, switch ( tsc_mode ) { + bool disable_vtsc; + case XEN_CPUID_TSC_MODE_DEFAULT: case XEN_CPUID_TSC_MODE_ALWAYS_EMULATE: d->arch.vtsc_offset = get_s_time() - elapsed_nsec; @@ -2733,8 +2738,25 @@ int tsc_set_info(struct domain *d, * When a guest is created, gtsc_khz is passed in as zero, making * d->arch.tsc_khz == cpu_khz. Thus no need to check incarnation. */ + disable_vtsc = d->arch.tsc_khz == cpu_khz; + + if ( tsc_mode == XEN_CPUID_TSC_MODE_DEFAULT && !disable_vtsc && + opt_suse_vtsc_tolerance && is_hvm_domain(d) ) + { + long khz_diff = ABS((long)cpu_khz - gtsc_khz); + + disable_vtsc = khz_diff <= opt_suse_vtsc_tolerance; + + printk(XENLOG_G_INFO "%pd: host has %lu kHz," + " domU expects %u kHz," + " difference of %ld is %s tolerance of %u\n", + d, cpu_khz, gtsc_khz, khz_diff, + disable_vtsc ? "within" : "outside", + opt_suse_vtsc_tolerance); + } + if ( tsc_mode == XEN_CPUID_TSC_MODE_DEFAULT && host_tsc_is_safe() && - (d->arch.tsc_khz == cpu_khz || + (disable_vtsc || (is_hvm_domain(d) && hvm_get_tsc_scaling_ratio(d->arch.tsc_khz))) ) {
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor