Add isolate_folio_to_list() helper to try to isolate HugeTLB, no-LRU movable and LRU folios to a list, which will be reused by do_migrate_range() from memory hotplug soon. Signed-off-by: Kefeng Wang <wangkefeng.wang@xxxxxxxxxx> --- mm/internal.h | 2 ++ mm/memory-failure.c | 21 +-------------------- mm/migrate.c | 27 +++++++++++++++++++++++++++ 3 files changed, 30 insertions(+), 20 deletions(-) diff --git a/mm/internal.h b/mm/internal.h index c5bd24c4fa3a..2484191c0764 100644 --- a/mm/internal.h +++ b/mm/internal.h @@ -403,6 +403,8 @@ extern unsigned long highest_memmap_pfn; */ #define MAX_RECLAIM_RETRIES 16 +bool isolate_folio_to_list(struct folio *folio, struct list_head *list); + /* * in mm/vmscan.c: */ diff --git a/mm/memory-failure.c b/mm/memory-failure.c index 99d92565cbb0..7e0f143bd51a 100644 --- a/mm/memory-failure.c +++ b/mm/memory-failure.c @@ -2659,26 +2659,7 @@ EXPORT_SYMBOL(unpoison_memory); static bool mf_isolate_folio(struct folio *folio, struct list_head *pagelist) { - bool isolated = false; - - if (folio_test_hugetlb(folio)) { - isolated = isolate_hugetlb(folio, pagelist); - } else { - bool lru = !__folio_test_movable(folio); - - if (lru) - isolated = folio_isolate_lru(folio); - else - isolated = isolate_movable_page(&folio->page, - ISOLATE_UNEVICTABLE); - - if (isolated) { - list_add(&folio->lru, pagelist); - if (lru) - node_stat_add_folio(folio, NR_ISOLATED_ANON + - folio_is_file_lru(folio)); - } - } + bool isolated = isolate_folio_to_list(folio, pagelist); /* * If we succeed to isolate the folio, we grabbed another refcount on diff --git a/mm/migrate.c b/mm/migrate.c index e7296c0fb5d5..51cab1103502 100644 --- a/mm/migrate.c +++ b/mm/migrate.c @@ -177,6 +177,33 @@ void putback_movable_pages(struct list_head *l) } } +/* Must be called with an elevated refcount on the folio */ +bool isolate_folio_to_list(struct folio *folio, struct list_head *list) +{ + bool isolated = false; + + if (folio_test_hugetlb(folio)) { + isolated = isolate_hugetlb(folio, list); + } else { + bool lru = !__folio_test_movable(folio); + + if (lru) + isolated = folio_isolate_lru(folio); + else + isolated = isolate_movable_page(&folio->page, + ISOLATE_UNEVICTABLE); + + if (isolated) { + list_add(&folio->lru, list); + if (lru) + node_stat_add_folio(folio, NR_ISOLATED_ANON + + folio_is_file_lru(folio)); + } + } + + return isolated; +} + /* * Restore a potential migration pte to a working pte entry */ -- 2.27.0