forked from mirrors/linux
		
	mm: kmemleak: check physical address when scan
Check the physical address of objects for its boundary when scan instead
of in kmemleak_*_phys().
Link: https://lkml.kernel.org/r/20220611035551.1823303-5-patrick.wang.shcn@gmail.com
Fixes: 23c2d497de ("mm: kmemleak: take a full lowmem check in kmemleak_*_phys()")
Signed-off-by: Patrick Wang <patrick.wang.shcn@gmail.com>
Suggested-by: Catalin Marinas <catalin.marinas@arm.com>
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
Cc: Yee Lee <yee.lee@mediatek.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
			
			
This commit is contained in:
		
							parent
							
								
									0c24e06119
								
							
						
					
					
						commit
						84c3262991
					
				
					 1 changed files with 14 additions and 3 deletions
				
			
		|  | @ -1184,7 +1184,7 @@ void __ref kmemleak_alloc_phys(phys_addr_t phys, size_t size, gfp_t gfp) | |||
| { | ||||
| 	pr_debug("%s(0x%pa, %zu)\n", __func__, &phys, size); | ||||
| 
 | ||||
| 	if (PHYS_PFN(phys) >= min_low_pfn && PHYS_PFN(phys) < max_low_pfn) | ||||
| 	if (kmemleak_enabled) | ||||
| 		/*
 | ||||
| 		 * Create object with OBJECT_PHYS flag and | ||||
| 		 * assume min_count 0. | ||||
|  | @ -1204,7 +1204,7 @@ void __ref kmemleak_free_part_phys(phys_addr_t phys, size_t size) | |||
| { | ||||
| 	pr_debug("%s(0x%pa)\n", __func__, &phys); | ||||
| 
 | ||||
| 	if (PHYS_PFN(phys) >= min_low_pfn && PHYS_PFN(phys) < max_low_pfn) | ||||
| 	if (kmemleak_enabled) | ||||
| 		delete_object_part((unsigned long)phys, size, true); | ||||
| } | ||||
| EXPORT_SYMBOL(kmemleak_free_part_phys); | ||||
|  | @ -1218,7 +1218,7 @@ void __ref kmemleak_ignore_phys(phys_addr_t phys) | |||
| { | ||||
| 	pr_debug("%s(0x%pa)\n", __func__, &phys); | ||||
| 
 | ||||
| 	if (PHYS_PFN(phys) >= min_low_pfn && PHYS_PFN(phys) < max_low_pfn) | ||||
| 	if (kmemleak_enabled) | ||||
| 		make_black_object((unsigned long)phys, true); | ||||
| } | ||||
| EXPORT_SYMBOL(kmemleak_ignore_phys); | ||||
|  | @ -1493,6 +1493,17 @@ static void kmemleak_scan(void) | |||
| 			dump_object_info(object); | ||||
| 		} | ||||
| #endif | ||||
| 
 | ||||
| 		/* ignore objects outside lowmem (paint them black) */ | ||||
| 		if ((object->flags & OBJECT_PHYS) && | ||||
| 		   !(object->flags & OBJECT_NO_SCAN)) { | ||||
| 			unsigned long phys = object->pointer; | ||||
| 
 | ||||
| 			if (PHYS_PFN(phys) < min_low_pfn || | ||||
| 			    PHYS_PFN(phys + object->size) >= max_low_pfn) | ||||
| 				__paint_it(object, KMEMLEAK_BLACK); | ||||
| 		} | ||||
| 
 | ||||
| 		/* reset the reference count (whiten the object) */ | ||||
| 		object->count = 0; | ||||
| 		if (color_gray(object) && get_object(object)) | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Patrick Wang
						Patrick Wang