looks good to me. On Sun, Nov 25, 2012 at 3:48 PM, Akinobu Mita <akinobu.m...@gmail.com>wrote:
> The bitmap library provides more efficient functions than accessing > individual bits with bitops. > > This uses bitmap_find_next_zero_area() to find a continuing zero area, > and uses bitmap_set()/bitmap_clear() to set/clear specified bit area. > > Signed-off-by: Akinobu Mita <akinobu.m...@gmail.com> > Cc: Mike Frysinger <vap...@gentoo.org> > Cc: uclinux-dist-devel@blackfin.uclinux.org > --- > arch/blackfin/kernel/dma-mapping.c | 23 +++++++---------------- > 1 file changed, 7 insertions(+), 16 deletions(-) > > diff --git a/arch/blackfin/kernel/dma-mapping.c > b/arch/blackfin/kernel/dma-mapping.c > index e7be653..df437e5 100644 > --- a/arch/blackfin/kernel/dma-mapping.c > +++ b/arch/blackfin/kernel/dma-mapping.c > @@ -13,6 +13,7 @@ > #include <linux/dma-mapping.h> > #include <linux/scatterlist.h> > #include <linux/export.h> > +#include <linux/bitmap.h> > > static spinlock_t dma_page_lock; > static unsigned long *dma_page; > @@ -46,24 +47,17 @@ static inline unsigned int get_pages(size_t size) > static unsigned long __alloc_dma_pages(unsigned int pages) > { > unsigned long ret = 0, flags; > - int i, count = 0; > + unsigned long start; > > if (dma_initialized == 0) > dma_alloc_init(_ramend - DMA_UNCACHED_REGION, _ramend); > > spin_lock_irqsave(&dma_page_lock, flags); > > - for (i = 0; i < dma_pages;) { > - if (test_bit(i++, dma_page) == 0) { > - if (++count == pages) { > - while (count--) > - __set_bit(--i, dma_page); > - > - ret = dma_base + (i << PAGE_SHIFT); > - break; > - } > - } else > - count = 0; > + start = bitmap_find_next_zero_area(dma_page, dma_pages, 0, pages, > 0); > + if (start < dma_pages) { > + ret = dma_base + (start << PAGE_SHIFT); > + bitmap_set(dma_page, start, pages); > } > spin_unlock_irqrestore(&dma_page_lock, flags); > return ret; > @@ -73,7 +67,6 @@ static void __free_dma_pages(unsigned long addr, > unsigned int pages) > { > unsigned long page = (addr - dma_base) >> PAGE_SHIFT; > unsigned long flags; > - int i; > > if ((page + pages) > dma_pages) { > printk(KERN_ERR "%s: freeing outside range.\n", __func__); > @@ -81,9 +74,7 @@ static void __free_dma_pages(unsigned long addr, > unsigned int pages) > } > > spin_lock_irqsave(&dma_page_lock, flags); > - for (i = page; i < page + pages; i++) > - __clear_bit(i, dma_page); > - > + bitmap_clear(dma_page, page, pages); > spin_unlock_irqrestore(&dma_page_lock, flags); > } > > -- > 1.7.11.7 > > _______________________________________________ > Uclinux-dist-devel mailing list > Uclinux-dist-devel@blackfin.uclinux.org > https://blackfin.uclinux.org/mailman/listinfo/uclinux-dist-devel >
_______________________________________________ Uclinux-dist-devel mailing list Uclinux-dist-devel@blackfin.uclinux.org https://blackfin.uclinux.org/mailman/listinfo/uclinux-dist-devel