From: Naoya Horiguchi <n-horigu...@ah.jp.nec.com>

This patch enables thp migration for memory hotremove.

---
ChangeLog v1->v2:
- base code switched from alloc_migrate_target to new_node_page()

Signed-off-by: Naoya Horiguchi <n-horigu...@ah.jp.nec.com>

ChangeLog v2->v7:
- base code switched from new_node_page() new_page_nodemask()

Signed-off-by: Zi Yan <zi....@cs.rutgers.edu>
---
 include/linux/migrate.h | 15 ++++++++++++++-
 mm/memory_hotplug.c     |  4 +++-
 2 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/include/linux/migrate.h b/include/linux/migrate.h
index 67ca33665e83..ff1f76683ee6 100644
--- a/include/linux/migrate.h
+++ b/include/linux/migrate.h
@@ -35,16 +35,29 @@ static inline struct page *new_page_nodemask(struct page 
*page, int preferred_ni
                nodemask_t *nodemask)
 {
        gfp_t gfp_mask = GFP_USER | __GFP_MOVABLE | __GFP_RETRY_MAYFAIL;
+       unsigned int order = 0;
+       struct page *new_page = NULL;
 
        if (PageHuge(page))
                return 
alloc_huge_page_nodemask(page_hstate(compound_head(page)),
                                preferred_nid, nodemask);
 
+       if (thp_migration_supported() && PageTransHuge(page)) {
+               order = HPAGE_PMD_ORDER;
+               gfp_mask |= GFP_TRANSHUGE;
+       }
+
        if (PageHighMem(page)
            || (zone_idx(page_zone(page)) == ZONE_MOVABLE))
                gfp_mask |= __GFP_HIGHMEM;
 
-       return __alloc_pages_nodemask(gfp_mask, 0, preferred_nid, nodemask);
+       new_page = __alloc_pages_nodemask(gfp_mask, order,
+                               preferred_nid, nodemask);
+
+       if (new_page && PageTransHuge(page))
+               prep_transhuge_page(new_page);
+
+       return new_page;
 }
 
 #ifdef CONFIG_MIGRATION
diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
index 57b03be3a8da..72110ea2ee1b 100644
--- a/mm/memory_hotplug.c
+++ b/mm/memory_hotplug.c
@@ -1416,7 +1416,9 @@ do_migrate_range(unsigned long start_pfn, unsigned long 
end_pfn)
                        if (isolate_huge_page(page, &source))
                                move_pages -= 1 << compound_order(head);
                        continue;
-               }
+               } else if (thp_migration_supported() && PageTransHuge(page))
+                       pfn = page_to_pfn(compound_head(page))
+                               + hpage_nr_pages(page) - 1;
 
                if (!get_page_unless_zero(page))
                        continue;
-- 
2.11.0

Reply via email to