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);
131 static int axmap_handler(struct axmap *axmap, uint64_t bit_nr,
132 int (*func)(struct axmap_level *, unsigned long, unsigned int,
135 struct axmap_level *al;
138 for (i = 0; i < axmap->nr_levels; i++) {
139 unsigned long index = ulog64(bit_nr, i);
140 unsigned long offset = index >> UNIT_SHIFT;
141 unsigned int bit = index & BLOCKS_PER_UNIT_MASK;
143 al = &axmap->levels[i];
145 if (func(al, offset, bit, data))
152 static int axmap_handler_topdown(struct axmap *axmap, uint64_t bit_nr,
153 int (*func)(struct axmap_level *, unsigned long, unsigned int, void *),
156 struct axmap_level *al;
157 int i, level = axmap->nr_levels;
159 for (i = axmap->nr_levels - 1; i >= 0; i--) {
160 unsigned long index = ulog64(bit_nr, --level);
161 unsigned long offset = index >> UNIT_SHIFT;
162 unsigned int bit = index & BLOCKS_PER_UNIT_MASK;
164 al = &axmap->levels[i];
166 if (func(al, offset, bit, data))
173 static int axmap_clear_fn(struct axmap_level *al, unsigned long offset,
174 unsigned int bit, void *unused)
176 if (!(al->map[offset] & (1UL << bit)))
179 al->map[offset] &= ~(1UL << bit);
183 void axmap_clear(struct axmap *axmap, uint64_t bit_nr)
185 axmap_handler(axmap, bit_nr, axmap_clear_fn, NULL);
188 struct axmap_set_data {
189 unsigned int nr_bits;
190 unsigned int set_bits;
193 static unsigned long bit_masks[] = {
194 0x0000000000000000, 0x0000000000000001, 0x0000000000000003, 0x0000000000000007,
195 0x000000000000000f, 0x000000000000001f, 0x000000000000003f, 0x000000000000007f,
196 0x00000000000000ff, 0x00000000000001ff, 0x00000000000003ff, 0x00000000000007ff,
197 0x0000000000000fff, 0x0000000000001fff, 0x0000000000003fff, 0x0000000000007fff,
198 0x000000000000ffff, 0x000000000001ffff, 0x000000000003ffff, 0x000000000007ffff,
199 0x00000000000fffff, 0x00000000001fffff, 0x00000000003fffff, 0x00000000007fffff,
200 0x0000000000ffffff, 0x0000000001ffffff, 0x0000000003ffffff, 0x0000000007ffffff,
201 0x000000000fffffff, 0x000000001fffffff, 0x000000003fffffff, 0x000000007fffffff,
203 #if BITS_PER_LONG == 64
204 0x00000001ffffffff, 0x00000003ffffffff, 0x00000007ffffffff, 0x0000000fffffffff,
205 0x0000001fffffffff, 0x0000003fffffffff, 0x0000007fffffffff, 0x000000ffffffffff,
206 0x000001ffffffffff, 0x000003ffffffffff, 0x000007ffffffffff, 0x00000fffffffffff,
207 0x00001fffffffffff, 0x00003fffffffffff, 0x00007fffffffffff, 0x0000ffffffffffff,
208 0x0001ffffffffffff, 0x0003ffffffffffff, 0x0007ffffffffffff, 0x000fffffffffffff,
209 0x001fffffffffffff, 0x003fffffffffffff, 0x007fffffffffffff, 0x00ffffffffffffff,
210 0x01ffffffffffffff, 0x03ffffffffffffff, 0x07ffffffffffffff, 0x0fffffffffffffff,
211 0x1fffffffffffffff, 0x3fffffffffffffff, 0x7fffffffffffffff, 0xffffffffffffffff
215 static int axmap_set_fn(struct axmap_level *al, unsigned long offset,
216 unsigned int bit, void *__data)
218 struct axmap_set_data *data = __data;
219 unsigned long mask, overlap;
220 unsigned int nr_bits;
222 nr_bits = min(data->nr_bits, BLOCKS_PER_UNIT - bit);
224 mask = bit_masks[nr_bits] << bit;
227 * Mask off any potential overlap, only sets contig regions
229 overlap = al->map[offset] & mask;
234 unsigned long clear_mask = ~(1UL << ffz(~overlap));
237 overlap &= clear_mask;
242 assert(!(al->map[offset] & mask));
244 al->map[offset] |= mask;
247 data->set_bits = nr_bits;
250 return al->map[offset] != -1UL;
253 static void __axmap_set(struct axmap *axmap, uint64_t bit_nr,
254 struct axmap_set_data *data)
256 unsigned int set_bits, nr_bits = data->nr_bits;
258 if (axmap->first_free >= bit_nr &&
259 axmap->first_free < bit_nr + data->nr_bits)
260 axmap->first_free = -1ULL;
262 if (bit_nr > axmap->nr_bits)
264 else if (bit_nr + nr_bits > axmap->nr_bits)
265 nr_bits = axmap->nr_bits - bit_nr;
269 axmap_handler(axmap, bit_nr, axmap_set_fn, data);
270 set_bits += data->set_bits;
272 if (!data->set_bits ||
273 data->set_bits != (BLOCKS_PER_UNIT - nr_bits))
276 nr_bits -= data->set_bits;
277 bit_nr += data->set_bits;
279 data->nr_bits = nr_bits;
282 data->set_bits = set_bits;
285 void axmap_set(struct axmap *axmap, uint64_t bit_nr)
287 struct axmap_set_data data = { .nr_bits = 1, };
289 __axmap_set(axmap, bit_nr, &data);
292 unsigned int axmap_set_nr(struct axmap *axmap, uint64_t bit_nr, unsigned int nr_bits)
294 unsigned int set_bits = 0;
297 struct axmap_set_data data = { .nr_bits = nr_bits, };
298 unsigned int max_bits, this_set;
300 max_bits = BLOCKS_PER_UNIT - (bit_nr & BLOCKS_PER_UNIT_MASK);
301 if (max_bits < nr_bits)
302 data.nr_bits = max_bits;
304 this_set = data.nr_bits;
305 __axmap_set(axmap, bit_nr, &data);
306 set_bits += data.set_bits;
307 if (data.set_bits != this_set)
310 nr_bits -= data.set_bits;
311 bit_nr += data.set_bits;
317 static int axmap_isset_fn(struct axmap_level *al, unsigned long offset,
318 unsigned int bit, void *unused)
320 return (al->map[offset] & (1UL << bit)) != 0;
323 int axmap_isset(struct axmap *axmap, uint64_t bit_nr)
325 if (bit_nr <= axmap->nr_bits)
326 return axmap_handler_topdown(axmap, bit_nr, axmap_isset_fn, NULL);
331 static uint64_t axmap_find_first_free(struct axmap *axmap, unsigned int level,
334 uint64_t ret = -1ULL;
339 * Start at the bottom, then converge towards first free bit at the top
341 for (i = level; i >= 0; i--) {
342 struct axmap_level *al = &axmap->levels[i];
345 * Clear 'ret', this is a bug condition.
347 if (index >= al->map_size) {
352 for (j = index; j < al->map_size; j++) {
353 if (al->map[j] == -1UL)
357 * First free bit here is our index into the first
358 * free bit at the next higher level
360 ret = index = (j << UNIT_SHIFT) + ffz(al->map[j]);
365 if (ret < axmap->nr_bits)
368 return (uint64_t) -1ULL;
371 static uint64_t axmap_first_free(struct axmap *axmap)
373 if (firstfree_valid(axmap))
374 return axmap->first_free;
376 axmap->first_free = axmap_find_first_free(axmap, axmap->nr_levels - 1, 0);
377 return axmap->first_free;
380 struct axmap_next_free_data {
382 unsigned long offset;
386 static int axmap_next_free_fn(struct axmap_level *al, unsigned long offset,
387 unsigned int bit, void *__data)
389 struct axmap_next_free_data *data = __data;
390 uint64_t mask = ~bit_masks[(data->bit + 1) & BLOCKS_PER_UNIT_MASK];
392 if (!(mask & ~al->map[offset]))
395 if (al->map[offset] != -1UL) {
396 data->level = al->level;
397 data->offset = offset;
401 data->bit = (data->bit + BLOCKS_PER_UNIT - 1) / BLOCKS_PER_UNIT;
406 * 'bit_nr' is already set. Find the next free bit after this one.
408 uint64_t axmap_next_free(struct axmap *axmap, uint64_t bit_nr)
410 struct axmap_next_free_data data = { .level = -1U, .bit = bit_nr, };
413 if (firstfree_valid(axmap) && bit_nr < axmap->first_free)
414 return axmap->first_free;
416 if (!axmap_handler(axmap, bit_nr, axmap_next_free_fn, &data))
417 return axmap_first_free(axmap);
419 assert(data.level != -1U);
422 * In the rare case that the map is unaligned, we might end up
423 * finding an offset that's beyond the valid end. For that case,
424 * find the first free one, the map is practically full.
426 ret = axmap_find_first_free(axmap, data.level, data.offset);
430 return axmap_first_free(axmap);