]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blob - releases/2.6.32.12/0002-KVM-SVM-Fix-memory-leaks-that-happen-when-svm_create.patch
Fixes for 5.10
[thirdparty/kernel/stable-queue.git] / releases / 2.6.32.12 / 0002-KVM-SVM-Fix-memory-leaks-that-happen-when-svm_create.patch
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
5
6 From: Takuya Yoshikawa <yoshikawa.takuya@oss.ntt.co.jp>
7
8 (Cherry-picked from commit b7af40433870aa0636932ad39b0c48a0cb319057)
9
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.
12
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>
16
17 ---
18 arch/x86/kvm/svm.c | 25 +++++++++++++++----------
19 1 file changed, 15 insertions(+), 10 deletions(-)
20
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(
24 if (err)
25 goto free_svm;
26
27 + err = -ENOMEM;
28 page = alloc_page(GFP_KERNEL);
29 - if (!page) {
30 - err = -ENOMEM;
31 + if (!page)
32 goto uninit;
33 - }
34
35 - err = -ENOMEM;
36 msrpm_pages = alloc_pages(GFP_KERNEL, MSRPM_ALLOC_ORDER);
37 if (!msrpm_pages)
38 - goto uninit;
39 + goto free_page1;
40
41 nested_msrpm_pages = alloc_pages(GFP_KERNEL, MSRPM_ALLOC_ORDER);
42 if (!nested_msrpm_pages)
43 - goto uninit;
44 -
45 - svm->msrpm = page_address(msrpm_pages);
46 - svm_vcpu_init_msrpm(svm->msrpm);
47 + goto free_page2;
48
49 hsave_page = alloc_page(GFP_KERNEL);
50 if (!hsave_page)
51 - goto uninit;
52 + goto free_page3;
53 +
54 svm->nested.hsave = page_address(hsave_page);
55
56 + svm->msrpm = page_address(msrpm_pages);
57 + svm_vcpu_init_msrpm(svm->msrpm);
58 +
59 svm->nested.msrpm = page_address(nested_msrpm_pages);
60
61 svm->vmcb = page_address(page);
62 @@ -733,6 +732,12 @@ static struct kvm_vcpu *svm_create_vcpu(
63
64 return &svm->vcpu;
65
66 +free_page3:
67 + __free_pages(nested_msrpm_pages, MSRPM_ALLOC_ORDER);
68 +free_page2:
69 + __free_pages(msrpm_pages, MSRPM_ALLOC_ORDER);
70 +free_page1:
71 + __free_page(page);
72 uninit:
73 kvm_vcpu_uninit(&svm->vcpu);
74 free_svm: