diff options
Diffstat (limited to 'arch/x86/kvm/svm.c')
| -rw-r--r-- | arch/x86/kvm/svm.c | 26 | 
1 files changed, 16 insertions, 10 deletions
diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c index 52f78dd0301..2ba58206812 100644 --- a/arch/x86/kvm/svm.c +++ b/arch/x86/kvm/svm.c @@ -26,6 +26,7 @@  #include <linux/highmem.h>  #include <linux/sched.h>  #include <linux/ftrace_event.h> +#include <linux/slab.h>  #include <asm/desc.h> @@ -705,29 +706,28 @@ static struct kvm_vcpu *svm_create_vcpu(struct kvm *kvm, unsigned int id)  	if (err)  		goto free_svm; +	err = -ENOMEM;  	page = alloc_page(GFP_KERNEL); -	if (!page) { -		err = -ENOMEM; +	if (!page)  		goto uninit; -	} -	err = -ENOMEM;  	msrpm_pages = alloc_pages(GFP_KERNEL, MSRPM_ALLOC_ORDER);  	if (!msrpm_pages) -		goto uninit; +		goto free_page1;  	nested_msrpm_pages = alloc_pages(GFP_KERNEL, MSRPM_ALLOC_ORDER);  	if (!nested_msrpm_pages) -		goto uninit; - -	svm->msrpm = page_address(msrpm_pages); -	svm_vcpu_init_msrpm(svm->msrpm); +		goto free_page2;  	hsave_page = alloc_page(GFP_KERNEL);  	if (!hsave_page) -		goto uninit; +		goto free_page3; +  	svm->nested.hsave = page_address(hsave_page); +	svm->msrpm = page_address(msrpm_pages); +	svm_vcpu_init_msrpm(svm->msrpm); +  	svm->nested.msrpm = page_address(nested_msrpm_pages);  	svm->vmcb = page_address(page); @@ -743,6 +743,12 @@ static struct kvm_vcpu *svm_create_vcpu(struct kvm *kvm, unsigned int id)  	return &svm->vcpu; +free_page3: +	__free_pages(nested_msrpm_pages, MSRPM_ALLOC_ORDER); +free_page2: +	__free_pages(msrpm_pages, MSRPM_ALLOC_ORDER); +free_page1: +	__free_page(page);  uninit:  	kvm_vcpu_uninit(&svm->vcpu);  free_svm:  |