mlx4: use bitmap library
authorAkinobu Mita <akinobu.mita@gmail.com>
Fri, 27 Aug 2010 19:08:13 +0000 (19:08 +0000)
committerDavid S. Miller <davem@davemloft.net>
Sat, 28 Aug 2010 22:37:04 +0000 (15:37 -0700)
Replace loops calling set_bit() and clear_bit() with bitmap_set() and
bitmap_clear().

Unlike loops calling set_bit() and clear_bit(), bitmap_set() and
bitmap_clear() are not atomic. But this is ok.
Because the bitmap operations are protected by bitmap->lock
except for initialization of the bitmap in mlx4_bitmap_init().

Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com>
Cc: Roland Dreier <rolandd@cisco.com>
Cc: netdev@vger.kernel.org
Cc: "David S. Miller" <davem@davemloft.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/mlx4/alloc.c

index 537997f9443ee792c98bf9eed3c1a1a668739389..8f4bf1f07c11e824e8e21785f122c5d0d66775c5 100644 (file)
@@ -74,7 +74,7 @@ void mlx4_bitmap_free(struct mlx4_bitmap *bitmap, u32 obj)
 
 u32 mlx4_bitmap_alloc_range(struct mlx4_bitmap *bitmap, int cnt, int align)
 {
-       u32 obj, i;
+       u32 obj;
 
        if (likely(cnt == 1 && align == 1))
                return mlx4_bitmap_alloc(bitmap);
@@ -91,8 +91,7 @@ u32 mlx4_bitmap_alloc_range(struct mlx4_bitmap *bitmap, int cnt, int align)
        }
 
        if (obj < bitmap->max) {
-               for (i = 0; i < cnt; i++)
-                       set_bit(obj + i, bitmap->table);
+               bitmap_set(bitmap->table, obj, cnt);
                if (obj == bitmap->last) {
                        bitmap->last = (obj + cnt);
                        if (bitmap->last >= bitmap->max)
@@ -109,13 +108,10 @@ u32 mlx4_bitmap_alloc_range(struct mlx4_bitmap *bitmap, int cnt, int align)
 
 void mlx4_bitmap_free_range(struct mlx4_bitmap *bitmap, u32 obj, int cnt)
 {
-       u32 i;
-
        obj &= bitmap->max + bitmap->reserved_top - 1;
 
        spin_lock(&bitmap->lock);
-       for (i = 0; i < cnt; i++)
-               clear_bit(obj + i, bitmap->table);
+       bitmap_clear(bitmap->table, obj, cnt);
        bitmap->last = min(bitmap->last, obj);
        bitmap->top = (bitmap->top + bitmap->max + bitmap->reserved_top)
                        & bitmap->mask;
@@ -125,8 +121,6 @@ void mlx4_bitmap_free_range(struct mlx4_bitmap *bitmap, u32 obj, int cnt)
 int mlx4_bitmap_init(struct mlx4_bitmap *bitmap, u32 num, u32 mask,
                     u32 reserved_bot, u32 reserved_top)
 {
-       int i;
-
        /* num must be a power of 2 */
        if (num != roundup_pow_of_two(num))
                return -EINVAL;
@@ -142,8 +136,7 @@ int mlx4_bitmap_init(struct mlx4_bitmap *bitmap, u32 num, u32 mask,
        if (!bitmap->table)
                return -ENOMEM;
 
-       for (i = 0; i < reserved_bot; ++i)
-               set_bit(i, bitmap->table);
+       bitmap_set(bitmap->table, 0, reserved_bot);
 
        return 0;
 }