Re: [PATCH 1/3] mm, numa: rework do_pages_move

From: Christopher Lameter
Date: Fri Jan 05 2018 - 13:41:30 EST


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)