Move MADV_MERGEABLE part of ksm_madvise() into a dedicated helper since
it will be further used for marking VMAs to be merged forcibly.

This does not bring any functional changes.

Signed-off-by: Oleksandr Natalenko <[email protected]>
---
 include/linux/ksm.h |  2 ++
 mm/ksm.c            | 60 +++++++++++++++++++++++++++------------------
 2 files changed, 38 insertions(+), 24 deletions(-)

diff --git a/include/linux/ksm.h b/include/linux/ksm.h
index e48b1e453ff5..e824b3141677 100644
--- a/include/linux/ksm.h
+++ b/include/linux/ksm.h
@@ -19,6 +19,8 @@ struct stable_node;
 struct mem_cgroup;
 
 #ifdef CONFIG_KSM
+int ksm_madvise_merge(struct mm_struct *mm, struct vm_area_struct *vma,
+               unsigned long *vm_flags);
 int ksm_madvise(struct vm_area_struct *vma, unsigned long start,
                unsigned long end, int advice, unsigned long *vm_flags);
 int __ksm_enter(struct mm_struct *mm);
diff --git a/mm/ksm.c b/mm/ksm.c
index fc64874dc6f4..1fdcf2fbd58d 100644
--- a/mm/ksm.c
+++ b/mm/ksm.c
@@ -2442,41 +2442,53 @@ static int ksm_scan_thread(void *nothing)
        return 0;
 }
 
-int ksm_madvise(struct vm_area_struct *vma, unsigned long start,
-               unsigned long end, int advice, unsigned long *vm_flags)
+int ksm_madvise_merge(struct mm_struct *mm, struct vm_area_struct *vma,
+               unsigned long *vm_flags)
 {
-       struct mm_struct *mm = vma->vm_mm;
        int err;
 
-       switch (advice) {
-       case MADV_MERGEABLE:
-               /*
-                * Be somewhat over-protective for now!
-                */
-               if (*vm_flags & (VM_MERGEABLE | VM_SHARED  | VM_MAYSHARE   |
-                                VM_PFNMAP    | VM_IO      | VM_DONTEXPAND |
-                                VM_HUGETLB | VM_MIXEDMAP))
-                       return 0;               /* just ignore the advice */
+       /*
+        * Be somewhat over-protective for now!
+        */
+       if (*vm_flags & (VM_MERGEABLE | VM_SHARED  | VM_MAYSHARE   |
+                        VM_PFNMAP    | VM_IO      | VM_DONTEXPAND |
+                        VM_HUGETLB | VM_MIXEDMAP))
+               return 0;               /* just ignore the advice */
 
-               if (vma_is_dax(vma))
-                       return 0;
+       if (vma_is_dax(vma))
+               return 0;
 
 #ifdef VM_SAO
-               if (*vm_flags & VM_SAO)
-                       return 0;
+       if (*vm_flags & VM_SAO)
+               return 0;
 #endif
 #ifdef VM_SPARC_ADI
-               if (*vm_flags & VM_SPARC_ADI)
-                       return 0;
+       if (*vm_flags & VM_SPARC_ADI)
+               return 0;
 #endif
 
-               if (!test_bit(MMF_VM_MERGEABLE, &mm->flags)) {
-                       err = __ksm_enter(mm);
-                       if (err)
-                               return err;
-               }
+       if (!test_bit(MMF_VM_MERGEABLE, &mm->flags)) {
+               err = __ksm_enter(mm);
+               if (err)
+                       return err;
+       }
+
+       *vm_flags |= VM_MERGEABLE;
+
+       return 0;
+}
 
-               *vm_flags |= VM_MERGEABLE;
+int ksm_madvise(struct vm_area_struct *vma, unsigned long start,
+               unsigned long end, int advice, unsigned long *vm_flags)
+{
+       struct mm_struct *mm = vma->vm_mm;
+       int err;
+
+       switch (advice) {
+       case MADV_MERGEABLE:
+               err = ksm_madvise_merge(mm, vma, vm_flags);
+               if (err)
+                       return err;
                break;
 
        case MADV_UNMERGEABLE:
-- 
2.21.0

Reply via email to