Re: [PATCH v9 2/5] genalloc:support allocating specific region
From: Scott Wood <hidden>
Date: 2015-09-17 20:25:19
Also in:
lkml
On Thu, 2015-09-17 at 15:19 -0500, Scott Wood wrote:
On Mon, 2015-09-14 at 09:38 +0800, Zhao Qiang wrote:quoted
Add new algo for genalloc, it reserve a specific region of memory matching the size requirement (no alignment constraint) Signed-off-by: Zhao Qiang <redacted> --- Changes for v9: - reserve a specific region, if the return region - is not during the specific region, return fail. include/linux/genalloc.h | 11 +++++++++++ lib/genalloc.c | 30 ++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+)diff --git a/include/linux/genalloc.h b/include/linux/genalloc.h index aaf3dc2..85e3b2f 100644 --- a/include/linux/genalloc.h +++ b/include/linux/genalloc.h@@ -82,6 +82,13 @@ struct genpool_data_align { int align; /* alignment by bytes for starting address*/ }; +/* + * gen_pool data descriptor for gen_pool_fixed_fit. + */ +struct genpool_data_fixed { + unsigned long offset; /* The offset of the specific region */ +}; + extern struct gen_pool *gen_pool_create(int, int); extern phys_addr_t gen_pool_virt_to_phys(struct gen_pool *pool, unsigned long); extern int gen_pool_add_virt(struct gen_pool *, unsigned long, phys_addr_t,@@ -121,6 +128,10 @@ extern unsigned long gen_pool_first_fit(unsignedlong *map, unsigned long size, unsigned long start, unsigned int nr, void *data, struct gen_pool *pool); +extern unsigned long gen_pool_fixed_fit(unsigned long *map, + unsigned long size, unsigned long start, unsigned int nr, + void *data, struct gen_pool *pool); +"fixed fit" doesn't make much sense... How about "fixed_alloc"? /**quoted
+ * gen_pool_fixed_fit - reserve a specific region of + * matching the size requirement (no alignment constraint) + * @map: The address to base the search on + * @size: The bitmap size in bits + * @start: The bitnumber to start searching at + * @nr: The number of zeroed bits we're looking for + * @data: data for alignment + * @pool: pool to get order from + */ +unsigned long gen_pool_fixed_fit(unsigned long *map, unsigned long size, + unsigned long start, unsigned int nr, void *data, + struct gen_pool *pool) +{ + struct genpool_data_fixed *fixed_data; + int order; + unsigned long offset_bit; + unsigned long start_bit; + + fixed_data = data; + order = pool->min_alloc_order; + offset_bit = fixed_data->offset >> order; + start_bit = bitmap_find_next_zero_area(map, size, + start + offset_bit, nr, 0); + if (start_bit != offset_bit) + start_bit = size; + return start_bit; +} +EXPORT_SYMBOL(gen_pool_fixed_fit);This would be simpler with bitmap_allocate_region().
Never mind, that doesn't fit with how the algorithm is used by the caller, and unlike genalloc isn't atomic. -Scott