Lines Matching full:bitmap
43 #include "bitmap.h"
45 static int mlx5_bitmap_init(struct mlx5_bitmap *bitmap, uint32_t num, in mlx5_bitmap_init() argument
48 bitmap->last = 0; in mlx5_bitmap_init()
49 bitmap->top = 0; in mlx5_bitmap_init()
50 bitmap->max = num; in mlx5_bitmap_init()
51 bitmap->avail = num; in mlx5_bitmap_init()
52 bitmap->mask = mask; in mlx5_bitmap_init()
53 bitmap->avail = bitmap->max; in mlx5_bitmap_init()
54 bitmap->table = calloc(BITS_TO_LONGS(bitmap->max), sizeof(uint32_t)); in mlx5_bitmap_init()
55 if (!bitmap->table) in mlx5_bitmap_init()
61 static void bitmap_free_range(struct mlx5_bitmap *bitmap, uint32_t obj, in bitmap_free_range() argument
66 obj &= bitmap->max - 1; in bitmap_free_range()
69 mlx5_clear_bit(obj + i, bitmap->table); in bitmap_free_range()
70 bitmap->last = min(bitmap->last, obj); in bitmap_free_range()
71 bitmap->top = (bitmap->top + bitmap->max) & bitmap->mask; in bitmap_free_range()
72 bitmap->avail += cnt; in bitmap_free_range()
75 static int bitmap_empty(struct mlx5_bitmap *bitmap) in bitmap_empty() argument
77 return (bitmap->avail == bitmap->max) ? 1 : 0; in bitmap_empty()
80 static int bitmap_avail(struct mlx5_bitmap *bitmap) in bitmap_avail() argument
82 return bitmap->avail; in bitmap_avail()
85 static void mlx5_bitmap_cleanup(struct mlx5_bitmap *bitmap) in mlx5_bitmap_cleanup() argument
87 if (bitmap->table) in mlx5_bitmap_cleanup()
88 free(bitmap->table); in mlx5_bitmap_cleanup()
93 mlx5_bitmap_cleanup(&hmem->bitmap); in free_huge_mem()
100 static int mlx5_bitmap_alloc(struct mlx5_bitmap *bitmap) in mlx5_bitmap_alloc() argument
105 obj = mlx5_find_first_zero_bit(bitmap->table, bitmap->max); in mlx5_bitmap_alloc()
106 if (obj < bitmap->max) { in mlx5_bitmap_alloc()
107 mlx5_set_bit(obj, bitmap->table); in mlx5_bitmap_alloc()
108 bitmap->last = (obj + 1); in mlx5_bitmap_alloc()
109 if (bitmap->last == bitmap->max) in mlx5_bitmap_alloc()
110 bitmap->last = 0; in mlx5_bitmap_alloc()
111 obj |= bitmap->top; in mlx5_bitmap_alloc()
117 --bitmap->avail; in mlx5_bitmap_alloc()
122 static uint32_t find_aligned_range(unsigned long *bitmap, in find_aligned_range() argument
131 while ((start < nbits) && mlx5_test_bit(start, bitmap)) in find_aligned_range()
142 if (mlx5_test_bit(i, bitmap)) { in find_aligned_range()
151 static int bitmap_alloc_range(struct mlx5_bitmap *bitmap, int cnt, in bitmap_alloc_range() argument
158 return mlx5_bitmap_alloc(bitmap); in bitmap_alloc_range()
160 if (cnt > bitmap->max) in bitmap_alloc_range()
163 obj = find_aligned_range(bitmap->table, bitmap->last, in bitmap_alloc_range()
164 bitmap->max, cnt, align); in bitmap_alloc_range()
165 if (obj >= bitmap->max) { in bitmap_alloc_range()
166 bitmap->top = (bitmap->top + bitmap->max) & bitmap->mask; in bitmap_alloc_range()
167 obj = find_aligned_range(bitmap->table, 0, bitmap->max, in bitmap_alloc_range()
171 if (obj < bitmap->max) { in bitmap_alloc_range()
173 mlx5_set_bit(obj + i, bitmap->table); in bitmap_alloc_range()
174 if (obj == bitmap->last) { in bitmap_alloc_range()
175 bitmap->last = (obj + cnt); in bitmap_alloc_range()
176 if (bitmap->last >= bitmap->max) in bitmap_alloc_range()
177 bitmap->last = 0; in bitmap_alloc_range()
179 obj |= bitmap->top; in bitmap_alloc_range()
185 bitmap->avail -= cnt; in bitmap_alloc_range()
212 if (mlx5_bitmap_init(&hmem->bitmap, shm_len / MLX5_Q_CHUNK_SIZE, in alloc_huge_mem()
250 if (bitmap_avail(&hmem->bitmap)) { in alloc_huge_buf()
251 buf->base = bitmap_alloc_range(&hmem->bitmap, nchunk, 1); in alloc_huge_buf()
266 buf->base = bitmap_alloc_range(&hmem->bitmap, nchunk, 1); in alloc_huge_buf()
277 if (bitmap_avail(&hmem->bitmap)) in alloc_huge_buf()
297 bitmap_free_range(&hmem->bitmap, buf->base, nchunk); in alloc_huge_buf()
298 if (bitmap_empty(&hmem->bitmap)) { in alloc_huge_buf()
314 bitmap_free_range(&buf->hmem->bitmap, buf->base, nchunk); in free_huge_buf()
315 if (bitmap_empty(&buf->hmem->bitmap)) { in free_huge_buf()