Merge tag 'amd-drm-fixes-5.9-2020-08-20' of git://people.freedesktop.org/~agd5f/linux...
[linux-2.6-microblaze.git] / mm / mremap.c
index 6b153dc..138abba 100644 (file)
@@ -193,17 +193,12 @@ static void move_ptes(struct vm_area_struct *vma, pmd_t *old_pmd,
 
 #ifdef CONFIG_HAVE_MOVE_PMD
 static bool move_normal_pmd(struct vm_area_struct *vma, unsigned long old_addr,
-                 unsigned long new_addr, unsigned long old_end,
-                 pmd_t *old_pmd, pmd_t *new_pmd)
+                 unsigned long new_addr, pmd_t *old_pmd, pmd_t *new_pmd)
 {
        spinlock_t *old_ptl, *new_ptl;
        struct mm_struct *mm = vma->vm_mm;
        pmd_t pmd;
 
-       if ((old_addr & ~PMD_MASK) || (new_addr & ~PMD_MASK)
-           || old_end - old_addr < PMD_SIZE)
-               return false;
-
        /*
         * The destination pmd shouldn't be established, free_pgtables()
         * should have released it.
@@ -279,6 +274,9 @@ unsigned long move_page_tables(struct vm_area_struct *vma,
                extent = next - old_addr;
                if (extent > old_end - old_addr)
                        extent = old_end - old_addr;
+               next = (new_addr + PMD_SIZE) & PMD_MASK;
+               if (extent > next - new_addr)
+                       extent = next - new_addr;
                old_pmd = get_old_pmd(vma->vm_mm, old_addr);
                if (!old_pmd)
                        continue;
@@ -292,7 +290,7 @@ unsigned long move_page_tables(struct vm_area_struct *vma,
                                if (need_rmap_locks)
                                        take_rmap_locks(vma);
                                moved = move_huge_pmd(vma, old_addr, new_addr,
-                                                   old_end, old_pmd, new_pmd);
+                                                     old_pmd, new_pmd);
                                if (need_rmap_locks)
                                        drop_rmap_locks(vma);
                                if (moved)
@@ -312,7 +310,7 @@ unsigned long move_page_tables(struct vm_area_struct *vma,
                        if (need_rmap_locks)
                                take_rmap_locks(vma);
                        moved = move_normal_pmd(vma, old_addr, new_addr,
-                                       old_end, old_pmd, new_pmd);
+                                               old_pmd, new_pmd);
                        if (need_rmap_locks)
                                drop_rmap_locks(vma);
                        if (moved)
@@ -322,9 +320,6 @@ unsigned long move_page_tables(struct vm_area_struct *vma,
 
                if (pte_alloc(new_vma->vm_mm, new_pmd))
                        break;
-               next = (new_addr + PMD_SIZE) & PMD_MASK;
-               if (extent > next - new_addr)
-                       extent = next - new_addr;
                move_ptes(vma, old_pmd, old_addr, old_addr + extent, new_vma,
                          new_pmd, new_addr, need_rmap_locks);
        }