KVM: x86: Directly return __vmalloc() result in ->vm_alloc()
authorSean Christopherson <sean.j.christopherson@intel.com>
Mon, 27 Jan 2020 00:41:12 +0000 (16:41 -0800)
committerPaolo Bonzini <pbonzini@redhat.com>
Mon, 16 Mar 2020 16:57:32 +0000 (17:57 +0100)
Directly return the __vmalloc() result in {svm,vmx}_vm_alloc() to pave
the way for handling VM alloc/free in common x86 code, and to obviate
the need to check the result of __vmalloc() in vendor specific code.
Add a build-time assertion to ensure each structs' "kvm" field stays at
offset 0, which allows interpreting a "struct kvm_{svm,vmx}" as a
"struct kvm".

Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com>
Reviewed-by: Vitaly Kuznetsov <vkuznets@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/svm.c
arch/x86/kvm/vmx/vmx.c

index 0455bd1..fdc88f7 100644 (file)
@@ -1946,19 +1946,15 @@ static void __unregister_enc_region_locked(struct kvm *kvm,
 
 static struct kvm *svm_vm_alloc(void)
 {
-       struct kvm_svm *kvm_svm = __vmalloc(sizeof(struct kvm_svm),
-                                           GFP_KERNEL_ACCOUNT | __GFP_ZERO,
-                                           PAGE_KERNEL);
+       BUILD_BUG_ON(offsetof(struct kvm_svm, kvm) != 0);
 
-       if (!kvm_svm)
-               return NULL;
-
-       return &kvm_svm->kvm;
+       return __vmalloc(sizeof(struct kvm_svm),
+                        GFP_KERNEL_ACCOUNT | __GFP_ZERO, PAGE_KERNEL);
 }
 
 static void svm_vm_free(struct kvm *kvm)
 {
-       vfree(to_kvm_svm(kvm));
+       vfree(kvm);
 }
 
 static void sev_vm_destroy(struct kvm *kvm)
index 933c72b..7d19ed7 100644 (file)
@@ -6681,20 +6681,16 @@ static void vmx_vcpu_run(struct kvm_vcpu *vcpu)
 
 static struct kvm *vmx_vm_alloc(void)
 {
-       struct kvm_vmx *kvm_vmx = __vmalloc(sizeof(struct kvm_vmx),
-                                           GFP_KERNEL_ACCOUNT | __GFP_ZERO,
-                                           PAGE_KERNEL);
+       BUILD_BUG_ON(offsetof(struct kvm_vmx, kvm) != 0);
 
-       if (!kvm_vmx)
-               return NULL;
-
-       return &kvm_vmx->kvm;
+       return __vmalloc(sizeof(struct kvm_vmx),
+                        GFP_KERNEL_ACCOUNT | __GFP_ZERO, PAGE_KERNEL);
 }
 
 static void vmx_vm_free(struct kvm *kvm)
 {
        kfree(kvm->arch.hyperv.hv_pa_pg);
-       vfree(to_kvm_vmx(kvm));
+       vfree(kvm);
 }
 
 static void vmx_free_vcpu(struct kvm_vcpu *vcpu)