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); | 	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 | 		 * Create object with OBJECT_PHYS flag and | ||||||
| 		 * assume min_count 0. | 		 * 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); | 	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); | 		delete_object_part((unsigned long)phys, size, true); | ||||||
| } | } | ||||||
| EXPORT_SYMBOL(kmemleak_free_part_phys); | 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); | 	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); | 		make_black_object((unsigned long)phys, true); | ||||||
| } | } | ||||||
| EXPORT_SYMBOL(kmemleak_ignore_phys); | EXPORT_SYMBOL(kmemleak_ignore_phys); | ||||||
|  | @ -1493,6 +1493,17 @@ static void kmemleak_scan(void) | ||||||
| 			dump_object_info(object); | 			dump_object_info(object); | ||||||
| 		} | 		} | ||||||
| #endif | #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) */ | 		/* reset the reference count (whiten the object) */ | ||||||
| 		object->count = 0; | 		object->count = 0; | ||||||
| 		if (color_gray(object) && get_object(object)) | 		if (color_gray(object) && get_object(object)) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Patrick Wang
						Patrick Wang