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 52f78dd03010..2ba58206812a 100644 --- a/arch/x86/kvm/svm.c +++ b/arch/x86/kvm/svm.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <linux/highmem.h> | 26 | #include <linux/highmem.h> |
27 | #include <linux/sched.h> | 27 | #include <linux/sched.h> |
28 | #include <linux/ftrace_event.h> | 28 | #include <linux/ftrace_event.h> |
29 | #include <linux/slab.h> | ||
29 | 30 | ||
30 | #include <asm/desc.h> | 31 | #include <asm/desc.h> |
31 | 32 | ||
@@ -705,29 +706,28 @@ static struct kvm_vcpu *svm_create_vcpu(struct kvm *kvm, unsigned int id) | |||
705 | if (err) | 706 | if (err) |
706 | goto free_svm; | 707 | goto free_svm; |
707 | 708 | ||
709 | err = -ENOMEM; | ||
708 | page = alloc_page(GFP_KERNEL); | 710 | page = alloc_page(GFP_KERNEL); |
709 | if (!page) { | 711 | if (!page) |
710 | err = -ENOMEM; | ||
711 | goto uninit; | 712 | goto uninit; |
712 | } | ||
713 | 713 | ||
714 | err = -ENOMEM; | ||
715 | msrpm_pages = alloc_pages(GFP_KERNEL, MSRPM_ALLOC_ORDER); | 714 | msrpm_pages = alloc_pages(GFP_KERNEL, MSRPM_ALLOC_ORDER); |
716 | if (!msrpm_pages) | 715 | if (!msrpm_pages) |
717 | goto uninit; | 716 | goto free_page1; |
718 | 717 | ||
719 | nested_msrpm_pages = alloc_pages(GFP_KERNEL, MSRPM_ALLOC_ORDER); | 718 | nested_msrpm_pages = alloc_pages(GFP_KERNEL, MSRPM_ALLOC_ORDER); |
720 | if (!nested_msrpm_pages) | 719 | if (!nested_msrpm_pages) |
721 | goto uninit; | 720 | goto free_page2; |
722 | |||
723 | svm->msrpm = page_address(msrpm_pages); | ||
724 | svm_vcpu_init_msrpm(svm->msrpm); | ||
725 | 721 | ||
726 | hsave_page = alloc_page(GFP_KERNEL); | 722 | hsave_page = alloc_page(GFP_KERNEL); |
727 | if (!hsave_page) | 723 | if (!hsave_page) |
728 | goto uninit; | 724 | goto free_page3; |
725 | |||
729 | svm->nested.hsave = page_address(hsave_page); | 726 | svm->nested.hsave = page_address(hsave_page); |
730 | 727 | ||
728 | svm->msrpm = page_address(msrpm_pages); | ||
729 | svm_vcpu_init_msrpm(svm->msrpm); | ||
730 | |||
731 | svm->nested.msrpm = page_address(nested_msrpm_pages); | 731 | svm->nested.msrpm = page_address(nested_msrpm_pages); |
732 | 732 | ||
733 | svm->vmcb = page_address(page); | 733 | svm->vmcb = page_address(page); |
@@ -743,6 +743,12 @@ static struct kvm_vcpu *svm_create_vcpu(struct kvm *kvm, unsigned int id) | |||
743 | 743 | ||
744 | return &svm->vcpu; | 744 | return &svm->vcpu; |
745 | 745 | ||
746 | free_page3: | ||
747 | __free_pages(nested_msrpm_pages, MSRPM_ALLOC_ORDER); | ||
748 | free_page2: | ||
749 | __free_pages(msrpm_pages, MSRPM_ALLOC_ORDER); | ||
750 | free_page1: | ||
751 | __free_page(page); | ||
746 | uninit: | 752 | uninit: |
747 | kvm_vcpu_uninit(&svm->vcpu); | 753 | kvm_vcpu_uninit(&svm->vcpu); |
748 | free_svm: | 754 | free_svm: |