diff options
| author | Tejun Heo <tj@kernel.org> | 2011-12-08 10:22:07 -0800 | 
|---|---|---|
| committer | Tejun Heo <tj@kernel.org> | 2011-12-08 10:22:07 -0800 | 
| commit | 6fbef13c4feaf0c5576e2315f4d2999c4b670c88 (patch) | |
| tree | 454bc9c67bf92295595130f4d42548b6d59b5474 | |
| parent | c0ce8fef55896a2813a3d94e1b2d0e6d7fab6228 (diff) | |
| download | olio-linux-3.10-6fbef13c4feaf0c5576e2315f4d2999c4b670c88.tar.xz olio-linux-3.10-6fbef13c4feaf0c5576e2315f4d2999c4b670c88.zip  | |
powerpc: Cleanup memblock usage
* early_init_devtree(): Total memory size is aligned to PAGE_SIZE;
  however, alignment isn't enforced if memory_limit is explicitly
  specified.  Simplify the logic and always apply PAGE_SIZE alignment.
* MMU_init(): memblock regions is truncated by directly modifying
  memblock.memory.cnt.  This is incomplete (reserved array is not
  truncated) and unnecessarily low level hindering further memblock
  improvments.  Use memblock_enforce_memory_limit() instead.
* wii_memory_fixups(): Unnecessarily low level direct manipulation of
  memblock regions.  The same result can be achieved using properly
  abstracted operations.  Reimplement using memblock API.
Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Yinghai Lu <yinghai@kernel.org>
| -rw-r--r-- | arch/powerpc/kernel/prom.c | 17 | ||||
| -rw-r--r-- | arch/powerpc/mm/init_32.c | 2 | ||||
| -rw-r--r-- | arch/powerpc/platforms/embedded6xx/wii.c | 22 | 
3 files changed, 16 insertions, 25 deletions
diff --git a/arch/powerpc/kernel/prom.c b/arch/powerpc/kernel/prom.c index a7ee83e6eb1..28500d4f29d 100644 --- a/arch/powerpc/kernel/prom.c +++ b/arch/powerpc/kernel/prom.c @@ -754,17 +754,12 @@ void __init early_init_devtree(void *params)  	early_reserve_mem();  	phyp_dump_reserve_mem(); -	limit = memory_limit; -	if (! limit) { -		phys_addr_t memsize; - -		/* Ensure that total memory size is page-aligned, because -		 * otherwise mark_bootmem() gets upset. */ -		memblock_analyze(); -		memsize = memblock_phys_mem_size(); -		if ((memsize & PAGE_MASK) != memsize) -			limit = memsize & PAGE_MASK; -	} +	/* +	 * Ensure that total memory size is page-aligned, because otherwise +	 * mark_bootmem() gets upset. +	 */ +	memblock_analyze(); +	limit = ALIGN(memory_limit ?: memblock_phys_mem_size(), PAGE_SIZE);  	memblock_enforce_memory_limit(limit);  	memblock_analyze(); diff --git a/arch/powerpc/mm/init_32.c b/arch/powerpc/mm/init_32.c index 161cefde5c1..12bb528e51c 100644 --- a/arch/powerpc/mm/init_32.c +++ b/arch/powerpc/mm/init_32.c @@ -134,7 +134,7 @@ void __init MMU_init(void)  	if (memblock.memory.cnt > 1) {  #ifndef CONFIG_WII -		memblock.memory.cnt = 1; +		memblock_enforce_memory_limit(memblock.memory.regions[0].size);  		memblock_analyze();  		printk(KERN_WARNING "Only using first contiguous memory region");  #else diff --git a/arch/powerpc/platforms/embedded6xx/wii.c b/arch/powerpc/platforms/embedded6xx/wii.c index 1b5dc1a2e14..1cbe9d3c797 100644 --- a/arch/powerpc/platforms/embedded6xx/wii.c +++ b/arch/powerpc/platforms/embedded6xx/wii.c @@ -79,23 +79,19 @@ void __init wii_memory_fixups(void)  	BUG_ON(memblock.memory.cnt != 2);  	BUG_ON(!page_aligned(p[0].base) || !page_aligned(p[1].base)); -	p[0].size = _ALIGN_DOWN(p[0].size, PAGE_SIZE); -	p[1].size = _ALIGN_DOWN(p[1].size, PAGE_SIZE); +	/* trim unaligned tail */ +	memblock_remove(ALIGN(p[1].base + p[1].size, PAGE_SIZE), +			(phys_addr_t)ULLONG_MAX); -	wii_hole_start = p[0].base + p[0].size; +	/* determine hole, add & reserve them */ +	wii_hole_start = ALIGN(p[0].base + p[0].size, PAGE_SIZE);  	wii_hole_size = p[1].base - wii_hole_start; - -	pr_info("MEM1: <%08llx %08llx>\n", p[0].base, p[0].size); -	pr_info("HOLE: <%08lx %08lx>\n", wii_hole_start, wii_hole_size); -	pr_info("MEM2: <%08llx %08llx>\n", p[1].base, p[1].size); - -	p[0].size += wii_hole_size + p[1].size; - -	memblock.memory.cnt = 1; +	memblock_add(wii_hole_start, wii_hole_size); +	memblock_reserve(wii_hole_start, wii_hole_size);  	memblock_analyze(); -	/* reserve the hole */ -	memblock_reserve(wii_hole_start, wii_hole_size); +	BUG_ON(memblock.memory.cnt != 1); +	__memblock_dump_all();  	/* allow ioremapping the address space in the hole */  	__allow_ioremap_reserved = 1;  |