mm, thp, migrate: handling migration of 64KB hugepages
[platform/kernel/linux-rpi.git] / mm / migrate.c
index b366006..56f63d9 100644 (file)
@@ -230,6 +230,13 @@ static bool remove_migration_pte(struct page *page, struct vm_area_struct *vma,
                        remove_migration_pmd(&pvmw, new);
                        continue;
                }
+#ifdef CONFIG_FINEGRAINED_THP
+               if (PageTransHuge(page) && pte_cont(*pvmw.pte)) {
+                       VM_BUG_ON_PAGE(PageHuge(page) || !PageTransCompound(page), page);
+                       remove_migration_huge_pte(&pvmw, new);
+                       continue;
+               }
+#endif /* CONFIG_FINEGRAINED_THP */
 #endif
 
                get_page(new);
@@ -266,16 +273,6 @@ static bool remove_migration_pte(struct page *page, struct vm_area_struct *vma,
                                page_dup_rmap(new, true);
                } else
 #endif
-#ifdef CONFIG_FINEGRAINED_THP
-               if (PageTransHuge(new)) {
-                       pte = pte_mkcont(pte_mkhuge(pte));
-                       arch_set_huge_pte_at(vma->vm_mm, pvmw.address, pvmw.pte, pte, 0);
-                       if (PageAnon(new))
-                               page_add_anon_rmap(new, vma, pvmw.address, true);
-                       else
-                               page_dup_rmap(new, true);
-               } else
-#endif /* CONFIG_FINEGRAINED_THP */
                {
                        set_pte_at(vma->vm_mm, pvmw.address, pvmw.pte, pte);