Lines Matching refs:bitmap

38 #include <linux/bitmap.h>
44 u32 mlx4_bitmap_alloc(struct mlx4_bitmap *bitmap)
48 spin_lock(&bitmap->lock);
50 obj = find_next_zero_bit(bitmap->table, bitmap->max, bitmap->last);
51 if (obj >= bitmap->max) {
52 bitmap->top = (bitmap->top + bitmap->max + bitmap->reserved_top)
53 & bitmap->mask;
54 obj = find_first_zero_bit(bitmap->table, bitmap->max);
57 if (obj < bitmap->max) {
58 set_bit(obj, bitmap->table);
59 bitmap->last = (obj + 1);
60 if (bitmap->last == bitmap->max)
61 bitmap->last = 0;
62 obj |= bitmap->top;
67 --bitmap->avail;
69 spin_unlock(&bitmap->lock);
74 void mlx4_bitmap_free(struct mlx4_bitmap *bitmap, u32 obj, int use_rr)
76 mlx4_bitmap_free_range(bitmap, obj, 1, use_rr);
79 static unsigned long find_aligned_range(unsigned long *bitmap,
88 while ((start < nbits) && (test_bit(start, bitmap) ||
100 if (test_bit(i, bitmap) || ((u32)i & skip_mask)) {
109 u32 mlx4_bitmap_alloc_range(struct mlx4_bitmap *bitmap, int cnt,
115 return mlx4_bitmap_alloc(bitmap);
117 spin_lock(&bitmap->lock);
119 obj = find_aligned_range(bitmap->table, bitmap->last,
120 bitmap->max, cnt, align, skip_mask);
121 if (obj >= bitmap->max) {
122 bitmap->top = (bitmap->top + bitmap->max + bitmap->reserved_top)
123 & bitmap->mask;
124 obj = find_aligned_range(bitmap->table, 0, bitmap->max,
128 if (obj < bitmap->max) {
129 bitmap_set(bitmap->table, obj, cnt);
130 if (obj == bitmap->last) {
131 bitmap->last = (obj + cnt);
132 if (bitmap->last >= bitmap->max)
133 bitmap->last = 0;
135 obj |= bitmap->top;
140 bitmap->avail -= cnt;
142 spin_unlock(&bitmap->lock);
147 u32 mlx4_bitmap_avail(struct mlx4_bitmap *bitmap)
149 return bitmap->avail;
152 static u32 mlx4_bitmap_masked_value(struct mlx4_bitmap *bitmap, u32 obj)
154 return obj & (bitmap->max + bitmap->reserved_top - 1);
157 void mlx4_bitmap_free_range(struct mlx4_bitmap *bitmap, u32 obj, int cnt,
160 obj &= bitmap->max + bitmap->reserved_top - 1;
162 spin_lock(&bitmap->lock);
164 bitmap->last = min(bitmap->last, obj);
165 bitmap->top = (bitmap->top + bitmap->max + bitmap->reserved_top)
166 & bitmap->mask;
168 bitmap_clear(bitmap->table, obj, cnt);
169 bitmap->avail += cnt;
170 spin_unlock(&bitmap->lock);
173 int mlx4_bitmap_init(struct mlx4_bitmap *bitmap, u32 num, u32 mask,
180 bitmap->last = 0;
181 bitmap->top = 0;
182 bitmap->max = num - reserved_top;
183 bitmap->mask = mask;
184 bitmap->reserved_top = reserved_top;
185 bitmap->avail = num - reserved_top - reserved_bot;
186 bitmap->effective_len = bitmap->avail;
187 spin_lock_init(&bitmap->lock);
188 bitmap->table = bitmap_zalloc(bitmap->max, GFP_KERNEL);
189 if (!bitmap->table)
192 bitmap_set(bitmap->table, 0, reserved_bot);
197 void mlx4_bitmap_cleanup(struct mlx4_bitmap *bitmap)
199 bitmap_free(bitmap->table);
217 struct mlx4_bitmap *bitmap;
242 struct mlx4_bitmap *bitmap,
248 u32 mask = mlx4_bitmap_masked_value(bitmap, (u32)-1);
256 zone->bitmap = bitmap;
310 u32 cur_mask = mlx4_bitmap_masked_value(it->bitmap, (u32)-1);
344 res = mlx4_bitmap_alloc_range(zone->bitmap, count,
362 res = mlx4_bitmap_alloc_range(it->bitmap, count,
382 res = mlx4_bitmap_alloc_range(it->bitmap, count,
401 res = mlx4_bitmap_alloc_range(curr_node->bitmap, count,
421 mlx4_bitmap_free_range(zone->bitmap, obj - zone->offset, count, zone->use_rr);
441 struct mlx4_bitmap *bitmap;
447 bitmap = zone == NULL ? NULL : zone->bitmap;
451 return bitmap;
488 * the bigger bitmap.
494 if (mobj < zone->bitmap->max) {
495 u32 curr_dist = zone->bitmap->effective_len;