|
@@ -1092,7 +1092,11 @@ static struct page *new_page_node(struct page *p, unsigned long private,
|
|
|
|
|
|
*result = &pm->status;
|
|
|
|
|
|
- return alloc_pages_exact_node(pm->node,
|
|
|
+ if (PageHuge(p))
|
|
|
+ return alloc_huge_page_node(page_hstate(compound_head(p)),
|
|
|
+ pm->node);
|
|
|
+ else
|
|
|
+ return alloc_pages_exact_node(pm->node,
|
|
|
GFP_HIGHUSER_MOVABLE | GFP_THISNODE, 0);
|
|
|
}
|
|
|
|
|
@@ -1152,6 +1156,11 @@ static int do_move_page_to_node_array(struct mm_struct *mm,
|
|
|
!migrate_all)
|
|
|
goto put_and_set;
|
|
|
|
|
|
+ if (PageHuge(page)) {
|
|
|
+ isolate_huge_page(page, &pagelist);
|
|
|
+ goto put_and_set;
|
|
|
+ }
|
|
|
+
|
|
|
err = isolate_lru_page(page);
|
|
|
if (!err) {
|
|
|
list_add_tail(&page->lru, &pagelist);
|
|
@@ -1174,7 +1183,7 @@ set_status:
|
|
|
err = migrate_pages(&pagelist, new_page_node,
|
|
|
(unsigned long)pm, MIGRATE_SYNC, MR_SYSCALL);
|
|
|
if (err)
|
|
|
- putback_lru_pages(&pagelist);
|
|
|
+ putback_movable_pages(&pagelist);
|
|
|
}
|
|
|
|
|
|
up_read(&mm->mmap_sem);
|