]> git.baikalelectronics.ru Git - kernel.git/commitdiff
mm/migrate.c: unify "not queued for migration" handling in do_pages_move()
authorWei Yang <richardw.yang@linux.intel.com>
Tue, 7 Apr 2020 03:04:18 +0000 (20:04 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 7 Apr 2020 17:43:38 +0000 (10:43 -0700)
It can currently happen that we store the status of a page twice:
* Once we detect that it is already on the target node
* Once we moved a bunch of pages, and a page that's already on the
  target node is contained in the current interval.

Let's simplify the code and always call do_move_pages_to_node() in case we
did not queue a page for migration.  Note that pages that are already on
the target node are not added to the pagelist and are, therefore, ignored
by do_move_pages_to_node() - there is no functional change.

The status of such a page is now only stored once.

[david@redhat.com rephrase changelog]
Signed-off-by: Wei Yang <richardw.yang@linux.intel.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Reviewed-by: David Hildenbrand <david@redhat.com>
Acked-by: Michal Hocko <mhocko@suse.com>
Link: http://lkml.kernel.org/r/20200214003017.25558-5-richardw.yang@linux.intel.com
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
mm/migrate.c

index 80eaa99bed398890d8f27048031576f407bc6cb5..c550230664b1e9a8a45e074de1ff5fe2a7c871e1 100644 (file)
@@ -1683,18 +1683,16 @@ 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) {
-                       /* 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) {
+               if (err > 0) {
                        /* The page is successfully queued for migration */
                        continue;
                }
 
-               err = store_status(status, i, err, 1);
+               /*
+                * If the page is already on the target node (!err), store the
+                * node, otherwise, store the err.
+                */
+               err = store_status(status, i, err ? : current_node, 1);
                if (err)
                        goto out_flush;