mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-01 02:36:02 +00:00
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);
|
int min_alloc_order, int nid);
|
||||||
extern struct gen_pool *dev_get_gen_pool(struct device *dev);
|
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
|
#ifdef CONFIG_OF
|
||||||
extern struct gen_pool *of_get_named_gen_pool(struct device_node *np,
|
extern struct gen_pool *of_get_named_gen_pool(struct device_node *np,
|
||||||
const char *propname, int index);
|
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);
|
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
|
* gen_pool_avail - get available free space of the pool
|
||||||
* @pool: pool to get available free space
|
* @pool: pool to get available free space
|
||||||
|
Loading…
Reference in New Issue
Block a user