parisc: kill WARN in free_initmem when DEBUG_KERNEL

Doing an IPI with local interrupts off triggers a warning. We
don't need to be quite so ridiculously paranoid. Also, clean up
a bit of the code a little.

Signed-off-by: Kyle McMartin <kyle@mcmartin.ca>
This commit is contained in:
Kyle McMartin 2009-04-05 02:53:47 +00:00
parent 692c14a593
commit 4fb11781a0

View file

@ -370,34 +370,22 @@ static void __init setup_bootmem(void)
void free_initmem(void) void free_initmem(void)
{ {
unsigned long addr, init_begin, init_end; unsigned long addr;
unsigned long init_begin = (unsigned long)__init_begin;
printk(KERN_INFO "Freeing unused kernel memory: "); unsigned long init_end = (unsigned long)__init_end;
#ifdef CONFIG_DEBUG_KERNEL #ifdef CONFIG_DEBUG_KERNEL
/* Attempt to catch anyone trying to execute code here /* Attempt to catch anyone trying to execute code here
* by filling the page with BRK insns. * by filling the page with BRK insns.
*
* If we disable interrupts for all CPUs, then IPI stops working.
* Kinda breaks the global cache flushing.
*/ */
local_irq_disable(); memset(init_begin, 0x00, init_end - init_begin);
flush_icache_range(init_begin, init_end);
memset(__init_begin, 0x00,
(unsigned long)__init_end - (unsigned long)__init_begin);
flush_data_cache();
asm volatile("sync" : : );
flush_icache_range((unsigned long)__init_begin, (unsigned long)__init_end);
asm volatile("sync" : : );
local_irq_enable();
#endif #endif
/* align __init_begin and __init_end to page size, /* align __init_begin and __init_end to page size,
ignoring linker script where we might have tried to save RAM */ ignoring linker script where we might have tried to save RAM */
init_begin = PAGE_ALIGN((unsigned long)(__init_begin)); init_begin = PAGE_ALIGN(init_begin);
init_end = PAGE_ALIGN((unsigned long)(__init_end)); init_end = PAGE_ALIGN(init_end);
for (addr = init_begin; addr < init_end; addr += PAGE_SIZE) { for (addr = init_begin; addr < init_end; addr += PAGE_SIZE) {
ClearPageReserved(virt_to_page(addr)); ClearPageReserved(virt_to_page(addr));
init_page_count(virt_to_page(addr)); init_page_count(virt_to_page(addr));
@ -409,7 +397,8 @@ void free_initmem(void)
/* set up a new led state on systems shipped LED State panel */ /* set up a new led state on systems shipped LED State panel */
pdc_chassis_send_status(PDC_CHASSIS_DIRECT_BCOMPLETE); pdc_chassis_send_status(PDC_CHASSIS_DIRECT_BCOMPLETE);
printk("%luk freed\n", (init_end - init_begin) >> 10); printk(KERN_INFO "Freeing unused kernel memory: %luk freed\n",
(init_end - init_begin) >> 10);
} }