summary refs log tree commit diff
diff options
context:
space:
mode:
authorPaul Gofman <pgofman@codeweavers.com>2024-01-25 15:16:03 -0600
committerMuhammad Usama Anjum <usama.anjum@collabora.com>2024-01-30 10:37:01 +0500
commitde088dd5e287c1e20ddb3e3c20495a35df84464d (patch)
treec089f4c2ad5de04ee8b93701340283d30346e781
parent6b767b0cee32cb1d0fe708d21e9331ea06020cdd (diff)
downloadlinux-de088dd5e287c1e20ddb3e3c20495a35df84464d.tar.gz
mm/migrate: preserve soft dirty clear state in remove_migration_pte().
There is a bug in POC patches in mm-soft-dirty-file branch which occurs
during memory compaction.

Details: https://gitlab.steamos.cloud/jupiter/tasks/-/issues/1013

Signed-off-by: Paul Gofman <pgofman@codeweavers.com>
Signed-off-by: Muhammad Usama Anjum <usama.anjum@collabora.com>
-rw-r--r--mm/migrate.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/mm/migrate.c b/mm/migrate.c
index 8d5c0dc618a5..1a5a32a2cb62 100644
--- a/mm/migrate.c
+++ b/mm/migrate.c
@@ -200,8 +200,6 @@ static bool remove_migration_pte(struct folio *folio,
 
 		folio_get(folio);
 		pte = mk_pte(new, READ_ONCE(vma->vm_page_prot));
-		if (pte_swp_soft_dirty(*pvmw.pte))
-			pte = pte_mksoft_dirty(pte);
 
 		/*
 		 * Recheck VMA as permissions can change since migration started
@@ -211,6 +209,12 @@ static bool remove_migration_pte(struct folio *folio,
 			pte = pte_mkold(pte);
 		if (folio_test_dirty(folio) && is_migration_entry_dirty(entry))
 			pte = pte_mkdirty(pte);
+
+		if (pte_swp_soft_dirty(*pvmw.pte))
+			pte = pte_mksoft_dirty(pte);
+		else
+			pte = pte_clear_soft_dirty(pte);
+
 		if (is_writable_migration_entry(entry))
 			pte = maybe_mkwrite(pte, vma);
 		else if (pte_swp_uffd_wp(*pvmw.pte))