summaryrefslogtreecommitdiff
path: root/mm/migrate.c
diff options
context:
space:
mode:
authorAndrew Morton <akpm@linux-foundation.org>2024-07-06 11:44:41 -0700
committerAndrew Morton <akpm@linux-foundation.org>2024-07-06 11:44:41 -0700
commit8ef6fd0e9ea83a792ba53882ddc6e0d38ce0d636 (patch)
treeb119eaeb76c7afb8672d30078ab7061cb7be67fb /mm/migrate.c
parent44195d1eba826a8af0afbcfa69ab4cc26f6ead7f (diff)
parent1e3d28fe03cdac1f58402e4da1e1e59fb70d145f (diff)
downloadlinux-8ef6fd0e9ea83a792ba53882ddc6e0d38ce0d636.tar.gz
linux-8ef6fd0e9ea83a792ba53882ddc6e0d38ce0d636.tar.bz2
linux-8ef6fd0e9ea83a792ba53882ddc6e0d38ce0d636.zip
Merge branch 'mm-hotfixes-stable' into mm-stable to pick up "mm: fix
crashes from deferred split racing folio migration", needed by "mm: migrate: split folio_migrate_mapping()".
Diffstat (limited to 'mm/migrate.c')
-rw-r--r--mm/migrate.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/mm/migrate.c b/mm/migrate.c
index e3eb22595ced..9a1c5b4a3f99 100644
--- a/mm/migrate.c
+++ b/mm/migrate.c
@@ -415,6 +415,15 @@ int folio_migrate_mapping(struct address_space *mapping,
if (folio_ref_count(folio) != expected_count)
return -EAGAIN;
+ /* Take off deferred split queue while frozen and memcg set */
+ if (folio_test_large(folio) &&
+ folio_test_large_rmappable(folio)) {
+ if (!folio_ref_freeze(folio, expected_count))
+ return -EAGAIN;
+ folio_undo_large_rmappable(folio);
+ folio_ref_unfreeze(folio, expected_count);
+ }
+
/* No turning back from here */
newfolio->index = folio->index;
newfolio->mapping = folio->mapping;
@@ -433,6 +442,10 @@ int folio_migrate_mapping(struct address_space *mapping,
return -EAGAIN;
}
+ /* Take off deferred split queue while frozen and memcg set */
+ if (folio_test_large(folio) && folio_test_large_rmappable(folio))
+ folio_undo_large_rmappable(folio);
+
/*
* Now we know that no one else is looking at the folio:
* no turning back from here.