diff options
author | Dave Hansen <haveblue@us.ibm.com> | 2005-06-23 03:07:39 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-06-23 12:45:01 -0400 |
commit | 6f167ec721108c9282d54424516a12c805e3c306 (patch) | |
tree | f7094a2524611ede76b32e4cc3c07987b7b0e275 /mm/page_alloc.c | |
parent | c2ebaa425e6630adcbf757b004d257dd4204925b (diff) |
[PATCH] sparsemem base: simple NUMA remap space allocator
Introduce a simple allocator for the NUMA remap space. This space is very
scarce, used for structures which are best allocated node local.
This mechanism is also used on non-NUMA ia64 systems with a vmem_map to keep
the pgdat->node_mem_map initialized in a consistent place for all
architectures.
Issues:
o alloc_remap takes a node_id where we might expect a pgdat which was intended
to allow us to allocate the pgdat's using this mechanism; which we do not yet
do. Could have alloc_remap_node() and alloc_remap_nid() for this purpose.
Signed-off-by: Andy Whitcroft <apw@shadowen.org>
Signed-off-by: Dave Hansen <haveblue@us.ibm.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'mm/page_alloc.c')
-rw-r--r-- | mm/page_alloc.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 559336de9687..bf1dd8819097 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
@@ -1936,6 +1936,7 @@ static void __init free_area_init_core(struct pglist_data *pgdat, | |||
1936 | static void __init alloc_node_mem_map(struct pglist_data *pgdat) | 1936 | static void __init alloc_node_mem_map(struct pglist_data *pgdat) |
1937 | { | 1937 | { |
1938 | unsigned long size; | 1938 | unsigned long size; |
1939 | struct page *map; | ||
1939 | 1940 | ||
1940 | /* Skip empty nodes */ | 1941 | /* Skip empty nodes */ |
1941 | if (!pgdat->node_spanned_pages) | 1942 | if (!pgdat->node_spanned_pages) |
@@ -1944,7 +1945,10 @@ static void __init alloc_node_mem_map(struct pglist_data *pgdat) | |||
1944 | /* ia64 gets its own node_mem_map, before this, without bootmem */ | 1945 | /* ia64 gets its own node_mem_map, before this, without bootmem */ |
1945 | if (!pgdat->node_mem_map) { | 1946 | if (!pgdat->node_mem_map) { |
1946 | size = (pgdat->node_spanned_pages + 1) * sizeof(struct page); | 1947 | size = (pgdat->node_spanned_pages + 1) * sizeof(struct page); |
1947 | pgdat->node_mem_map = alloc_bootmem_node(pgdat, size); | 1948 | map = alloc_remap(pgdat->node_id, size); |
1949 | if (!map) | ||
1950 | map = alloc_bootmem_node(pgdat, size); | ||
1951 | pgdat->node_mem_map = map; | ||
1948 | } | 1952 | } |
1949 | #ifndef CONFIG_DISCONTIGMEM | 1953 | #ifndef CONFIG_DISCONTIGMEM |
1950 | /* | 1954 | /* |