Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
SUSE:SLE-15-SP3:Update
libvirt.25654
5df2c492-use-kvm-for-tsc-scaling.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 5df2c492-use-kvm-for-tsc-scaling.patch of Package libvirt.25654
commit 5df2c49263338da7221f24b3ad67ffd21d88047c Author: Daniel P. Berrangé <berrange@redhat.com> Date: Wed Aug 4 18:05:59 2021 +0100 util: directly query KVM for TSC scaling support We currently query the host MSRs to determine if TSC scaling is supported. This works OK when running privileged and can open the /dev/cpu/0/msr. When unprivileged we fallback to querying MSRs from /dev/kvm. This is incorrect because /dev/kvm only reports accurate info for MSRs that are valid to use from inside a guest. The TSC scaling support MSR is not, thus we always end up reporting lack of TSC scaling when unprivileged. The solution to this is easy, because KVM can directly report whether TSC scaling is available, which matches what QEMU will do at startup. Closes: https://gitlab.com/libvirt/libvirt/-/issues/188 Reported-by: Roman Mohr <rmohr@redhat.com> Reviewed-by: Michal Privoznik <mprivozn@redhat.com> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> Index: libvirt-7.1.0/src/util/virhostcpu.c =================================================================== --- libvirt-7.1.0.orig/src/util/virhostcpu.c +++ libvirt-7.1.0/src/util/virhostcpu.c @@ -1336,9 +1336,6 @@ virHostCPUGetMSR(unsigned long index, } -# define VMX_PROCBASED_CTLS2_MSR 0x48b -# define VMX_USE_TSC_SCALING (1 << 25) - /* * This function should only be called when the host CPU supports invariant TSC * (invtsc CPUID feature). @@ -1349,11 +1346,10 @@ virHostCPUGetMSR(unsigned long index, virHostCPUTscInfoPtr virHostCPUGetTscInfo(void) { - virHostCPUTscInfoPtr info; + g_autofree virHostCPUTscInfoPtr info = g_new0(virHostCPUTscInfo, 1); VIR_AUTOCLOSE kvmFd = -1; VIR_AUTOCLOSE vmFd = -1; VIR_AUTOCLOSE vcpuFd = -1; - uint64_t msr = 0; int rc; if ((kvmFd = open(KVM_DEVICE, O_RDONLY)) < 0) { @@ -1378,23 +1374,19 @@ virHostCPUGetTscInfo(void) _("Unable to probe TSC frequency")); return NULL; } - - info = g_new0(virHostCPUTscInfo, 1); - info->frequency = rc * 1000ULL; - if (virHostCPUGetMSR(VMX_PROCBASED_CTLS2_MSR, &msr) == 0) { - /* High 32 bits of the MSR value indicate whether specific control - * can be set to 1. */ - msr >>= 32; - - info->scaling = virTristateBoolFromBool(!!(msr & VMX_USE_TSC_SCALING)); + if ((rc = ioctl(kvmFd, KVM_CHECK_EXTENSION, KVM_CAP_TSC_CONTROL)) < 0) { + virReportSystemError(errno, "%s", + _("Unable to query TSC scaling support")); + return NULL; } + info->scaling = rc ? VIR_TRISTATE_BOOL_YES : VIR_TRISTATE_BOOL_NO; VIR_DEBUG("Detected TSC frequency %llu Hz, scaling %s", info->frequency, virTristateBoolTypeToString(info->scaling)); - return info; + return g_steal_pointer(&info); } #else
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