lib/genalloc.c: add genpool range check function
After allocating an address from a particular genpool, there is no good way to verify if that address actually belongs to a genpool. Introduce addr_in_gen_pool which will return if an address plus size falls completely within the genpool range. Signed-off-by: Laura Abbott <lauraa@codeaurora.org> Acked-by: Will Deacon <will.deacon@arm.com> Reviewed-by: Olof Johansson <olof@lixom.net> Reviewed-by: Catalin Marinas <catalin.marinas@arm.com> Cc: Arnd Bergmann <arnd@arndb.de> Cc: David Riley <davidriley@chromium.org> Cc: Ritesh Harjain <ritesh.harjani@gmail.com> Cc: Russell King <linux@arm.linux.org.uk> Cc: Thierry Reding <thierry.reding@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
		
							parent
							
								
									505e3be6c0
								
							
						
					
					
						commit
						9efb3a421d
					
				| @ -121,6 +121,9 @@ extern struct gen_pool *devm_gen_pool_create(struct device *dev, | ||||
| 		int min_alloc_order, int nid); | ||||
| extern struct gen_pool *dev_get_gen_pool(struct device *dev); | ||||
| 
 | ||||
| bool addr_in_gen_pool(struct gen_pool *pool, unsigned long start, | ||||
| 			size_t size); | ||||
| 
 | ||||
| #ifdef CONFIG_OF | ||||
| extern struct gen_pool *of_get_named_gen_pool(struct device_node *np, | ||||
| 	const char *propname, int index); | ||||
|  | ||||
| @ -402,6 +402,35 @@ void gen_pool_for_each_chunk(struct gen_pool *pool, | ||||
| } | ||||
| EXPORT_SYMBOL(gen_pool_for_each_chunk); | ||||
| 
 | ||||
| /**
 | ||||
|  * addr_in_gen_pool - checks if an address falls within the range of a pool | ||||
|  * @pool:	the generic memory pool | ||||
|  * @start:	start address | ||||
|  * @size:	size of the region | ||||
|  * | ||||
|  * Check if the range of addresses falls within the specified pool. Returns | ||||
|  * true if the entire range is contained in the pool and false otherwise. | ||||
|  */ | ||||
| bool addr_in_gen_pool(struct gen_pool *pool, unsigned long start, | ||||
| 			size_t size) | ||||
| { | ||||
| 	bool found = false; | ||||
| 	unsigned long end = start + size; | ||||
| 	struct gen_pool_chunk *chunk; | ||||
| 
 | ||||
| 	rcu_read_lock(); | ||||
| 	list_for_each_entry_rcu(chunk, &(pool)->chunks, next_chunk) { | ||||
| 		if (start >= chunk->start_addr && start <= chunk->end_addr) { | ||||
| 			if (end <= chunk->end_addr) { | ||||
| 				found = true; | ||||
| 				break; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	rcu_read_unlock(); | ||||
| 	return found; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * gen_pool_avail - get available free space of the pool | ||||
|  * @pool: pool to get available free space | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user