diff options
Diffstat (limited to 'arch/arm/mm/init.c')
| -rw-r--r-- | arch/arm/mm/init.c | 32 | 
1 files changed, 20 insertions, 12 deletions
diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c index e6352946dde..30a69d67d67 100644 --- a/arch/arm/mm/init.c +++ b/arch/arm/mm/init.c @@ -156,9 +156,9 @@ static int __init check_initrd(struct meminfo *mi)  	}  	if (initrd_node == -1) { -		printk(KERN_ERR "initrd (0x%08lx - 0x%08lx) extends beyond " +		printk(KERN_ERR "INITRD: 0x%08lx+0x%08lx extends beyond "  		       "physical memory - disabling initrd\n", -		       phys_initrd_start, end); +		       phys_initrd_start, phys_initrd_size);  		phys_initrd_start = phys_initrd_size = 0;  	}  #endif @@ -239,25 +239,33 @@ bootmem_init_node(int node, int initrd_node, struct meminfo *mi)  	reserve_bootmem_node(pgdat, boot_pfn << PAGE_SHIFT,  			     boot_pages << PAGE_SHIFT, BOOTMEM_DEFAULT); +	/* +	 * Reserve any special node zero regions. +	 */ +	if (node == 0) +		reserve_node_zero(pgdat); +  #ifdef CONFIG_BLK_DEV_INITRD  	/*  	 * If the initrd is in this node, reserve its memory.  	 */  	if (node == initrd_node) { -		reserve_bootmem_node(pgdat, phys_initrd_start, -				     phys_initrd_size, BOOTMEM_DEFAULT); -		initrd_start = __phys_to_virt(phys_initrd_start); -		initrd_end = initrd_start + phys_initrd_size; +		int res = reserve_bootmem_node(pgdat, phys_initrd_start, +				     phys_initrd_size, BOOTMEM_EXCLUSIVE); + +		if (res == 0) { +			initrd_start = __phys_to_virt(phys_initrd_start); +			initrd_end = initrd_start + phys_initrd_size; +		} else { +			printk(KERN_ERR +				"INITRD: 0x%08lx+0x%08lx overlaps in-use " +				"memory region - disabling initrd\n", +				phys_initrd_start, phys_initrd_size); +		}  	}  #endif  	/* -	 * Finally, reserve any node zero regions. -	 */ -	if (node == 0) -		reserve_node_zero(pgdat); - -	/*  	 * initialise the zones within this node.  	 */  	memset(zone_size, 0, sizeof(zone_size));  |