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 e6352946dde0..30a69d67d673 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) | |||
156 | } | 156 | } |
157 | 157 | ||
158 | if (initrd_node == -1) { | 158 | if (initrd_node == -1) { |
159 | printk(KERN_ERR "initrd (0x%08lx - 0x%08lx) extends beyond " | 159 | printk(KERN_ERR "INITRD: 0x%08lx+0x%08lx extends beyond " |
160 | "physical memory - disabling initrd\n", | 160 | "physical memory - disabling initrd\n", |
161 | phys_initrd_start, end); | 161 | phys_initrd_start, phys_initrd_size); |
162 | phys_initrd_start = phys_initrd_size = 0; | 162 | phys_initrd_start = phys_initrd_size = 0; |
163 | } | 163 | } |
164 | #endif | 164 | #endif |
@@ -239,25 +239,33 @@ bootmem_init_node(int node, int initrd_node, struct meminfo *mi) | |||
239 | reserve_bootmem_node(pgdat, boot_pfn << PAGE_SHIFT, | 239 | reserve_bootmem_node(pgdat, boot_pfn << PAGE_SHIFT, |
240 | boot_pages << PAGE_SHIFT, BOOTMEM_DEFAULT); | 240 | boot_pages << PAGE_SHIFT, BOOTMEM_DEFAULT); |
241 | 241 | ||
242 | /* | ||
243 | * Reserve any special node zero regions. | ||
244 | */ | ||
245 | if (node == 0) | ||
246 | reserve_node_zero(pgdat); | ||
247 | |||
242 | #ifdef CONFIG_BLK_DEV_INITRD | 248 | #ifdef CONFIG_BLK_DEV_INITRD |
243 | /* | 249 | /* |
244 | * If the initrd is in this node, reserve its memory. | 250 | * If the initrd is in this node, reserve its memory. |
245 | */ | 251 | */ |
246 | if (node == initrd_node) { | 252 | if (node == initrd_node) { |
247 | reserve_bootmem_node(pgdat, phys_initrd_start, | 253 | int res = reserve_bootmem_node(pgdat, phys_initrd_start, |
248 | phys_initrd_size, BOOTMEM_DEFAULT); | 254 | phys_initrd_size, BOOTMEM_EXCLUSIVE); |
249 | initrd_start = __phys_to_virt(phys_initrd_start); | 255 | |
250 | initrd_end = initrd_start + phys_initrd_size; | 256 | if (res == 0) { |
257 | initrd_start = __phys_to_virt(phys_initrd_start); | ||
258 | initrd_end = initrd_start + phys_initrd_size; | ||
259 | } else { | ||
260 | printk(KERN_ERR | ||
261 | "INITRD: 0x%08lx+0x%08lx overlaps in-use " | ||
262 | "memory region - disabling initrd\n", | ||
263 | phys_initrd_start, phys_initrd_size); | ||
264 | } | ||
251 | } | 265 | } |
252 | #endif | 266 | #endif |
253 | 267 | ||
254 | /* | 268 | /* |
255 | * Finally, reserve any node zero regions. | ||
256 | */ | ||
257 | if (node == 0) | ||
258 | reserve_node_zero(pgdat); | ||
259 | |||
260 | /* | ||
261 | * initialise the zones within this node. | 269 | * initialise the zones within this node. |
262 | */ | 270 | */ |
263 | memset(zone_size, 0, sizeof(zone_size)); | 271 | memset(zone_size, 0, sizeof(zone_size)); |