[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH v4 28/30] KVM: x86: Remove runtime Xen TSC frequency CPUID update



From: David Woodhouse <dwmw@xxxxxxxxxxxx>

Remove the code in kvm_cpuid() that dynamically updates the Xen TSC
info CPUID leaf at runtime. This code was updating the wrong sub-leaf
anyway (0x40000x03/2 EAX is the *host* TSC frequency per the Xen ABI,
not the guest frequency which belongs in 0x40000x03/0 ECX).

Userspace now has all the information it needs to populate the Xen TSC
info leaves (and the generic 0x40000010 timing leaf) at vCPU setup time:

  - KVM_GET_CLOCK_GUEST returns the pvclock_vcpu_time_info structure
    containing tsc_to_system_mul and tsc_shift (Xen leaf index 1)
  - KVM_VCPU_TSC_EFFECTIVE_FREQ returns the effective TSC and bus
    frequencies in kHz (Xen leaf index 2, and 0x40000010)
  - KVM_VCPU_TSC_SCALE returns the raw hardware scaling ratio for
    precise arithmetic (VMClock)

This eliminates the last instance of KVM modifying guest CPUID entries
at runtime for timing information.

Signed-off-by: David Woodhouse <dwmw@xxxxxxxxxxxx>
---
 arch/x86/kvm/cpuid.c | 16 ----------------
 arch/x86/kvm/xen.h   | 13 -------------
 2 files changed, 29 deletions(-)

diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c
index 621d950ec692..826637a0b72d 100644
--- a/arch/x86/kvm/cpuid.c
+++ b/arch/x86/kvm/cpuid.c
@@ -2117,22 +2117,6 @@ bool kvm_cpuid(struct kvm_vcpu *vcpu, u32 *eax, u32 *ebx,
                } else if (function == 0x80000007) {
                        if (kvm_hv_invtsc_suppressed(vcpu))
                                *edx &= ~feature_bit(CONSTANT_TSC);
-               } else if (IS_ENABLED(CONFIG_KVM_XEN) &&
-                          kvm_xen_is_tsc_leaf(vcpu, function)) {
-                       /*
-                        * Update guest TSC frequency information if necessary.
-                        * Ignore failures, there is no sane value that can be
-                        * provided if KVM can't get the TSC frequency.
-                        */
-                       if (kvm_check_request(KVM_REQ_CLOCK_UPDATE, vcpu))
-                               kvm_guest_time_update(vcpu);
-
-                       if (index == 1) {
-                               *ecx = vcpu->arch.pvclock_tsc_mul;
-                               *edx = vcpu->arch.pvclock_tsc_shift;
-                       } else if (index == 2) {
-                               *eax = div_u64(vcpu->arch.hw_tsc_hz, 1000);
-                       }
                }
        } else {
                *eax = *ebx = *ecx = *edx = 0;
diff --git a/arch/x86/kvm/xen.h b/arch/x86/kvm/xen.h
index 59e6128a7bd3..f372855857a8 100644
--- a/arch/x86/kvm/xen.h
+++ b/arch/x86/kvm/xen.h
@@ -50,14 +50,6 @@ static inline void kvm_xen_sw_enable_lapic(struct kvm_vcpu 
*vcpu)
                kvm_xen_inject_vcpu_vector(vcpu);
 }
 
-static inline bool kvm_xen_is_tsc_leaf(struct kvm_vcpu *vcpu, u32 function)
-{
-       return static_branch_unlikely(&kvm_xen_enabled.key) &&
-              vcpu->arch.xen.cpuid.base &&
-              function <= vcpu->arch.xen.cpuid.limit &&
-              function == (vcpu->arch.xen.cpuid.base | XEN_CPUID_LEAF(3));
-}
-
 static inline bool kvm_xen_msr_enabled(struct kvm *kvm)
 {
        return static_branch_unlikely(&kvm_xen_enabled.key) &&
@@ -177,11 +169,6 @@ static inline bool kvm_xen_timer_enabled(struct kvm_vcpu 
*vcpu)
 {
        return false;
 }
-
-static inline bool kvm_xen_is_tsc_leaf(struct kvm_vcpu *vcpu, u32 function)
-{
-       return false;
-}
 #endif
 
 int kvm_xen_hypercall(struct kvm_vcpu *vcpu);
-- 
2.51.0




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.