Messages in this thread | | | Subject | Re: [PATCH v9 2/5] genalloc:support allocating specific region | From | Scott Wood <> | Date | Thu, 17 Sep 2015 15:19:44 -0500 |
| |
On Mon, 2015-09-14 at 09:38 +0800, Zhao Qiang wrote: > Add new algo for genalloc, it reserve a specific region of > memory matching the size requirement (no alignment constraint) > > Signed-off-by: Zhao Qiang <qiang.zhao@freescale.com> > --- > 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(unsigned long > *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"?
/** > + * 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().
-Scott
| |