Messages in this thread Patch in this message | | | Date | Fri, 5 Jan 2018 12:41:22 -0600 (CST) | From | Christopher Lameter <> | Subject | Re: [PATCH 1/3] mm, numa: rework do_pages_move |
| |
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)
| |