Merge tag 'asoc-v5.6' of https://git.kernel.org/pub/scm/linux/kernel/git/broonie...
[linux-2.6-microblaze.git] / mm / migrate.c
index eae1565..86873b6 100644 (file)
@@ -1512,9 +1512,11 @@ static int do_move_pages_to_node(struct mm_struct *mm,
 /*
  * Resolves the given address to a struct page, isolates it from the LRU and
  * puts it to the given pagelist.
- * Returns -errno if the page cannot be found/isolated or 0 when it has been
- * queued or the page doesn't need to be migrated because it is already on
- * the target node
+ * Returns:
+ *     errno - if the page cannot be found/isolated
+ *     0 - when it doesn't have to be migrated because it is already on the
+ *         target node
+ *     1 - when it has been queued
  */
 static int add_page_for_migration(struct mm_struct *mm, unsigned long addr,
                int node, struct list_head *pagelist, bool migrate_all)
@@ -1553,7 +1555,7 @@ static int add_page_for_migration(struct mm_struct *mm, unsigned long addr,
        if (PageHuge(page)) {
                if (PageHead(page)) {
                        isolate_huge_page(page, pagelist);
-                       err = 0;
+                       err = 1;
                }
        } else {
                struct page *head;
@@ -1563,7 +1565,7 @@ static int add_page_for_migration(struct mm_struct *mm, unsigned long addr,
                if (err)
                        goto out_putpage;
 
-               err = 0;
+               err = 1;
                list_add_tail(&head->lru, pagelist);
                mod_node_page_state(page_pgdat(head),
                        NR_ISOLATED_ANON + page_is_file_cache(head),
@@ -1640,8 +1642,17 @@ static int do_pages_move(struct mm_struct *mm, nodemask_t task_nodes,
                 */
                err = add_page_for_migration(mm, addr, current_node,
                                &pagelist, flags & MPOL_MF_MOVE_ALL);
-               if (!err)
+
+               if (!err) {
+                       /* The page is already on the target node */
+                       err = store_status(status, i, current_node, 1);
+                       if (err)
+                               goto out_flush;
                        continue;
+               } else if (err > 0) {
+                       /* The page is successfully queued for migration */
+                       continue;
+               }
 
                err = store_status(status, i, err, 1);
                if (err)