Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
[linux-2.6-microblaze.git] / arch / powerpc / kvm / e500_mmu.c
index 29911a0..ddbf8f0 100644 (file)
@@ -743,7 +743,7 @@ int kvm_vcpu_ioctl_config_tlb(struct kvm_vcpu *vcpu,
        char *virt;
        struct page **pages;
        struct tlbe_priv *privs[2] = {};
-       u64 *g2h_bitmap = NULL;
+       u64 *g2h_bitmap;
        size_t array_len;
        u32 sets;
        int num_pages, ret, i;
@@ -779,41 +779,44 @@ int kvm_vcpu_ioctl_config_tlb(struct kvm_vcpu *vcpu,
 
        num_pages = DIV_ROUND_UP(cfg->array + array_len - 1, PAGE_SIZE) -
                    cfg->array / PAGE_SIZE;
-       pages = kmalloc(sizeof(struct page *) * num_pages, GFP_KERNEL);
+       pages = kmalloc_array(num_pages, sizeof(*pages), GFP_KERNEL);
        if (!pages)
                return -ENOMEM;
 
        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);
-       privs[1] = kzalloc(sizeof(struct tlbe_priv) * params.tlb_sizes[1],
-                          GFP_KERNEL);
+       privs[0] = kcalloc(params.tlb_sizes[0], sizeof(*privs[0]), GFP_KERNEL);
+       if (!privs[0]) {
+               ret = -ENOMEM;
+               goto put_pages;
+       }
 
-       if (!privs[0] || !privs[1]) {
+       privs[1] = kcalloc(params.tlb_sizes[1], sizeof(*privs[1]), GFP_KERNEL);
+       if (!privs[1]) {
                ret = -ENOMEM;
-               goto err_privs;
+               goto free_privs_first;
        }
 
-       g2h_bitmap = kzalloc(sizeof(u64) * params.tlb_sizes[1],
-                            GFP_KERNEL);
+       g2h_bitmap = kcalloc(params.tlb_sizes[1],
+                            sizeof(*g2h_bitmap),
+                            GFP_KERNEL);
        if (!g2h_bitmap) {
                ret = -ENOMEM;
-               goto err_privs;
+               goto free_privs_second;
        }
 
        free_gtlb(vcpu_e500);
@@ -845,16 +848,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;
 }
@@ -904,11 +905,9 @@ static int vcpu_mmu_init(struct kvm_vcpu *vcpu,
 int kvmppc_e500_tlb_init(struct kvmppc_vcpu_e500 *vcpu_e500)
 {
        struct kvm_vcpu *vcpu = &vcpu_e500->vcpu;
-       int entry_size = sizeof(struct kvm_book3e_206_tlb_entry);
-       int entries = KVM_E500_TLB0_SIZE + KVM_E500_TLB1_SIZE;
 
        if (e500_mmu_host_init(vcpu_e500))
-               goto err;
+               goto free_vcpu;
 
        vcpu_e500->gtlb_params[0].entries = KVM_E500_TLB0_SIZE;
        vcpu_e500->gtlb_params[1].entries = KVM_E500_TLB1_SIZE;
@@ -920,37 +919,39 @@ int kvmppc_e500_tlb_init(struct kvmppc_vcpu_e500 *vcpu_e500)
        vcpu_e500->gtlb_params[1].ways = KVM_E500_TLB1_SIZE;
        vcpu_e500->gtlb_params[1].sets = 1;
 
-       vcpu_e500->gtlb_arch = kmalloc(entries * entry_size, GFP_KERNEL);
+       vcpu_e500->gtlb_arch = kmalloc_array(KVM_E500_TLB0_SIZE +
+                                            KVM_E500_TLB1_SIZE,
+                                            sizeof(*vcpu_e500->gtlb_arch),
+                                            GFP_KERNEL);
        if (!vcpu_e500->gtlb_arch)
                return -ENOMEM;
 
        vcpu_e500->gtlb_offset[0] = 0;
        vcpu_e500->gtlb_offset[1] = KVM_E500_TLB0_SIZE;
 
-       vcpu_e500->gtlb_priv[0] = kzalloc(sizeof(struct tlbe_ref) *
-                                         vcpu_e500->gtlb_params[0].entries,
+       vcpu_e500->gtlb_priv[0] = kcalloc(vcpu_e500->gtlb_params[0].entries,
+                                         sizeof(struct tlbe_ref),
                                          GFP_KERNEL);
        if (!vcpu_e500->gtlb_priv[0])
-               goto err;
+               goto free_vcpu;
 
-       vcpu_e500->gtlb_priv[1] = kzalloc(sizeof(struct tlbe_ref) *
-                                         vcpu_e500->gtlb_params[1].entries,
+       vcpu_e500->gtlb_priv[1] = kcalloc(vcpu_e500->gtlb_params[1].entries,
+                                         sizeof(struct tlbe_ref),
                                          GFP_KERNEL);
        if (!vcpu_e500->gtlb_priv[1])
-               goto err;
+               goto free_vcpu;
 
-       vcpu_e500->g2h_tlb1_map = kzalloc(sizeof(u64) *
-                                         vcpu_e500->gtlb_params[1].entries,
+       vcpu_e500->g2h_tlb1_map = kcalloc(vcpu_e500->gtlb_params[1].entries,
+                                         sizeof(*vcpu_e500->g2h_tlb1_map),
                                          GFP_KERNEL);
        if (!vcpu_e500->g2h_tlb1_map)
-               goto err;
+               goto free_vcpu;
 
        vcpu_mmu_init(vcpu, vcpu_e500->gtlb_params);
 
        kvmppc_recalc_tlb1map_range(vcpu_e500);
        return 0;
-
-err:
+ free_vcpu:
        free_gtlb(vcpu_e500);
        return -1;
 }