diff --git a/mm/mempolicy.c b/mm/mempolicy.c index f563fa3..b76b49a 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c @@ -1012,6 +1012,24 @@ int do_migrate_pages(struct mm_struct *mm, int dest = 0; for_each_node_mask(s, tmp) { + + /* + * IFF there is an equal number of source and + * destination nodes, maintain relative node distance + * even when source and destination nodes overlap. + * However, when the node weight is unequal/there are + * a different number of source and destination nodes, + * never move memory out of a source node that is also + * a destination node. + * + * Example: [2,3,4] -> [3,4,5] moves everything. + * [0-7] - > [3,4,5] moves only 0,1,2,6,7. + */ + + if ((nodes_weight(*from_nodes) != nodes_weight(*to_nodes)) && + (node_isset(s, *to_nodes))) + continue; + d = node_remap(s, *from_nodes, *to_nodes); if (s == d) continue;