diff options
author | Paul Gofman <pgofman@codeweavers.com> | 2024-01-25 15:16:03 -0600 |
---|---|---|
committer | Muhammad Usama Anjum <usama.anjum@collabora.com> | 2024-01-30 10:37:01 +0500 |
commit | de088dd5e287c1e20ddb3e3c20495a35df84464d (patch) | |
tree | c089f4c2ad5de04ee8b93701340283d30346e781 /mm | |
parent | 6b767b0cee32cb1d0fe708d21e9331ea06020cdd (diff) | |
download | linux-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>
Diffstat (limited to 'mm')
-rw-r--r-- | mm/migrate.c | 8 |
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)) |