Re: [PATCH -mm V2] do_migrate_pages() calls migrate_to_node() evenif task is already on a correct node

From: Larry Woodman
Date: Tue Apr 24 2012 - 13:16:19 EST


On 04/24/2012 12:19 PM, KOSAKI Motohiro wrote:
diff --git a/mm/mempolicy.c b/mm/mempolicy.c
index 47296fe..6c189fa 100644
--- a/mm/mempolicy.c
+++ b/mm/mempolicy.c
@@ -1012,6 +1012,16 @@ 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, never move
+ * memory out of any destination nodes */

Please use

/*
* foo bar
*/

style comment. and this comment only explain how code work but don't explain why.
I hope the comment describe HPC usecase require to migrate if src and dest have the
same weight.

Otherwise looks ok. please feel free to use my ack to your next spin.
Acked-by: KOSAKI Motohiro <kosaki.motohiro@xxxxxxxxxxxxxx>



+ if ((nodes_weight(*from_nodes) != nodes_weight(*to_nodes)) &&
+ (node_isset(s, *to_nodes)))
+ continue;
+


--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@xxxxxxxxxx For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: <a href=mailto:"dont@xxxxxxxxx";> email@xxxxxxxxx </a>
How does this look:


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;