Commit 715cbfd6 authored by Matthew Wilcox (Oracle)'s avatar Matthew Wilcox (Oracle)
Browse files

mm/migrate: Add folio_migrate_copy()



This is the folio equivalent of migrate_page_copy(), which is retained
as a wrapper for filesystems which are not yet converted to folios.
Also convert copy_huge_page() to folio_copy().

Signed-off-by: default avatarMatthew Wilcox (Oracle) <willy@infradead.org>
Reviewed-by: default avatarZi Yan <ziy@nvidia.com>
Acked-by: default avatarVlastimil Babka <vbabka@suse.cz>
parent 19138349
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -58,6 +58,7 @@ extern int migrate_huge_page_move_mapping(struct address_space *mapping,
extern int migrate_page_move_mapping(struct address_space *mapping,
		struct page *newpage, struct page *page, int extra_count);
void folio_migrate_flags(struct folio *newfolio, struct folio *folio);
void folio_migrate_copy(struct folio *newfolio, struct folio *folio);
int folio_migrate_mapping(struct address_space *mapping,
		struct folio *newfolio, struct folio *folio, int extra_count);
#else
+1 −1
Original line number Diff line number Diff line
@@ -912,7 +912,7 @@ void __put_page(struct page *page);
void put_pages_list(struct list_head *pages);

void split_page(struct page *page, unsigned int order);
void copy_huge_page(struct page *dst, struct page *src);
void folio_copy(struct folio *dst, struct folio *src);

/*
 * Compound pages have a destructor function.  Provide a
+6 −0
Original line number Diff line number Diff line
@@ -64,4 +64,10 @@ void migrate_page_states(struct page *newpage, struct page *page)
	folio_migrate_flags(page_folio(newpage), page_folio(page));
}
EXPORT_SYMBOL(migrate_page_states);

void migrate_page_copy(struct page *newpage, struct page *page)
{
	folio_migrate_copy(page_folio(newpage), page_folio(page));
}
EXPORT_SYMBOL(migrate_page_copy);
#endif
+1 −1
Original line number Diff line number Diff line
@@ -5302,7 +5302,7 @@ int hugetlb_mcopy_atomic_pte(struct mm_struct *dst_mm,
			*pagep = NULL;
			goto out;
		}
		copy_huge_page(page, *pagep);
		folio_copy(page_folio(page), page_folio(*pagep));
		put_page(*pagep);
		*pagep = NULL;
	}
+5 −9
Original line number Diff line number Diff line
@@ -614,16 +614,12 @@ void folio_migrate_flags(struct folio *newfolio, struct folio *folio)
}
EXPORT_SYMBOL(folio_migrate_flags);

void migrate_page_copy(struct page *newpage, struct page *page)
void folio_migrate_copy(struct folio *newfolio, struct folio *folio)
{
	if (PageHuge(page) || PageTransHuge(page))
		copy_huge_page(newpage, page);
	else
		copy_highpage(newpage, page);

	migrate_page_states(newpage, page);
	folio_copy(newfolio, folio);
	folio_migrate_flags(newfolio, folio);
}
EXPORT_SYMBOL(migrate_page_copy);
EXPORT_SYMBOL(folio_migrate_copy);

/************************************************************
 *                    Migration functions
@@ -651,7 +647,7 @@ int migrate_page(struct address_space *mapping,
		return rc;

	if (mode != MIGRATE_SYNC_NO_COPY)
		migrate_page_copy(newpage, page);
		folio_migrate_copy(newfolio, folio);
	else
		folio_migrate_flags(newfolio, folio);
	return MIGRATEPAGE_SUCCESS;
Loading