Commit b962a286 authored by Russell King's avatar Russell King Committed by Russell King

[ARM] initrd: claim initrd memory exclusively

Claim the initrd memory exclusively, and order other memory
reservations beforehand.  This allows us to determine whether
the initrd memory was overwritten, and disable the initrd in
that case.

This avoids a 'bad page state' bug.
Tested-by: default avatarRalph Siemsen <ralphs@netwinder.org>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent 905a09d5
...@@ -156,9 +156,9 @@ static int __init check_initrd(struct meminfo *mi) ...@@ -156,9 +156,9 @@ static int __init check_initrd(struct meminfo *mi)
} }
if (initrd_node == -1) { 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", "physical memory - disabling initrd\n",
phys_initrd_start, end); phys_initrd_start, phys_initrd_size);
phys_initrd_start = phys_initrd_size = 0; phys_initrd_start = phys_initrd_size = 0;
} }
#endif #endif
...@@ -239,24 +239,32 @@ bootmem_init_node(int node, int initrd_node, struct meminfo *mi) ...@@ -239,24 +239,32 @@ bootmem_init_node(int node, int initrd_node, struct meminfo *mi)
reserve_bootmem_node(pgdat, boot_pfn << PAGE_SHIFT, reserve_bootmem_node(pgdat, boot_pfn << PAGE_SHIFT,
boot_pages << PAGE_SHIFT, BOOTMEM_DEFAULT); boot_pages << PAGE_SHIFT, BOOTMEM_DEFAULT);
/*
* Reserve any special node zero regions.
*/
if (node == 0)
reserve_node_zero(pgdat);
#ifdef CONFIG_BLK_DEV_INITRD #ifdef CONFIG_BLK_DEV_INITRD
/* /*
* If the initrd is in this node, reserve its memory. * If the initrd is in this node, reserve its memory.
*/ */
if (node == initrd_node) { if (node == initrd_node) {
reserve_bootmem_node(pgdat, phys_initrd_start, int res = reserve_bootmem_node(pgdat, phys_initrd_start,
phys_initrd_size, BOOTMEM_DEFAULT); phys_initrd_size, BOOTMEM_EXCLUSIVE);
initrd_start = __phys_to_virt(phys_initrd_start);
initrd_end = initrd_start + phys_initrd_size; 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 #endif
/*
* Finally, reserve any node zero regions.
*/
if (node == 0)
reserve_node_zero(pgdat);
/* /*
* initialise the zones within this node. * initialise the zones within this node.
*/ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment