if (!page_mapped(page))
                rc = move_to_new_page(newpage, page, mode);
 
+       /*
+        * When successful, push newpage to LRU immediately: so that if it
+        * turns out to be an mlocked page, remove_migration_ptes() will
+        * automatically build up the correct newpage->mlock_count for it.
+        *
+        * We would like to do something similar for the old page, when
+        * unsuccessful, and other cases when a page has been temporarily
+        * isolated from the unevictable LRU: but this case is the easiest.
+        */
+       if (rc == MIGRATEPAGE_SUCCESS) {
+               lru_cache_add(newpage);
+               if (page_was_mapped)
+                       lru_add_drain();
+       }
+
        if (page_was_mapped)
                remove_migration_ptes(page,
                        rc == MIGRATEPAGE_SUCCESS ? newpage : page, false);
        unlock_page(page);
 out:
        /*
-        * If migration is successful, decrease refcount of the newpage
+        * If migration is successful, decrease refcount of the newpage,
         * which will not free the page because new page owner increased
-        * refcounter. As well, if it is LRU page, add the page to LRU
-        * list in here. Use the old state of the isolated source page to
-        * determine if we migrated a LRU page. newpage was already unlocked
-        * and possibly modified by its owner - don't rely on the page
-        * state.
+        * refcounter.
         */
-       if (rc == MIGRATEPAGE_SUCCESS) {
-               if (unlikely(!is_lru))
-                       put_page(newpage);
-               else
-                       putback_lru_page(newpage);
-       }
+       if (rc == MIGRATEPAGE_SUCCESS)
+               put_page(newpage);
 
        return rc;
 }