6 #include "../arch/arch.h"
8 #include "../smalloc.h"
11 #if BITS_PER_LONG == 64
13 #elif BITS_PER_LONG == 32
16 #error "Number of arch bits unknown"
19 #define BLOCKS_PER_UNIT (1UL << UNIT_SHIFT)
20 #define BLOCKS_PER_UNIT_MASK (BLOCKS_PER_UNIT - 1)
22 #define firstfree_valid(b) ((b)->first_free != (uint64_t) -1)
26 unsigned long map_size;
31 unsigned int nr_levels;
32 struct bitmap_level *levels;
36 static unsigned long ulog64(unsigned long val, unsigned int log)
44 void bitmap_reset(struct bitmap *bitmap)
48 for (i = 0; i < bitmap->nr_levels; i++) {
49 struct bitmap_level *bl = &bitmap->levels[i];
51 memset(bl->map, 0, bl->map_size * sizeof(unsigned long));
55 void bitmap_free(struct bitmap *bitmap)
62 for (i = 0; i < bitmap->nr_levels; i++)
63 sfree(bitmap->levels[i].map);
65 sfree(bitmap->levels);
69 struct bitmap *bitmap_new(unsigned long nr_bits)
71 struct bitmap *bitmap;
72 unsigned int i, levels;
74 bitmap = smalloc(sizeof(*bitmap));
79 i = (nr_bits + BLOCKS_PER_UNIT - 1) >> UNIT_SHIFT;
81 i = (i + BLOCKS_PER_UNIT - 1) >> UNIT_SHIFT;
85 bitmap->nr_levels = levels;
86 bitmap->levels = smalloc(bitmap->nr_levels * sizeof(struct bitmap_level));
87 bitmap->first_free = 0;
89 for (i = 0; i < bitmap->nr_levels; i++) {
90 struct bitmap_level *bl = &bitmap->levels[i];
93 bl->map_size = (nr_bits + BLOCKS_PER_UNIT - 1) >> UNIT_SHIFT;
94 bl->map = smalloc(bl->map_size * sizeof(unsigned long));
98 nr_bits = (nr_bits + BLOCKS_PER_UNIT - 1) >> UNIT_SHIFT;
101 bitmap_reset(bitmap);
104 for (i = 0; i < bitmap->nr_levels; i++)
105 if (bitmap->levels[i].map)
106 sfree(bitmap->levels[i].map);
108 sfree(bitmap->levels);
112 static int bitmap_handler(struct bitmap *bitmap, uint64_t bit_nr,
113 int (*func)(struct bitmap_level *, unsigned long, unsigned int,
116 struct bitmap_level *bl;
119 for (i = 0; i < bitmap->nr_levels; i++) {
120 unsigned long index = ulog64(bit_nr, i);
121 unsigned long offset = index >> UNIT_SHIFT;
122 unsigned int bit = index & BLOCKS_PER_UNIT_MASK;
124 bl = &bitmap->levels[i];
126 if (func(bl, offset, bit, data))
133 static int bitmap_handler_topdown(struct bitmap *bitmap, uint64_t bit_nr,
134 int (*func)(struct bitmap_level *, unsigned long, unsigned int, void *),
137 struct bitmap_level *bl;
138 int i, level = bitmap->nr_levels;
140 for (i = bitmap->nr_levels - 1; i >= 0; i--) {
141 unsigned long index = ulog64(bit_nr, --level);
142 unsigned long offset = index >> UNIT_SHIFT;
143 unsigned int bit = index & BLOCKS_PER_UNIT_MASK;
145 bl = &bitmap->levels[i];
147 if (func(bl, offset, bit, data))
154 static int bitmap_clear_fn(struct bitmap_level *bl, unsigned long offset,
155 unsigned int bit, void *unused)
157 if (!(bl->map[offset] & (1UL << bit)))
160 bl->map[offset] &= ~(1UL << bit);
164 void bitmap_clear(struct bitmap *bitmap, uint64_t bit_nr)
166 bitmap_handler(bitmap, bit_nr, bitmap_clear_fn, NULL);
169 struct bitmap_set_data {
170 unsigned int nr_bits;
171 unsigned int set_bits;
172 unsigned int fail_ok;
175 static unsigned long bit_masks[] = {
176 0x0000000000000000, 0x0000000000000001, 0x0000000000000003, 0x0000000000000007,
177 0x000000000000000f, 0x000000000000001f, 0x000000000000003f, 0x000000000000007f,
178 0x00000000000000ff, 0x00000000000001ff, 0x00000000000003ff, 0x00000000000007ff,
179 0x0000000000000fff, 0x0000000000001fff, 0x0000000000003fff, 0x0000000000007fff,
180 0x000000000000ffff, 0x000000000001ffff, 0x000000000003ffff, 0x000000000007ffff,
181 0x00000000000fffff, 0x00000000001fffff, 0x00000000003fffff, 0x00000000007fffff,
182 0x0000000000ffffff, 0x0000000001ffffff, 0x0000000003ffffff, 0x0000000007ffffff,
183 0x000000000fffffff, 0x000000001fffffff, 0x000000003fffffff, 0x000000007fffffff,
185 #if BITS_PER_LONG == 64
186 0x00000001ffffffff, 0x00000003ffffffff, 0x00000007ffffffff, 0x0000000fffffffff,
187 0x0000001fffffffff, 0x0000003fffffffff, 0x0000007fffffffff, 0x000000ffffffffff,
188 0x000001ffffffffff, 0x000003ffffffffff, 0x000007ffffffffff, 0x00000fffffffffff,
189 0x00001fffffffffff, 0x00003fffffffffff, 0x00007fffffffffff, 0x0000ffffffffffff,
190 0x0001ffffffffffff, 0x0003ffffffffffff, 0x0007ffffffffffff, 0x000fffffffffffff,
191 0x001fffffffffffff, 0x003fffffffffffff, 0x007fffffffffffff, 0x00ffffffffffffff,
192 0x01ffffffffffffff, 0x03ffffffffffffff, 0x07ffffffffffffff, 0x0fffffffffffffff,
193 0x1fffffffffffffff, 0x3fffffffffffffff, 0x7fffffffffffffff, 0xffffffffffffffff
197 static int bitmap_set_fn(struct bitmap_level *bl, unsigned long offset,
198 unsigned int bit, void *__data)
200 struct bitmap_set_data *data = __data;
201 unsigned long mask, overlap;
202 unsigned int nr_bits;
204 nr_bits = min(data->nr_bits, BLOCKS_PER_UNIT - bit);
206 mask = bit_masks[nr_bits] << bit;
209 * Mask off any potential overlap, only sets contig regions
211 overlap = bl->map[offset] & mask;
212 if (overlap == mask) {
213 assert(data->fail_ok);
218 unsigned long clear_mask = ~(1UL << ffz(~overlap));
221 overlap &= clear_mask;
226 assert(!(bl->map[offset] & mask));
228 bl->map[offset] |= mask;
231 data->set_bits = nr_bits;
234 return bl->map[offset] != -1UL;
237 static void __bitmap_set(struct bitmap *bitmap, uint64_t bit_nr,
238 struct bitmap_set_data *data)
240 unsigned int set_bits, nr_bits = data->nr_bits;
242 if (bitmap->first_free >= bit_nr &&
243 bitmap->first_free < bit_nr + data->nr_bits)
244 bitmap->first_free = -1ULL;
248 bitmap_handler(bitmap, bit_nr, bitmap_set_fn, data);
249 set_bits += data->set_bits;
251 if (data->set_bits != (BLOCKS_PER_UNIT - nr_bits))
254 nr_bits -= data->set_bits;
255 bit_nr += data->set_bits;
257 data->nr_bits = nr_bits;
261 data->set_bits = set_bits;
264 void bitmap_set(struct bitmap *bitmap, uint64_t bit_nr)
266 struct bitmap_set_data data = { .nr_bits = 1, };
268 __bitmap_set(bitmap, bit_nr, &data);
271 unsigned int bitmap_set_nr(struct bitmap *bitmap, uint64_t bit_nr, unsigned int nr_bits)
273 struct bitmap_set_data data = { .nr_bits = nr_bits, };
275 __bitmap_set(bitmap, bit_nr, &data);
276 return data.set_bits;
279 static int bitmap_isset_fn(struct bitmap_level *bl, unsigned long offset,
280 unsigned int bit, void *unused)
282 return (bl->map[offset] & (1UL << bit)) != 0;
285 int bitmap_isset(struct bitmap *bitmap, uint64_t bit_nr)
287 return bitmap_handler_topdown(bitmap, bit_nr, bitmap_isset_fn, NULL);
290 static uint64_t bitmap_find_first_free(struct bitmap *bitmap, unsigned int level,
297 * Start at the bottom, then converge towards first free bit at the top
299 for (i = level; i >= 0; i--) {
300 struct bitmap_level *bl = &bitmap->levels[i];
302 if (index >= bl->map_size) {
307 for (j = index; j < bl->map_size; j++) {
308 if (bl->map[j] == -1UL)
312 * First free bit here is our index into the first
313 * free bit at the next higher level
315 index = (j << UNIT_SHIFT) + ffz(bl->map[j]);
323 uint64_t bitmap_first_free(struct bitmap *bitmap)
325 if (firstfree_valid(bitmap))
326 return bitmap->first_free;
328 bitmap->first_free = bitmap_find_first_free(bitmap, bitmap->nr_levels - 1, 0);
329 return bitmap->first_free;
332 struct bitmap_next_free_data {
334 unsigned long offset;
338 static int bitmap_next_free_fn(struct bitmap_level *bl, unsigned long offset,
339 unsigned int bit, void *__data)
341 struct bitmap_next_free_data *data = __data;
342 uint64_t mask = ~((1UL << ((data->bit & BLOCKS_PER_UNIT_MASK) + 1)) - 1);
344 if (!(mask & bl->map[offset]))
347 if (bl->map[offset] != -1UL) {
348 data->level = bl->level;
349 data->offset = offset;
353 data->bit = (data->bit + BLOCKS_PER_UNIT - 1) / BLOCKS_PER_UNIT;
358 * 'bit_nr' is already set. Find the next free bit after this one.
360 uint64_t bitmap_next_free(struct bitmap *bitmap, uint64_t bit_nr)
362 struct bitmap_next_free_data data = { .level = -1U, .bit = bit_nr, };
364 if (firstfree_valid(bitmap) && bit_nr < bitmap->first_free)
365 return bitmap->first_free;
367 if (!bitmap_handler(bitmap, bit_nr, bitmap_next_free_fn, &data))
368 return bitmap_first_free(bitmap);
370 assert(data.level != -1U);
372 return bitmap_find_first_free(bitmap, data.level, data.offset);