@ -331,11 +331,23 @@ int devmem_is_allowed(unsigned long pagenr)
void free_init_pages ( char * what , unsigned long begin , unsigned long end )
{
unsigned long addr = begin ;
unsigned long addr ;
unsigned long begin_aligned , end_aligned ;
if ( addr > = end )
/* Make sure boundaries are page aligned */
begin_aligned = PAGE_ALIGN ( begin ) ;
end_aligned = end & PAGE_MASK ;
if ( WARN_ON ( begin_aligned ! = begin | | end_aligned ! = end ) ) {
begin = begin_aligned ;
end = end_aligned ;
}
if ( begin > = end )
return ;
addr = begin ;
/*
* If debugging page accesses then do not free this memory but
* mark them not present - any buggy init - section access will
@ -343,7 +355,7 @@ void free_init_pages(char *what, unsigned long begin, unsigned long end)
*/
# ifdef CONFIG_DEBUG_PAGEALLOC
printk ( KERN_INFO " debug: unmapping init memory %08lx..%08lx \n " ,
begin , PAGE_ALIGN ( end ) ) ;
begin , end ) ;
set_memory_np ( begin , ( end - begin ) > > PAGE_SHIFT ) ;
# else
/*
@ -358,8 +370,7 @@ void free_init_pages(char *what, unsigned long begin, unsigned long end)
for ( ; addr < end ; addr + = PAGE_SIZE ) {
ClearPageReserved ( virt_to_page ( addr ) ) ;
init_page_count ( virt_to_page ( addr ) ) ;
memset ( ( void * ) ( addr & ~ ( PAGE_SIZE - 1 ) ) ,
POISON_FREE_INITMEM , PAGE_SIZE ) ;
memset ( ( void * ) addr , POISON_FREE_INITMEM , PAGE_SIZE ) ;
free_page ( addr ) ;
totalram_pages + + ;
}
@ -376,6 +387,15 @@ void free_initmem(void)
# ifdef CONFIG_BLK_DEV_INITRD
void free_initrd_mem ( unsigned long start , unsigned long end )
{
free_init_pages ( " initrd memory " , start , end ) ;
/*
* end could be not aligned , and We can not align that ,
* decompresser could be confused by aligned initrd_end
* We already reserve the end partial page before in
* - i386_start_kernel ( )
* - x86_64_start_kernel ( )
* - relocate_initrd ( )
* So here We can do PAGE_ALIGN ( ) safely to get partial page to be freed
*/
free_init_pages ( " initrd memory " , start , PAGE_ALIGN ( end ) ) ;
}
# endif