@@ -1374,6 +1374,8 @@ static inline int try_split_thp(struct page *page, struct list_head *split_pages
lock_page(page);
rc = split_huge_page_to_list(page, split_pages);
unlock_page(page);
+ if (!rc)
+ list_move_tail(&page->lru, split_pages);
return rc;
}
@@ -1433,7 +1435,6 @@ int migrate_pages(struct list_head *from, new_page_t get_new_page,
thp_retry = 0;
list_for_each_entry_safe(page, page2, from, lru) {
-retry:
/*
* THP statistics is based on the source huge page.
* Capture required information that might get lost
@@ -1469,10 +1470,9 @@ int migrate_pages(struct list_head *from, new_page_t get_new_page,
* retry on the same page with the THP split
* to base pages.
*
- * Head page is retried immediately and tail
- * pages are added to the tail of the list so
- * we encounter them after the rest of the list
- * is processed.
+ * Sub-pages are put in thp_split_pages, and
+ * we will migrate them after the rest of the
+ * list is processed.
*/
case -ENOSYS:
/* THP migration is unsupported */
@@ -1480,7 +1480,7 @@ int migrate_pages(struct list_head *from, new_page_t get_new_page,
nr_thp_failed++;
if (!try_split_thp(page, &thp_split_pages)) {
nr_thp_split++;
- goto retry;
+ break;
}
/* Hugetlb migration is unsupported */
} else if (!no_subpage_counting) {
@@ -1500,7 +1500,7 @@ int migrate_pages(struct list_head *from, new_page_t get_new_page,
/* THP NUMA faulting doesn't split THP to retry. */
if (!nosplit && !try_split_thp(page, &thp_split_pages)) {
nr_thp_split++;
- goto retry;
+ break;
}
} else if (!no_subpage_counting) {
nr_failed++;