usb: dwc3: host: Set XHCI_SG_TRB_CACHE_SIZE_QUIRK
[platform/kernel/linux-starfive.git] / mm / migrate.c
index 3373fc1..b4d972d 100644 (file)
@@ -1026,38 +1026,31 @@ out:
 }
 
 /*
- * To record some information during migration, we use some unused
- * fields (mapping and private) of struct folio of the newly allocated
- * destination folio.  This is safe because nobody is using them
- * except us.
+ * To record some information during migration, we use unused private
+ * field of struct folio of the newly allocated destination folio.
+ * This is safe because nobody is using it except us.
  */
-union migration_ptr {
-       struct anon_vma *anon_vma;
-       struct address_space *mapping;
-};
-
 enum {
        PAGE_WAS_MAPPED = BIT(0),
        PAGE_WAS_MLOCKED = BIT(1),
+       PAGE_OLD_STATES = PAGE_WAS_MAPPED | PAGE_WAS_MLOCKED,
 };
 
 static void __migrate_folio_record(struct folio *dst,
-                                  unsigned long old_page_state,
+                                  int old_page_state,
                                   struct anon_vma *anon_vma)
 {
-       union migration_ptr ptr = { .anon_vma = anon_vma };
-       dst->mapping = ptr.mapping;
-       dst->private = (void *)old_page_state;
+       dst->private = (void *)anon_vma + old_page_state;
 }
 
 static void __migrate_folio_extract(struct folio *dst,
                                   int *old_page_state,
                                   struct anon_vma **anon_vmap)
 {
-       union migration_ptr ptr = { .mapping = dst->mapping };
-       *anon_vmap = ptr.anon_vma;
-       *old_page_state = (unsigned long)dst->private;
-       dst->mapping = NULL;
+       unsigned long private = (unsigned long)dst->private;
+
+       *anon_vmap = (struct anon_vma *)(private & ~PAGE_OLD_STATES);
+       *old_page_state = private & PAGE_OLD_STATES;
        dst->private = NULL;
 }