Commit 61acad15 authored by Tong Tiangen's avatar Tong Tiangen
Browse files

mm/migration: do not folio copy in MIGRATE_SYNC_NO_COPY mode

hulk inclusion
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/IASFAM



--------------------------------

During page migration, if MIGRATE_SYNC_NO_COPY mode is used, the page
content should not be migrated.

This patch fix it.

Fixes: 374fe8ea ("fs: hugetlbfs: support poisoned recover from hugetlbfs_migrate_folio()")
Fixes: 1d263184 ("mm: migrate: support poisoned recover from migrate folio")
Signed-off-by: default avatarTong Tiangen <tongtiangen@huawei.com>
parent 497bb858
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -1146,7 +1146,7 @@ static int hugetlbfs_migrate_folio(struct address_space *mapping,
{
	int rc;

	rc = migrate_huge_page_move_mapping(mapping, dst, src);
	rc = migrate_huge_page_move_mapping(mapping, dst, src, mode);
	if (rc != MIGRATEPAGE_SUCCESS)
		return rc;

+2 −2
Original line number Diff line number Diff line
@@ -72,7 +72,7 @@ struct folio *alloc_migration_target(struct folio *src, unsigned long private);
bool isolate_movable_page(struct page *page, isolate_mode_t mode);

int migrate_huge_page_move_mapping(struct address_space *mapping,
		struct folio *dst, struct folio *src);
		struct folio *dst, struct folio *src, enum migrate_mode mode);
void migration_entry_wait_on_locked(swp_entry_t entry, spinlock_t *ptl)
		__releases(ptl);
void folio_migrate_flags(struct folio *newfolio, struct folio *folio);
@@ -94,7 +94,7 @@ static inline bool isolate_movable_page(struct page *page, isolate_mode_t mode)
	{ return false; }

static inline int migrate_huge_page_move_mapping(struct address_space *mapping,
				  struct folio *dst, struct folio *src)
		struct folio *dst, struct folio *src, enum migrate_mode mode)
{
	return -ENOSYS;
}
+16 −10
Original line number Diff line number Diff line
@@ -544,20 +544,30 @@ int folio_migrate_mapping(struct address_space *mapping,
}
EXPORT_SYMBOL(folio_migrate_mapping);

static int folio_migrate_mc_copy(struct folio *dst, struct folio *src,
				 enum migrate_mode mode, int expected_count)
{
	/* Check whether src does not have extra refs before we do more work */
	if (folio_ref_count(src) != expected_count)
		return -EAGAIN;

	if (mode == MIGRATE_SYNC_NO_COPY)
		return 0;

	return folio_mc_copy(dst, src);
}

/*
 * The expected number of remaining references is the same as that
 * of folio_migrate_mapping().
 */
int migrate_huge_page_move_mapping(struct address_space *mapping,
				   struct folio *dst, struct folio *src)
		struct folio *dst, struct folio *src, enum migrate_mode mode)
{
	XA_STATE(xas, &mapping->i_pages, folio_index(src));
	int rc, expected_count = folio_expected_refs(mapping, src);

	if (folio_ref_count(src) != expected_count)
		return -EAGAIN;

	rc = folio_mc_copy(dst, src);
	rc = folio_migrate_mc_copy(dst, src, mode, expected_count);
	if (unlikely(rc))
		return rc;

@@ -691,11 +701,7 @@ static int __migrate_folio(struct address_space *mapping, struct folio *dst,
{
	int rc, expected_count = folio_expected_refs(mapping, src);

	/* Check whether src does not have extra refs before we do more work */
	if (folio_ref_count(src) != expected_count)
		return -EAGAIN;

	rc = folio_mc_copy(dst, src);
	rc = folio_migrate_mc_copy(dst, src, mode, expected_count);
	if (unlikely(rc))
		return rc;