]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/net/mlx4/alloc.c
mlx4_core: maintain available field in bitmap allocator
[karo-tx-linux.git] / drivers / net / mlx4 / alloc.c
index 3a4277f6fac4171991a24a9ebd1de3f032a96636..116cae334dadc91ca52ce774703284c9b3cd66e7 100644 (file)
@@ -62,6 +62,9 @@ u32 mlx4_bitmap_alloc(struct mlx4_bitmap *bitmap)
        } else
                obj = -1;
 
+       if (obj != -1)
+               --bitmap->avail;
+
        spin_unlock(&bitmap->lock);
 
        return obj;
@@ -101,11 +104,19 @@ u32 mlx4_bitmap_alloc_range(struct mlx4_bitmap *bitmap, int cnt, int align)
        } else
                obj = -1;
 
+       if (obj != -1)
+               bitmap->avail -= cnt;
+
        spin_unlock(&bitmap->lock);
 
        return obj;
 }
 
+u32 mlx4_bitmap_avail(struct mlx4_bitmap *bitmap)
+{
+       return bitmap->avail;
+}
+
 void mlx4_bitmap_free_range(struct mlx4_bitmap *bitmap, u32 obj, int cnt)
 {
        obj &= bitmap->max + bitmap->reserved_top - 1;
@@ -115,6 +126,7 @@ void mlx4_bitmap_free_range(struct mlx4_bitmap *bitmap, u32 obj, int cnt)
        bitmap->last = min(bitmap->last, obj);
        bitmap->top = (bitmap->top + bitmap->max + bitmap->reserved_top)
                        & bitmap->mask;
+       bitmap->avail += cnt;
        spin_unlock(&bitmap->lock);
 }
 
@@ -130,6 +142,7 @@ int mlx4_bitmap_init(struct mlx4_bitmap *bitmap, u32 num, u32 mask,
        bitmap->max  = num - reserved_top;
        bitmap->mask = mask;
        bitmap->reserved_top = reserved_top;
+       bitmap->avail = num - reserved_top - reserved_bot;
        spin_lock_init(&bitmap->lock);
        bitmap->table = kzalloc(BITS_TO_LONGS(bitmap->max) *
                                sizeof (long), GFP_KERNEL);