diff options
author | Christoph Lameter <clameter@sgi.com> | 2007-10-16 04:25:35 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-10-16 12:42:58 -0400 |
commit | 56bbd65df0e92a4a8eb70c5f2b416ae2b6c5fb31 (patch) | |
tree | 714154b7b16d2e08c60d49b925aa0e789f0f0be0 | |
parent | 4199cfa02b982f4c739e8a6a304d6a40e1935d25 (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>
-rw-r--r-- | mm/mempolicy.c | 10 | ||||
-rw-r--r-- | mm/migrate.c | 2 |
2 files changed, 6 insertions, 6 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]); |
2006 | out: | 2006 | out: |
diff --git a/mm/migrate.c b/mm/migrate.c index 07f22d4a431f..71c38b43c019 100644 --- a/mm/migrate.c +++ b/mm/migrate.c | |||
@@ -986,7 +986,7 @@ asmlinkage long sys_move_pages(pid_t pid, unsigned long nr_pages, | |||
986 | goto out; | 986 | goto out; |
987 | 987 | ||
988 | err = -ENODEV; | 988 | err = -ENODEV; |
989 | if (!node_online(node)) | 989 | if (!node_state(node, N_HIGH_MEMORY)) |
990 | goto out; | 990 | goto out; |
991 | 991 | ||
992 | err = -EACCES; | 992 | err = -EACCES; |