lkml.org 
[lkml]   [2010]   [Apr]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[130/139] KVM: SVM: Fix memory leaks that happen when svm_create_vcpu() fails
    2.6.33-stable review patch.  If anyone has any objections, please let us know.

    ------------------

    From: Takuya Yoshikawa <yoshikawa.takuya@oss.ntt.co.jp>

    (Cherry-picked from commit b7af40433870aa0636932ad39b0c48a0cb319057)

    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 <yoshikawa.takuya@oss.ntt.co.jp>
    Signed-off-by: Avi Kivity <avi@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

    ---
    arch/x86/kvm/svm.c | 25 +++++++++++++++----------
    1 file changed, 15 insertions(+), 10 deletions(-)

    --- a/arch/x86/kvm/svm.c
    +++ b/arch/x86/kvm/svm.c
    @@ -698,29 +698,28 @@ static struct kvm_vcpu *svm_create_vcpu(
    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);
    @@ -737,6 +736,12 @@ static struct kvm_vcpu *svm_create_vcpu(

    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:



    \
     
     \ /
      Last update: 2010-04-22 22:13    [W:5.715 / U:0.000 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site