Re: [PATCH bugfix] KVM: SVM: Fix memory leaks that happen when svm_create_vcpu() fails

2010-03-09 Thread Avi Kivity

On 03/09/2010 07:55 AM, Takuya Yoshikawa wrote:

svm_create_vcpu() does not free the pages allocated during the creation
when it fails to complete the allocations. This patch fixes it.
   


Applied, thanks.

--
error compiling committee.c: too many arguments to function

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH bugfix] KVM: SVM: Fix memory leaks that happen when svm_create_vcpu() fails

2010-03-08 Thread Takuya Yoshikawa
svm_create_vcpu() does not free the pages allocated during the creation
when it fails to complete the allocations. This patch fixes it.

Signed-off-by: Takuya Yoshikawa 
---
 arch/x86/kvm/svm.c |   25 +++--
 1 files changed, 15 insertions(+), 10 deletions(-)

diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
index def4877..3a2f2b9 100644
--- a/arch/x86/kvm/svm.c
+++ b/arch/x86/kvm/svm.c
@@ -836,29 +836,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_vcpu_init_msrpm(svm->nested.msrpm);
 
@@ -875,6 +874,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:
-- 
1.6.3.3

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html