|
@@ -149,7 +149,7 @@ void __init setup_node_bootmem(int nodeid, unsigned long start, unsigned long en
|
|
|
/* Initialize final allocator for a zone */
|
|
|
void __init setup_node_zones(int nodeid)
|
|
|
{
|
|
|
- unsigned long start_pfn, end_pfn;
|
|
|
+ unsigned long start_pfn, end_pfn, memmapsize, limit;
|
|
|
unsigned long zones[MAX_NR_ZONES];
|
|
|
unsigned long holes[MAX_NR_ZONES];
|
|
|
|
|
@@ -159,6 +159,16 @@ void __init setup_node_zones(int nodeid)
|
|
|
Dprintk(KERN_INFO "Setting up node %d %lx-%lx\n",
|
|
|
nodeid, start_pfn, end_pfn);
|
|
|
|
|
|
+ /* Try to allocate mem_map at end to not fill up precious <4GB
|
|
|
+ memory. */
|
|
|
+ memmapsize = sizeof(struct page) * (end_pfn-start_pfn);
|
|
|
+ limit = end_pfn << PAGE_SHIFT;
|
|
|
+ NODE_DATA(nodeid)->node_mem_map =
|
|
|
+ __alloc_bootmem_core(NODE_DATA(nodeid)->bdata,
|
|
|
+ memmapsize, SMP_CACHE_BYTES,
|
|
|
+ round_down(limit - memmapsize, PAGE_SIZE),
|
|
|
+ limit);
|
|
|
+
|
|
|
size_zones(zones, holes, start_pfn, end_pfn);
|
|
|
free_area_init_node(nodeid, NODE_DATA(nodeid), zones,
|
|
|
start_pfn, holes);
|