No function change is intended. The factored out code will be reused in an upcoming batched folio move function. Signed-off-by: Zi Yan <ziy@xxxxxxxxxx> --- mm/migrate.c | 101 +++++++++++++++++++++++++++++++++------------------ 1 file changed, 65 insertions(+), 36 deletions(-) diff --git a/mm/migrate.c b/mm/migrate.c index df1b615c8114..a83508f94c57 100644 --- a/mm/migrate.c +++ b/mm/migrate.c @@ -1014,18 +1014,7 @@ static int fallback_migrate_folio(struct address_space *mapping, return migrate_folio(mapping, dst, src, mode); } -/* - * Move a page to a newly allocated page - * The page is locked and all ptes have been successfully removed. - * - * The new page will have replaced the old page if this function - * is successful. - * - * Return value: - * < 0 - error code - * MIGRATEPAGE_SUCCESS - success - */ -static int move_to_new_folio(struct folio *dst, struct folio *src, +static int _move_to_new_folio_prep(struct folio *dst, struct folio *src, enum migrate_mode mode) { int rc = -EAGAIN; @@ -1072,7 +1061,13 @@ static int move_to_new_folio(struct folio *dst, struct folio *src, WARN_ON_ONCE(rc == MIGRATEPAGE_SUCCESS && !folio_test_isolated(src)); } +out: + return rc; +} +static void _move_to_new_folio_finalize(struct folio *dst, struct folio *src, + int rc) +{ /* * When successful, old pagecache src->mapping must be cleared before * src is freed; but stats require that PageAnon be left as PageAnon. @@ -1099,7 +1094,29 @@ static int move_to_new_folio(struct folio *dst, struct folio *src, if (likely(!folio_is_zone_device(dst))) flush_dcache_folio(dst); } -out: +} + + +/* + * Move a page to a newly allocated page + * The page is locked and all ptes have been successfully removed. + * + * The new page will have replaced the old page if this function + * is successful. + * + * Return value: + * < 0 - error code + * MIGRATEPAGE_SUCCESS - success + */ +static int move_to_new_folio(struct folio *dst, struct folio *src, + enum migrate_mode mode) +{ + int rc; + + rc = _move_to_new_folio_prep(dst, src, mode); + + _move_to_new_folio_finalize(dst, src, rc); + return rc; } @@ -1344,29 +1361,9 @@ static int migrate_folio_unmap(new_folio_t get_new_folio, return rc; } -/* Migrate the folio to the newly allocated folio in dst. */ -static int migrate_folio_move(free_folio_t put_new_folio, unsigned long private, - struct folio *src, struct folio *dst, - enum migrate_mode mode, enum migrate_reason reason, - struct list_head *ret) +static void _migrate_folio_move_finalize1(struct folio *src, struct folio *dst, + int old_page_state) { - int rc; - int old_page_state = 0; - struct anon_vma *anon_vma = NULL; - bool is_lru = !__folio_test_movable(src); - struct list_head *prev; - - __migrate_folio_extract(dst, &old_page_state, &anon_vma); - prev = dst->lru.prev; - list_del(&dst->lru); - - rc = move_to_new_folio(dst, src, mode); - if (rc) - goto out; - - if (unlikely(!is_lru)) - goto out_unlock_both; - /* * When successful, push dst to LRU immediately: so that if it * turns out to be an mlocked page, remove_migration_ptes() will @@ -1382,8 +1379,12 @@ static int migrate_folio_move(free_folio_t put_new_folio, unsigned long private, if (old_page_state & PAGE_WAS_MAPPED) remove_migration_ptes(src, dst, 0); +} -out_unlock_both: +static void _migrate_folio_move_finalize2(struct folio *src, struct folio *dst, + enum migrate_reason reason, + struct anon_vma *anon_vma) +{ folio_unlock(dst); set_page_owner_migrate_reason(&dst->page, reason); /* @@ -1403,6 +1404,34 @@ static int migrate_folio_move(free_folio_t put_new_folio, unsigned long private, put_anon_vma(anon_vma); folio_unlock(src); migrate_folio_done(src, reason); +} + +/* Migrate the folio to the newly allocated folio in dst. */ +static int migrate_folio_move(free_folio_t put_new_folio, unsigned long private, + struct folio *src, struct folio *dst, + enum migrate_mode mode, enum migrate_reason reason, + struct list_head *ret) +{ + int rc; + int old_page_state = 0; + struct anon_vma *anon_vma = NULL; + bool is_lru = !__folio_test_movable(src); + struct list_head *prev; + + __migrate_folio_extract(dst, &old_page_state, &anon_vma); + prev = dst->lru.prev; + list_del(&dst->lru); + + rc = move_to_new_folio(dst, src, mode); + if (rc) + goto out; + + if (unlikely(!is_lru)) + goto out_unlock_both; + + _migrate_folio_move_finalize1(src, dst, old_page_state); +out_unlock_both: + _migrate_folio_move_finalize2(src, dst, reason, anon_vma); return rc; out: -- 2.45.2