summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mm/z3fold.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/mm/z3fold.c b/mm/z3fold.c
index 70008a8fed95..6c72b18d8b9c 100644
--- a/mm/z3fold.c
+++ b/mm/z3fold.c
@@ -1357,12 +1357,22 @@ static int z3fold_page_migrate(struct address_space *mapping, struct page *newpa
1357 z3fold_page_unlock(zhdr); 1357 z3fold_page_unlock(zhdr);
1358 return -EBUSY; 1358 return -EBUSY;
1359 } 1359 }
1360 if (work_pending(&zhdr->work)) {
1361 z3fold_page_unlock(zhdr);
1362 return -EAGAIN;
1363 }
1360 new_zhdr = page_address(newpage); 1364 new_zhdr = page_address(newpage);
1361 memcpy(new_zhdr, zhdr, PAGE_SIZE); 1365 memcpy(new_zhdr, zhdr, PAGE_SIZE);
1362 newpage->private = page->private; 1366 newpage->private = page->private;
1363 page->private = 0; 1367 page->private = 0;
1364 z3fold_page_unlock(zhdr); 1368 z3fold_page_unlock(zhdr);
1365 spin_lock_init(&new_zhdr->page_lock); 1369 spin_lock_init(&new_zhdr->page_lock);
1370 INIT_WORK(&new_zhdr->work, compact_page_work);
1371 /*
1372 * z3fold_page_isolate() ensures that new_zhdr->buddy is empty,
1373 * so we only have to reinitialize it.
1374 */
1375 INIT_LIST_HEAD(&new_zhdr->buddy);
1366 new_mapping = page_mapping(page); 1376 new_mapping = page_mapping(page);
1367 __ClearPageMovable(page); 1377 __ClearPageMovable(page);
1368 ClearPagePrivate(page); 1378 ClearPagePrivate(page);