diff options
Diffstat (limited to 'arch/s390/mm/vmem.c')
| -rw-r--r-- | arch/s390/mm/vmem.c | 32 | 
1 files changed, 14 insertions, 18 deletions
diff --git a/arch/s390/mm/vmem.c b/arch/s390/mm/vmem.c index bcfb70b60be..fe9012a49aa 100644 --- a/arch/s390/mm/vmem.c +++ b/arch/s390/mm/vmem.c @@ -10,6 +10,7 @@  #include <linux/list.h>  #include <linux/hugetlb.h>  #include <linux/slab.h> +#include <linux/memblock.h>  #include <asm/pgalloc.h>  #include <asm/pgtable.h>  #include <asm/setup.h> @@ -66,7 +67,8 @@ static pte_t __ref *vmem_pte_alloc(unsigned long address)  	if (slab_is_available())  		pte = (pte_t *) page_table_alloc(&init_mm, address);  	else -		pte = alloc_bootmem(PTRS_PER_PTE * sizeof(pte_t)); +		pte = alloc_bootmem_align(PTRS_PER_PTE * sizeof(pte_t), +					  PTRS_PER_PTE * sizeof(pte_t));  	if (!pte)  		return NULL;  	clear_table((unsigned long *) pte, _PAGE_INVALID, @@ -138,7 +140,6 @@ static int vmem_add_mem(unsigned long start, unsigned long size, int ro)  	}  	ret = 0;  out: -	flush_tlb_kernel_range(start, end);  	return ret;  } @@ -265,7 +266,6 @@ int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node)  	memset((void *)start, 0, end - start);  	ret = 0;  out: -	flush_tlb_kernel_range(start, end);  	return ret;  } @@ -373,16 +373,14 @@ out:  void __init vmem_map_init(void)  {  	unsigned long ro_start, ro_end; -	unsigned long start, end; -	int i; +	struct memblock_region *reg; +	phys_addr_t start, end;  	ro_start = PFN_ALIGN((unsigned long)&_stext);  	ro_end = (unsigned long)&_eshared & PAGE_MASK; -	for (i = 0; i < MEMORY_CHUNKS; i++) { -		if (!memory_chunk[i].size) -			continue; -		start = memory_chunk[i].addr; -		end = memory_chunk[i].addr + memory_chunk[i].size; +	for_each_memblock(memory, reg) { +		start = reg->base; +		end = reg->base + reg->size - 1;  		if (start >= ro_end || end <= ro_start)  			vmem_add_mem(start, end - start, 0);  		else if (start >= ro_start && end <= ro_end) @@ -402,23 +400,21 @@ void __init vmem_map_init(void)  }  /* - * Convert memory chunk array to a memory segment list so there is a single - * list that contains both r/w memory and shared memory segments. + * Convert memblock.memory  to a memory segment list so there is a single + * list that contains all memory segments.   */  static int __init vmem_convert_memory_chunk(void)  { +	struct memblock_region *reg;  	struct memory_segment *seg; -	int i;  	mutex_lock(&vmem_mutex); -	for (i = 0; i < MEMORY_CHUNKS; i++) { -		if (!memory_chunk[i].size) -			continue; +	for_each_memblock(memory, reg) {  		seg = kzalloc(sizeof(*seg), GFP_KERNEL);  		if (!seg)  			panic("Out of memory...\n"); -		seg->start = memory_chunk[i].addr; -		seg->size = memory_chunk[i].size; +		seg->start = reg->base; +		seg->size = reg->size;  		insert_memory_segment(seg);  	}  	mutex_unlock(&vmem_mutex);  | 
