diff options
Diffstat (limited to 'mm/vmalloc.c')
| -rw-r--r-- | mm/vmalloc.c | 35 | 
1 files changed, 26 insertions, 9 deletions
diff --git a/mm/vmalloc.c b/mm/vmalloc.c index dd6cdb201195..ccaa461998f3 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c @@ -320,6 +320,9 @@ int ioremap_page_range(unsigned long addr, unsigned long end,  	err = vmap_range_noflush(addr, end, phys_addr, pgprot_nx(prot),  				 ioremap_max_page_shift);  	flush_cache_vmap(addr, end); +	if (!err) +		kmsan_ioremap_page_range(addr, end, phys_addr, prot, +					 ioremap_max_page_shift);  	return err;  } @@ -416,7 +419,7 @@ static void vunmap_p4d_range(pgd_t *pgd, unsigned long addr, unsigned long end,   *   * This is an internal function only. Do not use outside mm/.   */ -void vunmap_range_noflush(unsigned long start, unsigned long end) +void __vunmap_range_noflush(unsigned long start, unsigned long end)  {  	unsigned long next;  	pgd_t *pgd; @@ -438,6 +441,12 @@ void vunmap_range_noflush(unsigned long start, unsigned long end)  		arch_sync_kernel_mappings(start, end);  } +void vunmap_range_noflush(unsigned long start, unsigned long end) +{ +	kmsan_vunmap_range_noflush(start, end); +	__vunmap_range_noflush(start, end); +} +  /**   * vunmap_range - unmap kernel virtual addresses   * @addr: start of the VM area to unmap @@ -575,7 +584,7 @@ static int vmap_small_pages_range_noflush(unsigned long addr, unsigned long end,   *   * This is an internal function only. Do not use outside mm/.   */ -int vmap_pages_range_noflush(unsigned long addr, unsigned long end, +int __vmap_pages_range_noflush(unsigned long addr, unsigned long end,  		pgprot_t prot, struct page **pages, unsigned int page_shift)  {  	unsigned int i, nr = (end - addr) >> PAGE_SHIFT; @@ -590,7 +599,7 @@ int vmap_pages_range_noflush(unsigned long addr, unsigned long end,  		int err;  		err = vmap_range_noflush(addr, addr + (1UL << page_shift), -					__pa(page_address(pages[i])), prot, +					page_to_phys(pages[i]), prot,  					page_shift);  		if (err)  			return err; @@ -601,6 +610,13 @@ int vmap_pages_range_noflush(unsigned long addr, unsigned long end,  	return 0;  } +int vmap_pages_range_noflush(unsigned long addr, unsigned long end, +		pgprot_t prot, struct page **pages, unsigned int page_shift) +{ +	kmsan_vmap_pages_range_noflush(addr, end, prot, pages, page_shift); +	return __vmap_pages_range_noflush(addr, end, prot, pages, page_shift); +} +  /**   * vmap_pages_range - map pages to a kernel virtual address   * @addr: start of the VM area to map @@ -1300,12 +1316,12 @@ find_vmap_lowest_match(struct rb_root *root, unsigned long size,  #include <linux/random.h>  static struct vmap_area * -find_vmap_lowest_linear_match(unsigned long size, +find_vmap_lowest_linear_match(struct list_head *head, unsigned long size,  	unsigned long align, unsigned long vstart)  {  	struct vmap_area *va; -	list_for_each_entry(va, &free_vmap_area_list, list) { +	list_for_each_entry(va, head, list) {  		if (!is_within_this_va(va, size, align, vstart))  			continue; @@ -1316,7 +1332,8 @@ find_vmap_lowest_linear_match(unsigned long size,  }  static void -find_vmap_lowest_match_check(unsigned long size, unsigned long align) +find_vmap_lowest_match_check(struct rb_root *root, struct list_head *head, +			     unsigned long size, unsigned long align)  {  	struct vmap_area *va_1, *va_2;  	unsigned long vstart; @@ -1325,8 +1342,8 @@ find_vmap_lowest_match_check(unsigned long size, unsigned long align)  	get_random_bytes(&rnd, sizeof(rnd));  	vstart = VMALLOC_START + rnd; -	va_1 = find_vmap_lowest_match(size, align, vstart, false); -	va_2 = find_vmap_lowest_linear_match(size, align, vstart); +	va_1 = find_vmap_lowest_match(root, size, align, vstart, false); +	va_2 = find_vmap_lowest_linear_match(head, size, align, vstart);  	if (va_1 != va_2)  		pr_emerg("not lowest: t: 0x%p, l: 0x%p, v: 0x%lx\n", @@ -1513,7 +1530,7 @@ __alloc_vmap_area(struct rb_root *root, struct list_head *head,  		return vend;  #if DEBUG_AUGMENT_LOWEST_MATCH_CHECK -	find_vmap_lowest_match_check(size, align); +	find_vmap_lowest_match_check(root, head, size, align);  #endif  	return nva_start_addr;  | 
