aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarkus Elfring <elfring@users.sourceforge.net>2016-08-28 11:34:46 -0400
committerPaul Mackerras <paulus@ozlabs.org>2016-09-11 20:12:46 -0400
commit46d4e7479252d3fd82a0ea121daef75164a91939 (patch)
tree5145adab0abec1bc16384e036e53d2597683426c
parentf3c0ce86a8da6a43c3551a2223abd42040316dd8 (diff)
KVM: PPC: e500: Less function calls in kvm_vcpu_ioctl_config_tlb() after error detection
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> Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
-rw-r--r--arch/powerpc/kvm/e500_mmu.c30
1 files changed, 16 insertions, 14 deletions
diff --git a/arch/powerpc/kvm/e500_mmu.c b/arch/powerpc/kvm/e500_mmu.c
index 26f373710a25..b65a894b0d64 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,
785 785
786 ret = get_user_pages_fast(cfg->array, num_pages, 1, pages); 786 ret = get_user_pages_fast(cfg->array, num_pages, 1, pages);
787 if (ret < 0) 787 if (ret < 0)
788 goto err_pages; 788 goto free_pages;
789 789
790 if (ret != num_pages) { 790 if (ret != num_pages) {
791 num_pages = ret; 791 num_pages = ret;
792 ret = -EFAULT; 792 ret = -EFAULT;
793 goto err_put_page; 793 goto put_pages;
794 } 794 }
795 795
796 virt = vmap(pages, num_pages, VM_MAP, PAGE_KERNEL); 796 virt = vmap(pages, num_pages, VM_MAP, PAGE_KERNEL);
797 if (!virt) { 797 if (!virt) {
798 ret = -ENOMEM; 798 ret = -ENOMEM;
799 goto err_put_page; 799 goto put_pages;
800 } 800 }
801 801
802 privs[0] = kzalloc(sizeof(struct tlbe_priv) * params.tlb_sizes[0], 802 privs[0] = kzalloc(sizeof(struct tlbe_priv) * params.tlb_sizes[0],
803 GFP_KERNEL); 803 GFP_KERNEL);
804 if (!privs[0]) {
805 ret = -ENOMEM;
806 goto put_pages;
807 }
808
804 privs[1] = kzalloc(sizeof(struct tlbe_priv) * params.tlb_sizes[1], 809 privs[1] = kzalloc(sizeof(struct tlbe_priv) * params.tlb_sizes[1],
805 GFP_KERNEL); 810 GFP_KERNEL);
806 811 if (!privs[1]) {
807 if (!privs[0] || !privs[1]) {
808 ret = -ENOMEM; 812 ret = -ENOMEM;
809 goto err_privs; 813 goto free_privs_first;
810 } 814 }
811 815
812 g2h_bitmap = kzalloc(sizeof(u64) * params.tlb_sizes[1], 816 g2h_bitmap = kzalloc(sizeof(u64) * params.tlb_sizes[1],
813 GFP_KERNEL); 817 GFP_KERNEL);
814 if (!g2h_bitmap) { 818 if (!g2h_bitmap) {
815 ret = -ENOMEM; 819 ret = -ENOMEM;
816 goto err_privs; 820 goto free_privs_second;
817 } 821 }
818 822
819 free_gtlb(vcpu_e500); 823 free_gtlb(vcpu_e500);
@@ -845,16 +849,14 @@ int kvm_vcpu_ioctl_config_tlb(struct kvm_vcpu *vcpu,
845 849
846 kvmppc_recalc_tlb1map_range(vcpu_e500); 850 kvmppc_recalc_tlb1map_range(vcpu_e500);
847 return 0; 851 return 0;
848 852 free_privs_second:
849err_privs:
850 kfree(privs[0]);
851 kfree(privs[1]); 853 kfree(privs[1]);
852 854 free_privs_first:
853err_put_page: 855 kfree(privs[0]);
856 put_pages:
854 for (i = 0; i < num_pages; i++) 857 for (i = 0; i < num_pages; i++)
855 put_page(pages[i]); 858 put_page(pages[i]);
856 859 free_pages:
857err_pages:
858 kfree(pages); 860 kfree(pages);
859 return ret; 861 return ret;
860} 862}