aboutsummaryrefslogtreecommitdiffstats
path: root/mm/mempolicy.c
diff options
context:
space:
mode:
authorChristoph Lameter <clameter@sgi.com>2007-10-16 04:25:35 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-10-16 12:42:58 -0400
commit56bbd65df0e92a4a8eb70c5f2b416ae2b6c5fb31 (patch)
tree714154b7b16d2e08c60d49b925aa0e789f0f0be0 /mm/mempolicy.c
parent4199cfa02b982f4c739e8a6a304d6a40e1935d25 (diff)
Memoryless nodes: Update memory policy and page migration
Online nodes now may have no memory. The checks and initialization must therefore be changed to no longer use the online functions. This will correctly initialize the interleave on bootup to only target nodes with memory and will make sys_move_pages return an error when a page is to be moved to a memoryless node. Similarly we will get an error if MPOL_BIND and MPOL_INTERLEAVE is used on a memoryless node. These are somewhat new semantics. So far one could specify memoryless nodes and we would maybe do the right thing and just ignore the node (or we'd do something strange like with MPOL_INTERLEAVE). If we want to allow the specification of memoryless nodes via memory policies then we need to keep checking for online nodes. Signed-off-by: Christoph Lameter <clameter@sgi.com> Acked-by: Nishanth Aravamudan <nacc@us.ibm.com> Tested-by: Lee Schermerhorn <lee.schermerhorn@hp.com> Acked-by: Bob Picco <bob.picco@hp.com> Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Cc: Mel Gorman <mel@skynet.ie> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/mempolicy.c')
-rw-r--r--mm/mempolicy.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/mm/mempolicy.c b/mm/mempolicy.c
index 5daf63bd97e7..0d70fb7d83be 100644
--- a/mm/mempolicy.c
+++ b/mm/mempolicy.c
@@ -494,9 +494,9 @@ static void get_zonemask(struct mempolicy *p, nodemask_t *nodes)
494 *nodes = p->v.nodes; 494 *nodes = p->v.nodes;
495 break; 495 break;
496 case MPOL_PREFERRED: 496 case MPOL_PREFERRED:
497 /* or use current node instead of online map? */ 497 /* or use current node instead of memory_map? */
498 if (p->v.preferred_node < 0) 498 if (p->v.preferred_node < 0)
499 *nodes = node_online_map; 499 *nodes = node_states[N_HIGH_MEMORY];
500 else 500 else
501 node_set(p->v.preferred_node, *nodes); 501 node_set(p->v.preferred_node, *nodes);
502 break; 502 break;
@@ -1687,7 +1687,7 @@ void __init numa_policy_init(void)
1687 * fall back to the largest node if they're all smaller. 1687 * fall back to the largest node if they're all smaller.
1688 */ 1688 */
1689 nodes_clear(interleave_nodes); 1689 nodes_clear(interleave_nodes);
1690 for_each_online_node(nid) { 1690 for_each_node_state(nid, N_HIGH_MEMORY) {
1691 unsigned long total_pages = node_present_pages(nid); 1691 unsigned long total_pages = node_present_pages(nid);
1692 1692
1693 /* Preserve the largest node */ 1693 /* Preserve the largest node */
@@ -1973,7 +1973,7 @@ int show_numa_map(struct seq_file *m, void *v)
1973 seq_printf(m, " huge"); 1973 seq_printf(m, " huge");
1974 } else { 1974 } else {
1975 check_pgd_range(vma, vma->vm_start, vma->vm_end, 1975 check_pgd_range(vma, vma->vm_start, vma->vm_end,
1976 &node_online_map, MPOL_MF_STATS, md); 1976 &node_states[N_HIGH_MEMORY], MPOL_MF_STATS, md);
1977 } 1977 }
1978 1978
1979 if (!md->pages) 1979 if (!md->pages)
@@ -2000,7 +2000,7 @@ int show_numa_map(struct seq_file *m, void *v)
2000 if (md->writeback) 2000 if (md->writeback)
2001 seq_printf(m," writeback=%lu", md->writeback); 2001 seq_printf(m," writeback=%lu", md->writeback);
2002 2002
2003 for_each_online_node(n) 2003 for_each_node_state(n, N_HIGH_MEMORY)
2004 if (md->node[n]) 2004 if (md->node[n])
2005 seq_printf(m, " N%d=%lu", n, md->node[n]); 2005 seq_printf(m, " N%d=%lu", n, md->node[n]);
2006out: 2006out: