And let kvm_lapic_set_base() call kvm_apic_base_update_cpuid() instead of whole kvm_update_cpuid_runtime(). Signed-off-by: Robert Hoo <robert.hu@xxxxxxxxxxxxxxx> --- arch/x86/kvm/cpuid.c | 14 ++++++++++++++ arch/x86/kvm/cpuid.h | 1 + arch/x86/kvm/lapic.c | 2 +- 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c index 3fd6eec..b6dd4ee 100644 --- a/arch/x86/kvm/cpuid.c +++ b/arch/x86/kvm/cpuid.c @@ -73,6 +73,20 @@ static int kvm_check_cpuid(struct kvm_vcpu *vcpu) return 0; } +static inline void guest_cpuid_change(struct kvm_vcpu *vcpu, u32 function, + u32 index, unsigned int feature, bool set) +{ + struct kvm_cpuid_entry2 *e = kvm_find_cpuid_entry(vcpu, function, index); + + if (e) + cpuid_entry_change(e, feature, set); +} + +void kvm_apic_base_update_cpuid(struct kvm_vcpu *vcpu, bool set) +{ + guest_cpuid_change(vcpu, 1, 0, X86_FEATURE_APIC, set); +} + void kvm_update_cpuid_runtime(struct kvm_vcpu *vcpu) { struct kvm_cpuid_entry2 *best; diff --git a/arch/x86/kvm/cpuid.h b/arch/x86/kvm/cpuid.h index 3a923ae..ef4cb9c 100644 --- a/arch/x86/kvm/cpuid.h +++ b/arch/x86/kvm/cpuid.h @@ -9,6 +9,7 @@ extern u32 kvm_cpu_caps[NCAPINTS] __read_mostly; void kvm_set_cpu_caps(void); +void kvm_apic_base_update_cpuid(struct kvm_vcpu *vcpu, bool set); void kvm_update_cpuid_runtime(struct kvm_vcpu *vcpu); struct kvm_cpuid_entry2 *kvm_find_cpuid_entry(struct kvm_vcpu *vcpu, u32 function, u32 index); diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index 5ccbee7..5221b89 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c @@ -2231,7 +2231,7 @@ void kvm_lapic_set_base(struct kvm_vcpu *vcpu, u64 value) vcpu->arch.apic_base = value; if ((old_value ^ value) & MSR_IA32_APICBASE_ENABLE) - kvm_update_cpuid_runtime(vcpu); + kvm_apic_base_update_cpuid(vcpu, !!(value & MSR_IA32_APICBASE_ENABLE)); if (!apic) return; -- 1.8.3.1