]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - mm/z3fold.c
mm/z3fold.c: reinitialize zhdr structs after migration
[linux.git] / mm / z3fold.c
index 70008a8fed95fc3b26afe2063ee4629aae47f1fe..6c72b18d8b9cbc9534fd008c16aca33ba539598f 100644 (file)
@@ -1357,12 +1357,22 @@ static int z3fold_page_migrate(struct address_space *mapping, struct page *newpa
                z3fold_page_unlock(zhdr);
                return -EBUSY;
        }
+       if (work_pending(&zhdr->work)) {
+               z3fold_page_unlock(zhdr);
+               return -EAGAIN;
+       }
        new_zhdr = page_address(newpage);
        memcpy(new_zhdr, zhdr, PAGE_SIZE);
        newpage->private = page->private;
        page->private = 0;
        z3fold_page_unlock(zhdr);
        spin_lock_init(&new_zhdr->page_lock);
+       INIT_WORK(&new_zhdr->work, compact_page_work);
+       /*
+        * z3fold_page_isolate() ensures that new_zhdr->buddy is empty,
+        * so we only have to reinitialize it.
+        */
+       INIT_LIST_HEAD(&new_zhdr->buddy);
        new_mapping = page_mapping(page);
        __ClearPageMovable(page);
        ClearPagePrivate(page);