1 From 55a5d6db91054b446d633f61e0c0ad23e3944aec Mon Sep 17 00:00:00 2001
2 From: Takuya Yoshikawa <yoshikawa.takuya@oss.ntt.co.jp>
3 Date: Tue, 9 Mar 2010 14:55:19 +0900
4 Subject: KVM: SVM: Fix memory leaks that happen when svm_create_vcpu() fails
6 From: Takuya Yoshikawa <yoshikawa.takuya@oss.ntt.co.jp>
8 (Cherry-picked from commit b7af40433870aa0636932ad39b0c48a0cb319057)
10 svm_create_vcpu() does not free the pages allocated during the creation
11 when it fails to complete the allocations. This patch fixes it.
13 Signed-off-by: Takuya Yoshikawa <yoshikawa.takuya@oss.ntt.co.jp>
14 Signed-off-by: Avi Kivity <avi@redhat.com>
15 Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
18 arch/x86/kvm/svm.c | 25 +++++++++++++++----------
19 1 file changed, 15 insertions(+), 10 deletions(-)
21 --- a/arch/x86/kvm/svm.c
22 +++ b/arch/x86/kvm/svm.c
23 @@ -694,29 +694,28 @@ static struct kvm_vcpu *svm_create_vcpu(
28 page = alloc_page(GFP_KERNEL);
36 msrpm_pages = alloc_pages(GFP_KERNEL, MSRPM_ALLOC_ORDER);
41 nested_msrpm_pages = alloc_pages(GFP_KERNEL, MSRPM_ALLOC_ORDER);
42 if (!nested_msrpm_pages)
45 - svm->msrpm = page_address(msrpm_pages);
46 - svm_vcpu_init_msrpm(svm->msrpm);
49 hsave_page = alloc_page(GFP_KERNEL);
54 svm->nested.hsave = page_address(hsave_page);
56 + svm->msrpm = page_address(msrpm_pages);
57 + svm_vcpu_init_msrpm(svm->msrpm);
59 svm->nested.msrpm = page_address(nested_msrpm_pages);
61 svm->vmcb = page_address(page);
62 @@ -733,6 +732,12 @@ static struct kvm_vcpu *svm_create_vcpu(
67 + __free_pages(nested_msrpm_pages, MSRPM_ALLOC_ORDER);
69 + __free_pages(msrpm_pages, MSRPM_ALLOC_ORDER);
73 kvm_vcpu_uninit(&svm->vcpu);