diff options
-rw-r--r-- | arch/x86_64/mm/init.c | 6 | ||||
-rw-r--r-- | include/linux/bootmem.h | 1 | ||||
-rw-r--r-- | mm/sparse.c | 11 |
3 files changed, 18 insertions, 0 deletions
diff --git a/arch/x86_64/mm/init.c b/arch/x86_64/mm/init.c index 1336da8bdee1..1ad5111aec38 100644 --- a/arch/x86_64/mm/init.c +++ b/arch/x86_64/mm/init.c | |||
@@ -761,3 +761,9 @@ int in_gate_area_no_task(unsigned long addr) | |||
761 | { | 761 | { |
762 | return (addr >= VSYSCALL_START) && (addr < VSYSCALL_END); | 762 | return (addr >= VSYSCALL_START) && (addr < VSYSCALL_END); |
763 | } | 763 | } |
764 | |||
765 | void *alloc_bootmem_high_node(pg_data_t *pgdat, unsigned long size) | ||
766 | { | ||
767 | return __alloc_bootmem_core(pgdat->bdata, size, | ||
768 | SMP_CACHE_BYTES, (4UL*1024*1024*1024), 0); | ||
769 | } | ||
diff --git a/include/linux/bootmem.h b/include/linux/bootmem.h index 0365ec9fc0c9..c83534ee1e79 100644 --- a/include/linux/bootmem.h +++ b/include/linux/bootmem.h | |||
@@ -59,6 +59,7 @@ extern void *__alloc_bootmem_core(struct bootmem_data *bdata, | |||
59 | unsigned long align, | 59 | unsigned long align, |
60 | unsigned long goal, | 60 | unsigned long goal, |
61 | unsigned long limit); | 61 | unsigned long limit); |
62 | extern void *alloc_bootmem_high_node(pg_data_t *pgdat, unsigned long size); | ||
62 | 63 | ||
63 | #ifndef CONFIG_HAVE_ARCH_BOOTMEM_NODE | 64 | #ifndef CONFIG_HAVE_ARCH_BOOTMEM_NODE |
64 | extern void reserve_bootmem(unsigned long addr, unsigned long size); | 65 | extern void reserve_bootmem(unsigned long addr, unsigned long size); |
diff --git a/mm/sparse.c b/mm/sparse.c index 1302f8348d51..545e4d3afcdf 100644 --- a/mm/sparse.c +++ b/mm/sparse.c | |||
@@ -209,6 +209,12 @@ static int __meminit sparse_init_one_section(struct mem_section *ms, | |||
209 | return 1; | 209 | return 1; |
210 | } | 210 | } |
211 | 211 | ||
212 | __attribute__((weak)) | ||
213 | void *alloc_bootmem_high_node(pg_data_t *pgdat, unsigned long size) | ||
214 | { | ||
215 | return NULL; | ||
216 | } | ||
217 | |||
212 | static struct page __init *sparse_early_mem_map_alloc(unsigned long pnum) | 218 | static struct page __init *sparse_early_mem_map_alloc(unsigned long pnum) |
213 | { | 219 | { |
214 | struct page *map; | 220 | struct page *map; |
@@ -219,6 +225,11 @@ static struct page __init *sparse_early_mem_map_alloc(unsigned long pnum) | |||
219 | if (map) | 225 | if (map) |
220 | return map; | 226 | return map; |
221 | 227 | ||
228 | map = alloc_bootmem_high_node(NODE_DATA(nid), | ||
229 | sizeof(struct page) * PAGES_PER_SECTION); | ||
230 | if (map) | ||
231 | return map; | ||
232 | |||
222 | map = alloc_bootmem_node(NODE_DATA(nid), | 233 | map = alloc_bootmem_node(NODE_DATA(nid), |
223 | sizeof(struct page) * PAGES_PER_SECTION); | 234 | sizeof(struct page) * PAGES_PER_SECTION); |
224 | if (map) | 235 | if (map) |