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

Reply via email to