ksm: cleanup: introduce find_mergeable_vma()
authorBob Liu <lliubbo@gmail.com>
Wed, 21 Mar 2012 23:34:11 +0000 (16:34 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 22 Mar 2012 00:54:59 +0000 (17:54 -0700)
There are multiple places which perform the same check.  Add a new
find_mergeable_vma() to handle this.

Signed-off-by: Bob Liu <lliubbo@gmail.com>
Acked-by: Hugh Dickins <hughd@google.com>
Cc: Andrea Arcangeli <aarcange@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
mm/ksm.c

index a6d3fb7e6c10576eb6f075a61ebf43535da2ce53..47c885368890741407eb45e8699acb12fc773aca 100644 (file)
--- a/mm/ksm.c
+++ b/mm/ksm.c
@@ -374,6 +374,20 @@ static int break_ksm(struct vm_area_struct *vma, unsigned long addr)
        return (ret & VM_FAULT_OOM) ? -ENOMEM : 0;
 }
 
+static struct vm_area_struct *find_mergeable_vma(struct mm_struct *mm,
+               unsigned long addr)
+{
+       struct vm_area_struct *vma;
+       if (ksm_test_exit(mm))
+               return NULL;
+       vma = find_vma(mm, addr);
+       if (!vma || vma->vm_start > addr)
+               return NULL;
+       if (!(vma->vm_flags & VM_MERGEABLE) || !vma->anon_vma)
+               return NULL;
+       return vma;
+}
+
 static void break_cow(struct rmap_item *rmap_item)
 {
        struct mm_struct *mm = rmap_item->mm;
@@ -387,15 +401,9 @@ static void break_cow(struct rmap_item *rmap_item)
        put_anon_vma(rmap_item->anon_vma);
 
        down_read(&mm->mmap_sem);
-       if (ksm_test_exit(mm))
-               goto out;
-       vma = find_vma(mm, addr);
-       if (!vma || vma->vm_start > addr)
-               goto out;
-       if (!(vma->vm_flags & VM_MERGEABLE) || !vma->anon_vma)
-               goto out;
-       break_ksm(vma, addr);
-out:
+       vma = find_mergeable_vma(mm, addr);
+       if (vma)
+               break_ksm(vma, addr);
        up_read(&mm->mmap_sem);
 }
 
@@ -421,12 +429,8 @@ static struct page *get_mergeable_page(struct rmap_item *rmap_item)
        struct page *page;
 
        down_read(&mm->mmap_sem);
-       if (ksm_test_exit(mm))
-               goto out;
-       vma = find_vma(mm, addr);
-       if (!vma || vma->vm_start > addr)
-               goto out;
-       if (!(vma->vm_flags & VM_MERGEABLE) || !vma->anon_vma)
+       vma = find_mergeable_vma(mm, addr);
+       if (!vma)
                goto out;
 
        page = follow_page(vma, addr, FOLL_GET);