Re: [PATCH v9 2/5] genalloc:support allocating specific region
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> --- > 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 ___ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev
Re: [PATCH v9 2/5] genalloc:support allocating specific region
On Thu, 2015-09-17 at 15:19 -0500, Scott Wood wrote: > 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> > --- > > 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(). Never mind, that doesn't fit with how the algorithm is used by the caller, and unlike genalloc isn't atomic. -Scott ___ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev
[PATCH v9 2/5] genalloc:support allocating specific region
Add new algo for genalloc, it reserve a specific region of memory matching the size requirement (no alignment constraint) Signed-off-by: Zhao Qiang--- 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); + extern unsigned long gen_pool_first_fit_align(unsigned long *map, unsigned long size, unsigned long start, unsigned int nr, void *data, struct gen_pool *pool); diff --git a/lib/genalloc.c b/lib/genalloc.c index b8762b1..87a045e 100644 --- a/lib/genalloc.c +++ b/lib/genalloc.c @@ -554,6 +554,36 @@ unsigned long gen_pool_first_fit_align(unsigned long *map, unsigned long size, EXPORT_SYMBOL(gen_pool_first_fit_align); /** + * 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); + +/** * gen_pool_first_fit_order_align - find the first available region * of memory matching the size requirement. The region will be aligned * to the order of the size specified. -- 2.1.0.27.g96db324 ___ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev