summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mm/mempolicy.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/mm/mempolicy.c b/mm/mempolicy.c
index a388888b6fcf..d3c5de47ff6d 100644
--- a/mm/mempolicy.c
+++ b/mm/mempolicy.c
@@ -1005,6 +1005,26 @@ int do_migrate_pages(struct mm_struct *mm,
int dest = 0;
for_each_node_mask(s, tmp) {
+
+ /*
+ * do_migrate_pages() tries to maintain the relative
+ * node relationship of the pages established between
+ * threads and memory areas.
+ *
+ * However if the number of source nodes is not equal to
+ * the number of destination nodes we can not preserve
+ * this node relative relationship. In that case, skip
+ * copying memory from a node that is in the destination
+ * mask.
+ *
+ * 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;