diff options
author | Markus Elfring <elfring@users.sourceforge.net> | 2016-08-28 11:34:46 -0400 |
---|---|---|
committer | Paul Mackerras <paulus@ozlabs.org> | 2016-09-11 20:12:46 -0400 |
commit | 46d4e7479252d3fd82a0ea121daef75164a91939 (patch) | |
tree | 5145adab0abec1bc16384e036e53d2597683426c | |
parent | f3c0ce86a8da6a43c3551a2223abd42040316dd8 (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.c | 30 |
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: | |
849 | err_privs: | ||
850 | kfree(privs[0]); | ||
851 | kfree(privs[1]); | 853 | kfree(privs[1]); |
852 | 854 | free_privs_first: | |
853 | err_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: | |
857 | err_pages: | ||
858 | kfree(pages); | 860 | kfree(pages); |
859 | return ret; | 861 | return ret; |
860 | } | 862 | } |