Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Leap:15.6:Update
libvirt.22291
d8e5b456-qemu-no-not-require-tsc-freq-match-hos...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File d8e5b456-qemu-no-not-require-tsc-freq-match-host.patch of Package libvirt.22291
commit d8e5b4560006590668d4669f54a46b08ec14c1a2 Author: Jiri Denemark <jdenemar@redhat.com> Date: Mon May 25 11:35:12 2020 +0200 qemu: Do not require TSC frequency to strictly match host Some CPUs provide a way to read exact TSC frequency, while measuring it is required on other CPUs. However, measuring is never exact and the result may slightly differ across reboots. For this reason both Linux kernel and QEMU recently started allowing for guests TSC frequency to fall into +/- 250 ppm tolerance interval around the host TSC frequency. Let's do the same to avoid unnecessary failures (esp. during migration) in case the host frequency does not exactly match the frequency configured in a domain XML. https://bugzilla.redhat.com/show_bug.cgi?id=1839095 Signed-off-by: Jiri Denemark <jdenemar@redhat.com> Reviewed-by: Daniel Henrique Barboza <danielhb413@gmail.com> Index: libvirt-6.0.0/src/qemu/qemu_process.c =================================================================== --- libvirt-6.0.0.orig/src/qemu/qemu_process.c +++ libvirt-6.0.0/src/qemu/qemu_process.c @@ -5250,12 +5250,18 @@ qemuProcessStartValidateDisks(virDomainO } +/* 250 parts per million (ppm) is a half of NTP threshold */ +#define TSC_TOLERANCE 250 + static int qemuProcessStartValidateTSC(virQEMUDriverPtr driver, virDomainObjPtr vm) { size_t i; unsigned long long freq = 0; + unsigned long long tolerance; + unsigned long long minFreq; + unsigned long long maxFreq; virHostCPUTscInfoPtr tsc; g_autoptr(virCPUDef) cpu = NULL; @@ -5281,23 +5287,34 @@ qemuProcessStartValidateTSC(virQEMUDrive } tsc = cpu->tsc; - VIR_DEBUG("Host TSC frequency %llu Hz, scaling %s", - tsc->frequency, virTristateBoolTypeToString(tsc->scaling)); + tolerance = tsc->frequency * TSC_TOLERANCE / 1000000; + minFreq = tsc->frequency - tolerance; + maxFreq = tsc->frequency + tolerance; + + VIR_DEBUG("Host TSC frequency %llu Hz, scaling %s, tolerance +/- %llu Hz", + tsc->frequency, virTristateBoolTypeToString(tsc->scaling), + tolerance); + + if (freq > minFreq && freq < maxFreq) { + VIR_DEBUG("Requested TSC frequency is within tolerance interval"); + return 0; + } - if (freq == tsc->frequency || tsc->scaling == VIR_TRISTATE_BOOL_YES) + if (tsc->scaling == VIR_TRISTATE_BOOL_YES) return 0; if (tsc->scaling == VIR_TRISTATE_BOOL_ABSENT) { - VIR_DEBUG("TSC frequencies do not match and scaling support is " - "unknown, QEMU will try and possibly fail later"); + VIR_DEBUG("Requested TSC frequency falls outside tolerance range and " + "scaling support is unknown, QEMU will try and possibly " + "fail later"); return 0; } virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Requested TSC frequency %llu Hz does not match " - "host (%llu Hz) and TSC scaling is not supported " - "by the host CPU"), - freq, tsc->frequency); + _("Requested TSC frequency %llu Hz is outside tolerance " + "range ([%llu, %llu] Hz) around host frequency %llu Hz " + "and TSC scaling is not supported by the host CPU"), + freq, minFreq, maxFreq, tsc->frequency); return -1; }
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