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 existance
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 "../smalloc.h"
26 #include "../minmax.h"
28 #if BITS_PER_LONG == 64
30 #elif BITS_PER_LONG == 32
33 #error "Number of arch bits unknown"
36 #define BLOCKS_PER_UNIT (1UL << UNIT_SHIFT)
37 #define BLOCKS_PER_UNIT_MASK (BLOCKS_PER_UNIT - 1)
39 #define firstfree_valid(b) ((b)->first_free != (uint64_t) -1)
43 unsigned long map_size;
48 unsigned int nr_levels;
49 struct axmap_level *levels;
54 static unsigned long ulog64(unsigned long val, unsigned int log)
62 void axmap_reset(struct axmap *axmap)
66 for (i = 0; i < axmap->nr_levels; i++) {
67 struct axmap_level *al = &axmap->levels[i];
69 memset(al->map, 0, al->map_size * sizeof(unsigned long));
72 axmap->first_free = 0;
75 void axmap_free(struct axmap *axmap)
82 for (i = 0; i < axmap->nr_levels; i++)
83 sfree(axmap->levels[i].map);
89 struct axmap *axmap_new(unsigned long nr_bits)
92 unsigned int i, levels;
94 axmap = smalloc(sizeof(*axmap));
99 i = (nr_bits + BLOCKS_PER_UNIT - 1) >> UNIT_SHIFT;
101 i = (i + BLOCKS_PER_UNIT - 1) >> UNIT_SHIFT;
105 axmap->nr_levels = levels;
106 axmap->levels = smalloc(axmap->nr_levels * sizeof(struct axmap_level));
107 axmap->nr_bits = nr_bits;
109 for (i = 0; i < axmap->nr_levels; i++) {
110 struct axmap_level *al = &axmap->levels[i];
113 al->map_size = (nr_bits + BLOCKS_PER_UNIT - 1) >> UNIT_SHIFT;
114 al->map = smalloc(al->map_size * sizeof(unsigned long));
118 nr_bits = (nr_bits + BLOCKS_PER_UNIT - 1) >> UNIT_SHIFT;
124 for (i = 0; i < axmap->nr_levels; i++)
125 if (axmap->levels[i].map)
126 sfree(axmap->levels[i].map);
128 sfree(axmap->levels);
132 static int axmap_handler(struct axmap *axmap, uint64_t bit_nr,
133 int (*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 int axmap_handler_topdown(struct axmap *axmap, uint64_t bit_nr,
154 int (*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 int 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;
192 unsigned int fail_ok;
195 static unsigned long bit_masks[] = {
196 0x0000000000000000, 0x0000000000000001, 0x0000000000000003, 0x0000000000000007,
197 0x000000000000000f, 0x000000000000001f, 0x000000000000003f, 0x000000000000007f,
198 0x00000000000000ff, 0x00000000000001ff, 0x00000000000003ff, 0x00000000000007ff,
199 0x0000000000000fff, 0x0000000000001fff, 0x0000000000003fff, 0x0000000000007fff,
200 0x000000000000ffff, 0x000000000001ffff, 0x000000000003ffff, 0x000000000007ffff,
201 0x00000000000fffff, 0x00000000001fffff, 0x00000000003fffff, 0x00000000007fffff,
202 0x0000000000ffffff, 0x0000000001ffffff, 0x0000000003ffffff, 0x0000000007ffffff,
203 0x000000000fffffff, 0x000000001fffffff, 0x000000003fffffff, 0x000000007fffffff,
205 #if BITS_PER_LONG == 64
206 0x00000001ffffffff, 0x00000003ffffffff, 0x00000007ffffffff, 0x0000000fffffffff,
207 0x0000001fffffffff, 0x0000003fffffffff, 0x0000007fffffffff, 0x000000ffffffffff,
208 0x000001ffffffffff, 0x000003ffffffffff, 0x000007ffffffffff, 0x00000fffffffffff,
209 0x00001fffffffffff, 0x00003fffffffffff, 0x00007fffffffffff, 0x0000ffffffffffff,
210 0x0001ffffffffffff, 0x0003ffffffffffff, 0x0007ffffffffffff, 0x000fffffffffffff,
211 0x001fffffffffffff, 0x003fffffffffffff, 0x007fffffffffffff, 0x00ffffffffffffff,
212 0x01ffffffffffffff, 0x03ffffffffffffff, 0x07ffffffffffffff, 0x0fffffffffffffff,
213 0x1fffffffffffffff, 0x3fffffffffffffff, 0x7fffffffffffffff, 0xffffffffffffffff
217 static int axmap_set_fn(struct axmap_level *al, unsigned long offset,
218 unsigned int bit, void *__data)
220 struct axmap_set_data *data = __data;
221 unsigned long mask, overlap;
222 unsigned int nr_bits;
224 nr_bits = min(data->nr_bits, BLOCKS_PER_UNIT - bit);
226 mask = bit_masks[nr_bits] << bit;
229 * Mask off any potential overlap, only sets contig regions
231 overlap = al->map[offset] & mask;
232 if (overlap == mask) {
233 assert(data->fail_ok);
238 unsigned long clear_mask = ~(1UL << ffz(~overlap));
241 overlap &= clear_mask;
246 assert(!(al->map[offset] & mask));
248 al->map[offset] |= mask;
251 data->set_bits = nr_bits;
254 return al->map[offset] != -1UL;
257 static void __axmap_set(struct axmap *axmap, uint64_t bit_nr,
258 struct axmap_set_data *data)
260 unsigned int set_bits, nr_bits = data->nr_bits;
262 if (axmap->first_free >= bit_nr &&
263 axmap->first_free < bit_nr + data->nr_bits)
264 axmap->first_free = -1ULL;
266 if (bit_nr > axmap->nr_bits)
268 else if (bit_nr + nr_bits > axmap->nr_bits)
269 nr_bits = axmap->nr_bits - bit_nr;
273 axmap_handler(axmap, bit_nr, axmap_set_fn, data);
274 set_bits += data->set_bits;
276 if (!data->set_bits ||
277 data->set_bits != (BLOCKS_PER_UNIT - nr_bits))
280 nr_bits -= data->set_bits;
281 bit_nr += data->set_bits;
283 data->nr_bits = nr_bits;
287 data->set_bits = set_bits;
290 void axmap_set(struct axmap *axmap, uint64_t bit_nr)
292 struct axmap_set_data data = { .nr_bits = 1, };
294 __axmap_set(axmap, bit_nr, &data);
297 unsigned int axmap_set_nr(struct axmap *axmap, uint64_t bit_nr, unsigned int nr_bits)
299 unsigned int set_bits = 0;
302 struct axmap_set_data data = {
304 .fail_ok = set_bits != 0,
306 unsigned int max_bits, this_set;
308 max_bits = BLOCKS_PER_UNIT - (bit_nr & BLOCKS_PER_UNIT_MASK);
309 if (max_bits < nr_bits)
310 data.nr_bits = max_bits;
312 this_set = data.nr_bits;
313 __axmap_set(axmap, bit_nr, &data);
314 set_bits += data.set_bits;
315 if (data.set_bits != this_set)
318 nr_bits -= data.set_bits;
319 bit_nr += data.set_bits;
325 static int axmap_isset_fn(struct axmap_level *al, unsigned long offset,
326 unsigned int bit, void *unused)
328 return (al->map[offset] & (1UL << bit)) != 0;
331 int axmap_isset(struct axmap *axmap, uint64_t bit_nr)
333 if (bit_nr <= axmap->nr_bits)
334 return axmap_handler_topdown(axmap, bit_nr, axmap_isset_fn, NULL);
339 static uint64_t axmap_find_first_free(struct axmap *axmap, unsigned int level,
342 uint64_t ret = -1ULL;
347 * Start at the bottom, then converge towards first free bit at the top
349 for (i = level; i >= 0; i--) {
350 struct axmap_level *al = &axmap->levels[i];
353 * Clear 'ret', this is a bug condition.
355 if (index >= al->map_size) {
360 for (j = index; j < al->map_size; j++) {
361 if (al->map[j] == -1UL)
365 * First free bit here is our index into the first
366 * free bit at the next higher level
368 ret = index = (j << UNIT_SHIFT) + ffz(al->map[j]);
373 if (ret < axmap->nr_bits)
376 return (uint64_t) -1ULL;
379 uint64_t axmap_first_free(struct axmap *axmap)
381 if (firstfree_valid(axmap))
382 return axmap->first_free;
384 axmap->first_free = axmap_find_first_free(axmap, axmap->nr_levels - 1, 0);
385 return axmap->first_free;
388 struct axmap_next_free_data {
390 unsigned long offset;
394 static int axmap_next_free_fn(struct axmap_level *al, unsigned long offset,
395 unsigned int bit, void *__data)
397 struct axmap_next_free_data *data = __data;
398 uint64_t mask = ~bit_masks[(data->bit + 1) & BLOCKS_PER_UNIT_MASK];
400 if (!(mask & ~al->map[offset]))
403 if (al->map[offset] != -1UL) {
404 data->level = al->level;
405 data->offset = offset;
409 data->bit = (data->bit + BLOCKS_PER_UNIT - 1) / BLOCKS_PER_UNIT;
414 * 'bit_nr' is already set. Find the next free bit after this one.
416 uint64_t axmap_next_free(struct axmap *axmap, uint64_t bit_nr)
418 struct axmap_next_free_data data = { .level = -1U, .bit = bit_nr, };
421 if (firstfree_valid(axmap) && bit_nr < axmap->first_free)
422 return axmap->first_free;
424 if (!axmap_handler(axmap, bit_nr, axmap_next_free_fn, &data))
425 return axmap_first_free(axmap);
427 assert(data.level != -1U);
430 * In the rare case that the map is unaligned, we might end up
431 * finding an offset that's beyond the valid end. For that case,
432 * find the first free one, the map is practically full.
434 ret = axmap_find_first_free(axmap, data.level, data.offset);
438 return axmap_first_free(axmap);