Lines Matching refs:bitmap

37 #include <linux/bitmap.h>
43 u32 mlx4_bitmap_alloc(struct mlx4_bitmap *bitmap)
47 spin_lock(&bitmap->lock);
49 obj = find_next_zero_bit(bitmap->table, bitmap->max, bitmap->last);
50 if (obj >= bitmap->max) {
51 bitmap->top = (bitmap->top + bitmap->max + bitmap->reserved_top)
52 & bitmap->mask;
53 obj = find_first_zero_bit(bitmap->table, bitmap->max);
56 if (obj < bitmap->max) {
57 set_bit(obj, bitmap->table);
58 bitmap->last = (obj + 1);
59 if (bitmap->last == bitmap->max)
60 bitmap->last = 0;
61 obj |= bitmap->top;
66 --bitmap->avail;
68 spin_unlock(&bitmap->lock);
73 void mlx4_bitmap_free(struct mlx4_bitmap *bitmap, u32 obj)
75 mlx4_bitmap_free_range(bitmap, obj, 1);
78 static unsigned long find_aligned_range(unsigned long *bitmap,
87 while ((start < nbits) && test_bit(start, bitmap))
98 if (test_bit(i, bitmap)) {
107 u32 mlx4_bitmap_alloc_range(struct mlx4_bitmap *bitmap, int cnt, int align)
112 return mlx4_bitmap_alloc(bitmap);
114 spin_lock(&bitmap->lock);
116 obj = find_aligned_range(bitmap->table, bitmap->last,
117 bitmap->max, cnt, align);
118 if (obj >= bitmap->max) {
119 bitmap->top = (bitmap->top + bitmap->max + bitmap->reserved_top)
120 & bitmap->mask;
121 obj = find_aligned_range(bitmap->table, 0, bitmap->max,
125 if (obj < bitmap->max) {
127 set_bit(obj + i, bitmap->table);
128 if (obj == bitmap->last) {
129 bitmap->last = (obj + cnt);
130 if (bitmap->last >= bitmap->max)
131 bitmap->last = 0;
133 obj |= bitmap->top;
138 bitmap->avail -= cnt;
140 spin_unlock(&bitmap->lock);
145 u32 mlx4_bitmap_avail(struct mlx4_bitmap *bitmap)
147 return bitmap->avail;
150 void mlx4_bitmap_free_range(struct mlx4_bitmap *bitmap, u32 obj, int cnt)
154 obj &= bitmap->max + bitmap->reserved_top - 1;
156 spin_lock(&bitmap->lock);
158 clear_bit(obj + i, bitmap->table);
159 bitmap->last = min(bitmap->last, obj);
160 bitmap->top = (bitmap->top + bitmap->max + bitmap->reserved_top)
161 & bitmap->mask;
162 bitmap->avail += cnt;
163 spin_unlock(&bitmap->lock);
166 int mlx4_bitmap_init(struct mlx4_bitmap *bitmap, u32 num, u32 mask,
175 bitmap->last = 0;
176 bitmap->top = 0;
177 bitmap->max = num - reserved_top;
178 bitmap->mask = mask;
179 bitmap->reserved_top = reserved_top;
180 bitmap->avail = num - reserved_top - reserved_bot;
181 spin_lock_init(&bitmap->lock);
182 bitmap->table = kzalloc(BITS_TO_LONGS(bitmap->max) *
184 if (!bitmap->table)
188 set_bit(i, bitmap->table);
193 void mlx4_bitmap_cleanup(struct mlx4_bitmap *bitmap)
195 kfree(bitmap->table);