[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: Ralph Siemsen <ralphs@netwinder.org> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
parent
905a09d57a
commit
b962a286e5
1 changed files with 20 additions and 12 deletions
|
@ -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,24 +239,32 @@ 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);
|
||||
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.
|
||||
*/
|
||||
|
|
Loading…
Reference in a new issue