If we fail due to some errorous situation, it is better to quit without doing heavy work. So changing order of execution. Signed-off-by: Joonsoo Kim <iamjoonsoo.kim@xxxxxxx> diff --git a/mm/rmap.c b/mm/rmap.c index a149e3a..c2f51cb 100644 --- a/mm/rmap.c +++ b/mm/rmap.c @@ -278,19 +278,19 @@ int anon_vma_fork(struct vm_area_struct *vma, struct vm_area_struct *pvma) if (!pvma->anon_vma) return 0; + /* First, allocate required objects */ + avc = anon_vma_chain_alloc(GFP_KERNEL); + if (!avc) + goto out_error; + anon_vma = anon_vma_alloc(); + if (!anon_vma) + goto out_error_free_avc; + /* - * First, attach the new VMA to the parent VMA's anon_vmas, + * Then attach the new VMA to the parent VMA's anon_vmas, * so rmap can find non-COWed pages in child processes. */ if (anon_vma_clone(vma, pvma)) - return -ENOMEM; - - /* Then add our own anon_vma. */ - anon_vma = anon_vma_alloc(); - if (!anon_vma) - goto out_error; - avc = anon_vma_chain_alloc(GFP_KERNEL); - if (!avc) goto out_error_free_anon_vma; /* @@ -312,10 +312,11 @@ int anon_vma_fork(struct vm_area_struct *vma, struct vm_area_struct *pvma) return 0; - out_error_free_anon_vma: +out_error_free_anon_vma: put_anon_vma(anon_vma); - out_error: - unlink_anon_vmas(vma); +out_error_free_avc: + anon_vma_chain_free(avc); +out_error: return -ENOMEM; } -- 1.7.9.5 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>