2 * Bitmap of bitmaps, where each layer is number-of-bits-per-word smaller than
3 * the previous. Hence an 'axmap', since we axe each previous layer into a
4 * much smaller piece. I swear, that is why it's named like that. It has
5 * nothing to do with anything remotely narcissistic.
7 * A set bit at layer N indicates a full word at layer N-1, and so forth. As
8 * the bitmap becomes progressively more full, checking for existence
9 * becomes cheaper (since fewer layers are walked, making it a lot more
10 * cache friendly) and locating the next free space likewise.
12 * Axmaps get pretty close to optimal (1 bit per block) space usage, since
13 * layers quickly diminish in size. Doing the size math is straight forward,
14 * since we have log64(blocks) layers of maps. For 20000 blocks, overhead
15 * is roughly 1.9%, or 1.019 bits per block. The number quickly converges
16 * towards 1.0158, or 1.58% of overhead.
23 #include "../arch/arch.h"
25 #include "../minmax.h"
27 #if BITS_PER_LONG == 64
29 #elif BITS_PER_LONG == 32
32 #error "Number of arch bits unknown"
35 #define BLOCKS_PER_UNIT (1U << UNIT_SHIFT)
36 #define BLOCKS_PER_UNIT_MASK (BLOCKS_PER_UNIT - 1)
38 #define firstfree_valid(b) ((b)->first_free != (uint64_t) -1)
42 unsigned long map_size;
47 unsigned int nr_levels;
48 struct axmap_level *levels;
53 static unsigned long ulog64(unsigned long val, unsigned int log)
61 void axmap_reset(struct axmap *axmap)
65 for (i = 0; i < axmap->nr_levels; i++) {
66 struct axmap_level *al = &axmap->levels[i];
68 memset(al->map, 0, al->map_size * sizeof(unsigned long));
71 axmap->first_free = 0;
74 void axmap_free(struct axmap *axmap)
81 for (i = 0; i < axmap->nr_levels; i++)
82 free(axmap->levels[i].map);
88 struct axmap *axmap_new(unsigned long nr_bits)
91 unsigned int i, levels;
93 axmap = malloc(sizeof(*axmap));
98 i = (nr_bits + BLOCKS_PER_UNIT - 1) >> UNIT_SHIFT;
100 i = (i + BLOCKS_PER_UNIT - 1) >> UNIT_SHIFT;
104 axmap->nr_levels = levels;
105 axmap->levels = malloc(axmap->nr_levels * sizeof(struct axmap_level));
106 axmap->nr_bits = nr_bits;
108 for (i = 0; i < axmap->nr_levels; i++) {
109 struct axmap_level *al = &axmap->levels[i];
112 al->map_size = (nr_bits + BLOCKS_PER_UNIT - 1) >> UNIT_SHIFT;
113 al->map = malloc(al->map_size * sizeof(unsigned long));
117 nr_bits = (nr_bits + BLOCKS_PER_UNIT - 1) >> UNIT_SHIFT;
123 for (i = 0; i < axmap->nr_levels; i++)
124 if (axmap->levels[i].map)
125 free(axmap->levels[i].map);
132 static bool axmap_handler(struct axmap *axmap, uint64_t bit_nr,
133 bool (*func)(struct axmap_level *, unsigned long, unsigned int,
136 struct axmap_level *al;
139 for (i = 0; i < axmap->nr_levels; i++) {
140 unsigned long index = ulog64(bit_nr, i);
141 unsigned long offset = index >> UNIT_SHIFT;
142 unsigned int bit = index & BLOCKS_PER_UNIT_MASK;
144 al = &axmap->levels[i];
146 if (func(al, offset, bit, data))
153 static bool axmap_handler_topdown(struct axmap *axmap, uint64_t bit_nr,
154 bool (*func)(struct axmap_level *, unsigned long, unsigned int, void *),
157 struct axmap_level *al;
158 int i, level = axmap->nr_levels;
160 for (i = axmap->nr_levels - 1; i >= 0; i--) {
161 unsigned long index = ulog64(bit_nr, --level);
162 unsigned long offset = index >> UNIT_SHIFT;
163 unsigned int bit = index & BLOCKS_PER_UNIT_MASK;
165 al = &axmap->levels[i];
167 if (func(al, offset, bit, data))
174 static bool axmap_clear_fn(struct axmap_level *al, unsigned long offset,
175 unsigned int bit, void *unused)
177 if (!(al->map[offset] & (1UL << bit)))
180 al->map[offset] &= ~(1UL << bit);
184 void axmap_clear(struct axmap *axmap, uint64_t bit_nr)
186 axmap_handler(axmap, bit_nr, axmap_clear_fn, NULL);
189 struct axmap_set_data {
190 unsigned int nr_bits;
191 unsigned int set_bits;
194 static unsigned long bit_masks[] = {
195 0x0000000000000000, 0x0000000000000001, 0x0000000000000003, 0x0000000000000007,
196 0x000000000000000f, 0x000000000000001f, 0x000000000000003f, 0x000000000000007f,
197 0x00000000000000ff, 0x00000000000001ff, 0x00000000000003ff, 0x00000000000007ff,
198 0x0000000000000fff, 0x0000000000001fff, 0x0000000000003fff, 0x0000000000007fff,
199 0x000000000000ffff, 0x000000000001ffff, 0x000000000003ffff, 0x000000000007ffff,
200 0x00000000000fffff, 0x00000000001fffff, 0x00000000003fffff, 0x00000000007fffff,
201 0x0000000000ffffff, 0x0000000001ffffff, 0x0000000003ffffff, 0x0000000007ffffff,
202 0x000000000fffffff, 0x000000001fffffff, 0x000000003fffffff, 0x000000007fffffff,
204 #if BITS_PER_LONG == 64
205 0x00000001ffffffff, 0x00000003ffffffff, 0x00000007ffffffff, 0x0000000fffffffff,
206 0x0000001fffffffff, 0x0000003fffffffff, 0x0000007fffffffff, 0x000000ffffffffff,
207 0x000001ffffffffff, 0x000003ffffffffff, 0x000007ffffffffff, 0x00000fffffffffff,
208 0x00001fffffffffff, 0x00003fffffffffff, 0x00007fffffffffff, 0x0000ffffffffffff,
209 0x0001ffffffffffff, 0x0003ffffffffffff, 0x0007ffffffffffff, 0x000fffffffffffff,
210 0x001fffffffffffff, 0x003fffffffffffff, 0x007fffffffffffff, 0x00ffffffffffffff,
211 0x01ffffffffffffff, 0x03ffffffffffffff, 0x07ffffffffffffff, 0x0fffffffffffffff,
212 0x1fffffffffffffff, 0x3fffffffffffffff, 0x7fffffffffffffff, 0xffffffffffffffff
216 static bool axmap_set_fn(struct axmap_level *al, unsigned long offset,
217 unsigned int bit, void *__data)
219 struct axmap_set_data *data = __data;
220 unsigned long mask, overlap;
221 unsigned int nr_bits;
223 nr_bits = min(data->nr_bits, BLOCKS_PER_UNIT - bit);
225 mask = bit_masks[nr_bits] << bit;
228 * Mask off any potential overlap, only sets contig regions
230 overlap = al->map[offset] & mask;
235 unsigned long clear_mask = ~(1UL << ffz(~overlap));
238 overlap &= clear_mask;
243 assert(!(al->map[offset] & mask));
245 al->map[offset] |= mask;
248 data->set_bits = nr_bits;
251 return al->map[offset] != -1UL;
254 static void __axmap_set(struct axmap *axmap, uint64_t bit_nr,
255 struct axmap_set_data *data)
257 unsigned int set_bits, nr_bits = data->nr_bits;
259 if (axmap->first_free >= bit_nr &&
260 axmap->first_free < bit_nr + data->nr_bits)
261 axmap->first_free = -1ULL;
263 if (bit_nr > axmap->nr_bits)
265 else if (bit_nr + nr_bits > axmap->nr_bits)
266 nr_bits = axmap->nr_bits - bit_nr;
270 axmap_handler(axmap, bit_nr, axmap_set_fn, data);
271 set_bits += data->set_bits;
273 if (!data->set_bits ||
274 data->set_bits != (BLOCKS_PER_UNIT - nr_bits))
277 nr_bits -= data->set_bits;
278 bit_nr += data->set_bits;
280 data->nr_bits = nr_bits;
283 data->set_bits = set_bits;
286 void axmap_set(struct axmap *axmap, uint64_t bit_nr)
288 struct axmap_set_data data = { .nr_bits = 1, };
290 __axmap_set(axmap, bit_nr, &data);
293 unsigned int axmap_set_nr(struct axmap *axmap, uint64_t bit_nr,
294 unsigned int nr_bits)
296 unsigned int set_bits = 0;
299 struct axmap_set_data data = { .nr_bits = nr_bits, };
300 unsigned int max_bits, this_set;
302 max_bits = BLOCKS_PER_UNIT - (bit_nr & BLOCKS_PER_UNIT_MASK);
303 if (max_bits < nr_bits)
304 data.nr_bits = max_bits;
306 this_set = data.nr_bits;
307 __axmap_set(axmap, bit_nr, &data);
308 set_bits += data.set_bits;
309 if (data.set_bits != this_set)
312 nr_bits -= data.set_bits;
313 bit_nr += data.set_bits;
319 static bool axmap_isset_fn(struct axmap_level *al, unsigned long offset,
320 unsigned int bit, void *unused)
322 return (al->map[offset] & (1UL << bit)) != 0;
325 bool axmap_isset(struct axmap *axmap, uint64_t bit_nr)
327 if (bit_nr <= axmap->nr_bits)
328 return axmap_handler_topdown(axmap, bit_nr, axmap_isset_fn, NULL);
333 static uint64_t axmap_find_first_free(struct axmap *axmap, unsigned int level,
336 uint64_t ret = -1ULL;
341 * Start at the bottom, then converge towards first free bit at the top
343 for (i = level; i >= 0; i--) {
344 struct axmap_level *al = &axmap->levels[i];
347 * Clear 'ret', this is a bug condition.
349 if (index >= al->map_size) {
354 for (j = index; j < al->map_size; j++) {
355 if (al->map[j] == -1UL)
359 * First free bit here is our index into the first
360 * free bit at the next higher level
362 ret = index = (j << UNIT_SHIFT) + ffz(al->map[j]);
367 if (ret < axmap->nr_bits)
370 return (uint64_t) -1ULL;
373 static uint64_t axmap_first_free(struct axmap *axmap)
375 if (firstfree_valid(axmap))
376 return axmap->first_free;
378 axmap->first_free = axmap_find_first_free(axmap, axmap->nr_levels - 1, 0);
379 return axmap->first_free;
382 struct axmap_next_free_data {
384 unsigned long offset;
388 static bool axmap_next_free_fn(struct axmap_level *al, unsigned long offset,
389 unsigned int bit, void *__data)
391 struct axmap_next_free_data *data = __data;
392 uint64_t mask = ~bit_masks[(data->bit + 1) & BLOCKS_PER_UNIT_MASK];
394 if (!(mask & ~al->map[offset]))
397 if (al->map[offset] != -1UL) {
398 data->level = al->level;
399 data->offset = offset;
403 data->bit = (data->bit + BLOCKS_PER_UNIT - 1) / BLOCKS_PER_UNIT;
408 * 'bit_nr' is already set. Find the next free bit after this one.
410 uint64_t axmap_next_free(struct axmap *axmap, uint64_t bit_nr)
412 struct axmap_next_free_data data = { .level = -1U, .bit = bit_nr, };
415 if (firstfree_valid(axmap) && bit_nr < axmap->first_free)
416 return axmap->first_free;
418 if (!axmap_handler(axmap, bit_nr, axmap_next_free_fn, &data))
419 return axmap_first_free(axmap);
421 assert(data.level != -1U);
424 * In the rare case that the map is unaligned, we might end up
425 * finding an offset that's beyond the valid end. For that case,
426 * find the first free one, the map is practically full.
428 ret = axmap_find_first_free(axmap, data.level, data.offset);
432 return axmap_first_free(axmap);