lkml.org 
[lkml]   [2016]   [Aug]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Subject[PATCH 2/6] KVM: PPC: e500: Less function calls in kvm_vcpu_ioctl_config_tlb() after error detection
    From
    Date
    From: Markus Elfring <elfring@users.sourceforge.net>
    Date: Sun, 28 Aug 2016 17:34:46 +0200

    The kfree() function was called in two cases by the
    kvm_vcpu_ioctl_config_tlb() function during error handling
    even if the passed data structure element contained a null pointer.

    * Split a condition check for memory allocation failures.

    * Adjust jump targets according to the Linux coding style convention.

    Signed-off-by: Markus Elfring <elfring@users.sourceforge.net>
    ---
    arch/powerpc/kvm/e500_mmu.c | 30 ++++++++++++++++--------------
    1 file changed, 16 insertions(+), 14 deletions(-)

    diff --git a/arch/powerpc/kvm/e500_mmu.c b/arch/powerpc/kvm/e500_mmu.c
    index 26f3737..b65a894 100644
    --- a/arch/powerpc/kvm/e500_mmu.c
    +++ b/arch/powerpc/kvm/e500_mmu.c
    @@ -785,35 +785,39 @@ int kvm_vcpu_ioctl_config_tlb(struct kvm_vcpu *vcpu,

    ret = get_user_pages_fast(cfg->array, num_pages, 1, pages);
    if (ret < 0)
    - goto err_pages;
    + goto free_pages;

    if (ret != num_pages) {
    num_pages = ret;
    ret = -EFAULT;
    - goto err_put_page;
    + goto put_pages;
    }

    virt = vmap(pages, num_pages, VM_MAP, PAGE_KERNEL);
    if (!virt) {
    ret = -ENOMEM;
    - goto err_put_page;
    + goto put_pages;
    }

    privs[0] = kzalloc(sizeof(struct tlbe_priv) * params.tlb_sizes[0],
    GFP_KERNEL);
    + if (!privs[0]) {
    + ret = -ENOMEM;
    + goto put_pages;
    + }
    +
    privs[1] = kzalloc(sizeof(struct tlbe_priv) * params.tlb_sizes[1],
    GFP_KERNEL);
    -
    - if (!privs[0] || !privs[1]) {
    + if (!privs[1]) {
    ret = -ENOMEM;
    - goto err_privs;
    + goto free_privs_first;
    }

    g2h_bitmap = kzalloc(sizeof(u64) * params.tlb_sizes[1],
    GFP_KERNEL);
    if (!g2h_bitmap) {
    ret = -ENOMEM;
    - goto err_privs;
    + goto free_privs_second;
    }

    free_gtlb(vcpu_e500);
    @@ -845,16 +849,14 @@ int kvm_vcpu_ioctl_config_tlb(struct kvm_vcpu *vcpu,

    kvmppc_recalc_tlb1map_range(vcpu_e500);
    return 0;
    -
    -err_privs:
    - kfree(privs[0]);
    + free_privs_second:
    kfree(privs[1]);
    -
    -err_put_page:
    + free_privs_first:
    + kfree(privs[0]);
    + put_pages:
    for (i = 0; i < num_pages; i++)
    put_page(pages[i]);
    -
    -err_pages:
    + free_pages:
    kfree(pages);
    return ret;
    }
    --
    2.9.3
    \
     
     \ /
      Last update: 2016-09-17 09:58    [W:4.018 / U:1.928 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site