On Fri, 5 Jan 2018, Michal Hocko wrote:

> I believe there should be some cap on the number of pages. We shouldn't
> keep it held for million of pages if all of them are moved to the same
> node. I would really like to postpone that to later unless it causes
> some noticeable regressions because this would complicate the code
> further and I am not sure this is all worth it.

Attached a patch to make the code more readable.

Also why are you migrating the pages on pagelist if a
add_page_for_migration() fails? One could simply update
the status in user space and continue.


Index: linux/mm/migrate.c
===================================================================
--- linux.orig/mm/migrate.c
+++ linux/mm/migrate.c
@@ -1584,16 +1584,20 @@ static int do_pages_move(struct mm_struc
                if (!node_isset(node, task_nodes))
                        goto out_flush;

-               if (current_node == NUMA_NO_NODE) {
-                       current_node = node;
-                       start = i;
-               } else if (node != current_node) {
-                       err = do_move_pages_to_node(mm, &pagelist, 
current_node);
-                       if (err)
-                               goto out;
-                       err = store_status(status, start, current_node, i - 
start);
-                       if (err)
-                               goto out;
+               if (node != current_node) {
+
+                       if (current_node != NUMA_NO_NODE) {
+
+                               /* Move the pages to current_node */
+                               err = do_move_pages_to_node(mm, &pagelist, 
current_node);
+                               if (err)
+                                       goto out;
+
+                               err = store_status(status, start, current_node, 
i - start);
+                               if (err)
+                                       goto out;
+                       }
+
                        start = i;
                        current_node = node;
                }
@@ -1607,6 +1611,10 @@ static int do_pages_move(struct mm_struc
                if (!err)
                        continue;

+               /*
+                * Failure to isolate a page so flush the pages on
+                * pagelist after storing status and continue.
+                */
                err = store_status(status, i, err, 1);
                if (err)
                        goto out_flush;
@@ -1614,6 +1622,7 @@ static int do_pages_move(struct mm_struc
                err = do_move_pages_to_node(mm, &pagelist, current_node);
                if (err)
                        goto out;
+
                if (i > start) {
                        err = store_status(status, start, current_node, i - 
start);
                        if (err)

Reply via email to