diff options
Diffstat (limited to 'mm/percpu-vm.c')
| -rw-r--r-- | mm/percpu-vm.c | 23 | 
1 files changed, 10 insertions, 13 deletions
diff --git a/mm/percpu-vm.c b/mm/percpu-vm.c index 7d9c1d0ebd3..3707c71ae4c 100644 --- a/mm/percpu-vm.c +++ b/mm/percpu-vm.c @@ -50,14 +50,13 @@ static struct page **pcpu_get_pages_and_bitmap(struct pcpu_chunk *chunk,  	if (!pages || !bitmap) {  		if (may_alloc && !pages) -			pages = pcpu_mem_alloc(pages_size); +			pages = pcpu_mem_zalloc(pages_size);  		if (may_alloc && !bitmap) -			bitmap = pcpu_mem_alloc(bitmap_size); +			bitmap = pcpu_mem_zalloc(bitmap_size);  		if (!pages || !bitmap)  			return NULL;  	} -	memset(pages, 0, pages_size);  	bitmap_copy(bitmap, chunk->populated, pcpu_unit_pages);  	*bitmapp = bitmap; @@ -143,8 +142,8 @@ static void pcpu_pre_unmap_flush(struct pcpu_chunk *chunk,  				 int page_start, int page_end)  {  	flush_cache_vunmap( -		pcpu_chunk_addr(chunk, pcpu_first_unit_cpu, page_start), -		pcpu_chunk_addr(chunk, pcpu_last_unit_cpu, page_end)); +		pcpu_chunk_addr(chunk, pcpu_low_unit_cpu, page_start), +		pcpu_chunk_addr(chunk, pcpu_high_unit_cpu, page_end));  }  static void __pcpu_unmap_pages(unsigned long addr, int nr_pages) @@ -185,8 +184,7 @@ static void pcpu_unmap_pages(struct pcpu_chunk *chunk,  				   page_end - page_start);  	} -	for (i = page_start; i < page_end; i++) -		__clear_bit(i, populated); +	bitmap_clear(populated, page_start, page_end - page_start);  }  /** @@ -206,8 +204,8 @@ static void pcpu_post_unmap_tlb_flush(struct pcpu_chunk *chunk,  				      int page_start, int page_end)  {  	flush_tlb_kernel_range( -		pcpu_chunk_addr(chunk, pcpu_first_unit_cpu, page_start), -		pcpu_chunk_addr(chunk, pcpu_last_unit_cpu, page_end)); +		pcpu_chunk_addr(chunk, pcpu_low_unit_cpu, page_start), +		pcpu_chunk_addr(chunk, pcpu_high_unit_cpu, page_end));  }  static int __pcpu_map_pages(unsigned long addr, struct page **pages, @@ -284,8 +282,8 @@ static void pcpu_post_map_flush(struct pcpu_chunk *chunk,  				int page_start, int page_end)  {  	flush_cache_vmap( -		pcpu_chunk_addr(chunk, pcpu_first_unit_cpu, page_start), -		pcpu_chunk_addr(chunk, pcpu_last_unit_cpu, page_end)); +		pcpu_chunk_addr(chunk, pcpu_low_unit_cpu, page_start), +		pcpu_chunk_addr(chunk, pcpu_high_unit_cpu, page_end));  }  /** @@ -362,7 +360,6 @@ err_free:   * @chunk: chunk to depopulate   * @off: offset to the area to depopulate   * @size: size of the area to depopulate in bytes - * @flush: whether to flush cache and tlb or not   *   * For each cpu, depopulate and unmap pages [@page_start,@page_end)   * from @chunk.  If @flush is true, vcache is flushed before unmapping @@ -421,7 +418,7 @@ static struct pcpu_chunk *pcpu_create_chunk(void)  		return NULL;  	vms = pcpu_get_vm_areas(pcpu_group_offsets, pcpu_group_sizes, -				pcpu_nr_groups, pcpu_atom_size, GFP_KERNEL); +				pcpu_nr_groups, pcpu_atom_size);  	if (!vms) {  		pcpu_free_chunk(chunk);  		return NULL;  | 
