diff options
Diffstat (limited to 'mm/memblock.c')
| -rw-r--r-- | mm/memblock.c | 51 | 
1 files changed, 23 insertions, 28 deletions
| diff --git a/mm/memblock.c b/mm/memblock.c index d4382095f8bd..5cc6731b00cc 100644 --- a/mm/memblock.c +++ b/mm/memblock.c @@ -143,30 +143,6 @@ phys_addr_t __init_memblock memblock_find_in_range(phys_addr_t start,  					   MAX_NUMNODES);  } -/* - * Free memblock.reserved.regions - */ -int __init_memblock memblock_free_reserved_regions(void) -{ -	if (memblock.reserved.regions == memblock_reserved_init_regions) -		return 0; - -	return memblock_free(__pa(memblock.reserved.regions), -		 sizeof(struct memblock_region) * memblock.reserved.max); -} - -/* - * Reserve memblock.reserved.regions - */ -int __init_memblock memblock_reserve_reserved_regions(void) -{ -	if (memblock.reserved.regions == memblock_reserved_init_regions) -		return 0; - -	return memblock_reserve(__pa(memblock.reserved.regions), -		 sizeof(struct memblock_region) * memblock.reserved.max); -} -  static void __init_memblock memblock_remove_region(struct memblock_type *type, unsigned long r)  {  	type->total_size -= type->regions[r].size; @@ -184,6 +160,18 @@ static void __init_memblock memblock_remove_region(struct memblock_type *type, u  	}  } +phys_addr_t __init_memblock get_allocated_memblock_reserved_regions_info( +					phys_addr_t *addr) +{ +	if (memblock.reserved.regions == memblock_reserved_init_regions) +		return 0; + +	*addr = __pa(memblock.reserved.regions); + +	return PAGE_ALIGN(sizeof(struct memblock_region) * +			  memblock.reserved.max); +} +  /**   * memblock_double_array - double the size of the memblock regions array   * @type: memblock type of the regions array being doubled @@ -204,6 +192,7 @@ static int __init_memblock memblock_double_array(struct memblock_type *type,  						phys_addr_t new_area_size)  {  	struct memblock_region *new_array, *old_array; +	phys_addr_t old_alloc_size, new_alloc_size;  	phys_addr_t old_size, new_size, addr;  	int use_slab = slab_is_available();  	int *in_slab; @@ -217,6 +206,12 @@ static int __init_memblock memblock_double_array(struct memblock_type *type,  	/* Calculate new doubled size */  	old_size = type->max * sizeof(struct memblock_region);  	new_size = old_size << 1; +	/* +	 * We need to allocated new one align to PAGE_SIZE, +	 *   so we can free them completely later. +	 */ +	old_alloc_size = PAGE_ALIGN(old_size); +	new_alloc_size = PAGE_ALIGN(new_size);  	/* Retrieve the slab flag */  	if (type == &memblock.memory) @@ -245,11 +240,11 @@ static int __init_memblock memblock_double_array(struct memblock_type *type,  		addr = memblock_find_in_range(new_area_start + new_area_size,  						memblock.current_limit, -						new_size, sizeof(phys_addr_t)); +						new_alloc_size, PAGE_SIZE);  		if (!addr && new_area_size)  			addr = memblock_find_in_range(0,  					min(new_area_start, memblock.current_limit), -					new_size, sizeof(phys_addr_t)); +					new_alloc_size, PAGE_SIZE);  		new_array = addr ? __va(addr) : 0;  	} @@ -279,13 +274,13 @@ static int __init_memblock memblock_double_array(struct memblock_type *type,  		kfree(old_array);  	else if (old_array != memblock_memory_init_regions &&  		 old_array != memblock_reserved_init_regions) -		memblock_free(__pa(old_array), old_size); +		memblock_free(__pa(old_array), old_alloc_size);  	/* Reserve the new array if that comes from the memblock.  	 * Otherwise, we needn't do it  	 */  	if (!use_slab) -		BUG_ON(memblock_reserve(addr, new_size)); +		BUG_ON(memblock_reserve(addr, new_alloc_size));  	/* Update slab flag */  	*in_slab = use_slab; | 
