Skip to contentSkip to conversation

mm/migrate: set swap entry values of THP tail pages properly.

PATCH In review Zi Yan 2 participants 2 messages Mar 5, 2024

Subsystems (2)
lore
Share & tools
lore

Zi Yan

author
#0 lore raw

PATCH 1/1 mm/migrate: set swap entry values of THP tail pages properly.

From: Zi Yan <[email protected]>

The tail pages in a THP can have swap entry information stored in their private field. When migrating to a new page, all tail pages of the new page need to update ->private to avoid future data corruption.

Corresponding swapcache entries need to be updated as well. e71769ae5260 ("mm: enable thp migration for shmem thp") fixed it already.

Fixes 616b8371539a ("mm: thp: enable thp migration in generic path")
---
 mm/migrate.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)
mm/migrate.c +5 -1
index 034b0662fd3b..9cfd53eaeb4e 100644
@@ -441,8 +441,12 @@ int migrate_page_move_mapping(struct address_space *mapping,
 	if (PageSwapBacked(page)) {
 		__SetPageSwapBacked(newpage);
 		if (PageSwapCache(page)) {
+			int i;
+
 			SetPageSwapCache(newpage);
-			set_page_private(newpage, page_private(page));
+			for (i = 0; i < (1 << compound_order(page)); i++)
+				set_page_private(newpage + i,
+						 page_private(page + i));
 		}
 	} else {
 		VM_BUG_ON_PAGE(PageSwapCache(page), page);
Signature · 1 line
2.43.0
Acked-by on v1 1/1
#1 lore raw
Quoted 24 lines · Zi Yan

From: Zi Yan <[email protected]>

The tail pages in a THP can have swap entry information stored in their private field. When migrating to a new page, all tail pages of the new page need to update ->private to avoid future data corruption.

Corresponding swapcache entries need to be updated as well. e71769ae5260 ("mm: enable thp migration for shmem thp") fixed it already.

Fixes 616b8371539a ("mm: thp: enable thp migration in generic path")
---
  mm/migrate.c | 6 +++++-
  1 file changed, 5 insertions(+), 1 deletion(-)
mm/migrate.c +0 -0
index 034b0662fd3b..9cfd53eaeb4e 100644
@@ -441,8 +441,12 @@ int migrate_page_move_mapping(struct address_space *mapping,
  	if (PageSwapBacked(page)) {
  		__SetPageSwapBacked(newpage);
  		if (PageSwapCache(page)) {

mm/migrate.c int migrate_page_move_mapping(struct address_space *mapping, · line 452

Quoted 10 lines
mm/migrate.c +5 -1
+			int i;
+
  			SetPageSwapCache(newpage);
-			set_page_private(newpage, page_private(page));
+			for (i = 0; i < (1 << compound_order(page)); i++)
+				set_page_private(newpage + i,
+						 page_private(page + i));
  		}
  	} else {
  		VM_BUG_ON_PAGE(PageSwapCache(page), page);
Signature · 3 lines
Cheers,

David / dhildenb