mirror of
https://github.com/torvalds/linux.git
synced 2026-06-08 14:42:37 +02: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>
(cherry picked from commit 9efb3a421d)
Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
b4382e715d
commit
e4d45c70b7
|
|
@ -117,6 +117,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);
|
||||
|
|
|
|||
|
|
@ -368,6 +368,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