diff options
| author | Tejun Heo <tj@kernel.org> | 2010-04-05 11:37:28 +0900 | 
|---|---|---|
| committer | Tejun Heo <tj@kernel.org> | 2010-04-05 11:37:28 +0900 | 
| commit | 336f5899d287f06d8329e208fc14ce50f7ec9698 (patch) | |
| tree | 9b762d450d5eb248a6ff8317badb7e223d93ed58 /arch/x86/mm/init.c | |
| parent | a4ab2773205e8b94c18625455f85e3b6bb9d7ad6 (diff) | |
| parent | db217dece3003df0841bacf9556b5c06aa097dae (diff) | |
| download | olio-linux-3.10-336f5899d287f06d8329e208fc14ce50f7ec9698.tar.xz olio-linux-3.10-336f5899d287f06d8329e208fc14ce50f7ec9698.zip  | |
Merge branch 'master' into export-slabh
Diffstat (limited to 'arch/x86/mm/init.c')
| -rw-r--r-- | arch/x86/mm/init.c | 32 | 
1 files changed, 26 insertions, 6 deletions
diff --git a/arch/x86/mm/init.c b/arch/x86/mm/init.c index a4a7d7dc8aa..b278535b14a 100644 --- a/arch/x86/mm/init.c +++ b/arch/x86/mm/init.c @@ -332,11 +332,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 @@ -344,7 +356,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  	/* @@ -359,8 +371,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++;  	} @@ -377,6 +388,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  |