Change kvm_vcpu_after_set_cpuid() to return an error code, in preparation for adding CPUID paranoid verification that will reject invalid userspace CPUID configurations. Have kvm_set_cpuid() check the return value and unwind on failure, utilizing the existing error path that restores the vCPU's previous CPUID entries and capabilities. No functional change intended. Signed-off-by: Binbin Wu --- arch/x86/kvm/cpuid.c | 8 ++++++-- arch/x86/kvm/cpuid.h | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c index 789ec9eb7aaf..08f5bc1d26b1 100644 --- a/arch/x86/kvm/cpuid.c +++ b/arch/x86/kvm/cpuid.c @@ -449,7 +449,7 @@ static bool __maybe_unused is_cpuid_subleaf_common_pattern(u32 func, u32 *index) } } -void kvm_vcpu_after_set_cpuid(struct kvm_vcpu *vcpu) +int kvm_vcpu_after_set_cpuid(struct kvm_vcpu *vcpu) { u8 cpuid_overlay = get_cpuid_overlay(vcpu->kvm); struct kvm_lapic *apic = vcpu->arch.apic; @@ -543,6 +543,8 @@ void kvm_vcpu_after_set_cpuid(struct kvm_vcpu *vcpu) kvm_mmu_after_set_cpuid(vcpu); kvm_make_request(KVM_REQ_RECALC_INTERCEPTS, vcpu); + + return 0; } int cpuid_query_maxphyaddr(struct kvm_vcpu *vcpu) @@ -649,7 +651,9 @@ static int kvm_set_cpuid(struct kvm_vcpu *vcpu, struct kvm_cpuid_entry2 *e2, #ifdef CONFIG_KVM_XEN vcpu->arch.xen.cpuid = kvm_get_hypervisor_cpuid(vcpu, XEN_SIGNATURE); #endif - kvm_vcpu_after_set_cpuid(vcpu); + r = kvm_vcpu_after_set_cpuid(vcpu); + if (r) + goto err; success: kvfree(e2); diff --git a/arch/x86/kvm/cpuid.h b/arch/x86/kvm/cpuid.h index 535377e519b5..cff5e71579ce 100644 --- a/arch/x86/kvm/cpuid.h +++ b/arch/x86/kvm/cpuid.h @@ -42,7 +42,7 @@ static inline void kvm_finalize_cpu_caps(void) kvm_is_configuring_cpu_caps = false; } -void kvm_vcpu_after_set_cpuid(struct kvm_vcpu *vcpu); +int kvm_vcpu_after_set_cpuid(struct kvm_vcpu *vcpu); struct kvm_cpuid_entry2 *kvm_find_cpuid_entry2(struct kvm_cpuid_entry2 *entries, int nent, u32 function, u64 index); /* -- 2.46.0