(1) fix free_initmem() reporting (2) fix free_initrd_mem() not to free things outside the initrd (3) fix free_initrd_mem() reporting diff -urpN pgcl-2.5.60-bk3-1/arch/i386/mm/init.c pgcl-2.5.60-bk3-2/arch/i386/mm/init.c --- pgcl-2.5.60-bk3-1/arch/i386/mm/init.c 2003-02-13 05:22:06.000000000 -0800 +++ pgcl-2.5.60-bk3-2/arch/i386/mm/init.c 2003-02-13 05:33:33.000000000 -0800 @@ -579,7 +579,7 @@ static int do_test_wp_bit(void) void free_initmem(void) { - unsigned long addr; + unsigned long addr, freed = 0;; addr = (unsigned long)(&__init_begin); addr = (addr + PAGE_SIZE - 1) & PAGE_MASK; @@ -588,21 +588,34 @@ void free_initmem(void) set_page_count(virt_to_page(addr), 1); free_page(addr); totalram_pages++; + freed++; addr += PAGE_SIZE; } - printk (KERN_INFO "Freeing unused kernel memory: %dk freed\n", (&__init_end - &__init_begin) >> 10); + printk(KERN_INFO "Freeing unused kernel memory: %dk freed\n", + freed*(PAGE_SIZE/1024)); } #ifdef CONFIG_BLK_DEV_INITRD void free_initrd_mem(unsigned long start, unsigned long end) { - if (start < end) - printk (KERN_INFO "Freeing initrd memory: %ldk freed\n", (end - start) >> 10); - for (; start < end; start += PAGE_SIZE) { + unsigned long freed = 0; + + start = (start + PAGE_SIZE - 1) & PAGE_MASK; + end &= PAGE_MASK; + + if (start >= end) + return; + + while (start < end) { ClearPageReserved(virt_to_page(start)); set_page_count(virt_to_page(start), 1); free_page(start); totalram_pages++; + freed++; + start += PAGE_SIZE; } + + printk(KERN_INFO "Freeing initrd memory: %ldk freed\n", + freed*(PAGE_SIZE/1024)); } #endif