[PATCH 2/2] rheap: move rheap.c from arch/powerpc/lib/ to lib/

Zhao Qiang qiang.zhao at freescale.com
Wed Jul 8 17:25:02 AEST 2015


So I will add two func for my use, do you think it is ok?
I need to align the address of allocated muram.
And I will set algo = gen_pool_first_fit_align.

+unsigned long gen_pool_alloc_align(struct gen_pool *pool, size_t size,
+               unsigned long align)
+{
+       struct gen_pool_chunk *chunk;
+       unsigned long addr = 0;
+       unsigned long align_mask;
+       int order = pool->min_alloc_order;
+       int nbits, start_bit = 0, end_bit, remain;
+
+#ifndef CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG
+       BUG_ON(in_nmi());
+#endif
+
+       if (size == 0)
+               return 0;
+
+       align_mask = ((align + (1UL << order) - 1) >> order) - 1;
+       nbits = (size + (1UL << order) - 1) >> order;
+       rcu_read_lock();
+       list_for_each_entry_rcu(chunk, &pool->chunks, next_chunk) {
+               if (size > atomic_read(&chunk->avail))
+                       continue;
+
+               end_bit = chunk_size(chunk) >> order;
+retry:
+               start_bit = pool->algo(chunk->bits, end_bit, start_bit, nbits,
+                               pool->data, align_mask);
+               if (start_bit >= end_bit)
+                       continue;
+               remain = bitmap_set_ll(chunk->bits, start_bit, nbits);
+               if (remain) {
+                       remain = bitmap_clear_ll(chunk->bits, start_bit,
+                                                nbits - remain);
+                       BUG_ON(remain);
+                       goto retry;
+               }
+
+               addr = chunk->start_addr + ((unsigned long)start_bit << order);
+               size = nbits << order;
+               atomic_sub(size, &chunk->avail);
+               break;
+       }
+       rcu_read_unlock();
+       return addr;
+}
+EXPORT_SYMBOL(gen_pool_alloc);

+ * gen_pool_first_fit_align - find the first available region
+ * of memory matching the size requirement. The region will be aligned
+ * to the order of the size specified.
+ * @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: additional data - unused
+ */
+unsigned long gen_pool_first_fit_align(unsigned long *map,
+               unsigned long size, unsigned long start,
+               unsigned int nr, void *data, unsigned long align_mask)
+{
+       return bitmap_find_next_zero_area(map, size, start, nr, align_mask);
+}
+EXPORT_SYMBOL(gen_pool_first_fit_align);
+

Best Regards
Zhao Qiang


> -----Original Message-----
> From: Wood Scott-B07421
> Sent: Wednesday, July 08, 2015 11:28 AM
> To: Zhao Qiang-B45475
> Cc: linuxppc-dev at lists.ozlabs.org; Xie Xiaobo-R63061
> Subject: Re: [PATCH 2/2] rheap: move rheap.c from arch/powerpc/lib/ to
> lib/
> 
> On Tue, 2015-07-07 at 22:26 -0500, Zhao Qiang-B45475 wrote:
> > Now the point is, genalloc is not so proper to qe muram while rheap is
> > written to manage muram,
> 
> rheap is not specific to muram.
> 
> > if use genalloc instead of rheap, there will be amounts of work to do.
> 
> Not much.  I think I've spent more time responding to continual e-mails
> on this topic than it would have taken to convert it. :-P
> 
> > I have a suggestion, how about to put rheap under drivers/soc/qe,
> > because rheap is To manage muram when it is added to sdk.
> 
> No.
> 
> -Scott



More information about the Linuxppc-dev mailing list