]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/kern/subr_blist.c
src.conf.5: Regen after removing MK_NVME
[FreeBSD/FreeBSD.git] / sys / kern / subr_blist.c
1 /*-
2  * SPDX-License-Identifier: BSD-3-Clause
3  *
4  * Copyright (c) 1998 Matthew Dillon.  All Rights Reserved.
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. Neither the name of the University nor the names of its contributors
14  *    may be used to endorse or promote products derived from this software
15  *    without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
18  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
21  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
23  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
26  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28  */
29 /*
30  * BLIST.C -    Bitmap allocator/deallocator, using a radix tree with hinting
31  *
32  *      This module implements a general bitmap allocator/deallocator.  The
33  *      allocator eats around 2 bits per 'block'.  The module does not
34  *      try to interpret the meaning of a 'block' other than to return
35  *      SWAPBLK_NONE on an allocation failure.
36  *
37  *      A radix tree controls access to pieces of the bitmap, and includes
38  *      auxiliary information at each interior node about the availabilty of
39  *      contiguous free blocks in the subtree rooted at that node.  A radix
40  *      constant defines the size of the bitmaps contained in a leaf node
41  *      and the number of descendents of each of the meta (interior) nodes.
42  *      Each subtree is associated with a range of blocks.  The root of any
43  *      subtree stores a hint field that defines an upper bound on the size
44  *      of the largest allocation that can begin in the associated block
45  *      range.  A hint is an upper bound on a potential allocation, but not
46  *      necessarily a tight upper bound.
47  *
48  *      The bitmap field in each node directs the search for available blocks.
49  *      For a leaf node, a bit is set if the corresponding block is free.  For a
50  *      meta node, a bit is set if the corresponding subtree contains a free
51  *      block somewhere within it.  The search at a meta node considers only
52  *      children of that node that represent a range that includes a free block.
53  *
54  *      The hinting greatly increases code efficiency for allocations while
55  *      the general radix structure optimizes both allocations and frees.  The
56  *      radix tree should be able to operate well no matter how much
57  *      fragmentation there is and no matter how large a bitmap is used.
58  *
59  *      The blist code wires all necessary memory at creation time.  Neither
60  *      allocations nor frees require interaction with the memory subsystem.
61  *      The non-blocking nature of allocations and frees is required by swap
62  *      code (vm/swap_pager.c).
63  *
64  *      LAYOUT: The radix tree is laid out recursively using a linear array.
65  *      Each meta node is immediately followed (laid out sequentially in
66  *      memory) by BLIST_RADIX lower-level nodes.  This is a recursive
67  *      structure but one that can be easily scanned through a very simple
68  *      'skip' calculation.  The memory allocation is only large enough to
69  *      cover the number of blocks requested at creation time.  Nodes that
70  *      represent blocks beyond that limit, nodes that would never be read
71  *      or written, are not allocated, so that the last of the
72  *      BLIST_RADIX lower-level nodes of a some nodes may not be allocated.
73  *
74  *      NOTE: the allocator cannot currently allocate more than
75  *      BLIST_RADIX blocks per call.  It will panic with 'allocation too
76  *      large' if you try.  This is an area that could use improvement.  The
77  *      radix is large enough that this restriction does not effect the swap
78  *      system, though.  Currently only the allocation code is affected by
79  *      this algorithmic unfeature.  The freeing code can handle arbitrary
80  *      ranges.
81  *
82  *      This code can be compiled stand-alone for debugging.
83  */
84
85 #include <sys/cdefs.h>
86 #ifdef _KERNEL
87
88 #include <sys/param.h>
89 #include <sys/systm.h>
90 #include <sys/lock.h>
91 #include <sys/kernel.h>
92 #include <sys/blist.h>
93 #include <sys/malloc.h>
94 #include <sys/sbuf.h>
95 #include <sys/proc.h>
96 #include <sys/mutex.h>
97
98 #else
99
100 #ifndef BLIST_NO_DEBUG
101 #define BLIST_DEBUG
102 #endif
103
104 #include <sys/errno.h>
105 #include <sys/types.h>
106 #include <sys/malloc.h>
107 #include <sys/sbuf.h>
108 #include <assert.h>
109 #include <stdio.h>
110 #include <string.h>
111 #include <stddef.h>
112 #include <stdlib.h>
113 #include <stdarg.h>
114 #include <stdbool.h>
115
116 #define bitcount64(x)   __bitcount64((uint64_t)(x))
117 #define malloc(a,b,c)   calloc(a, 1)
118 #define free(a,b)       free(a)
119 #define ummin(a,b)      ((a) < (b) ? (a) : (b))
120 #define imin(a,b)       ((a) < (b) ? (a) : (b))
121 #define KASSERT(a,b)    assert(a)
122
123 #include <sys/blist.h>
124
125 #endif
126
127 /*
128  * static support functions
129  */
130 static daddr_t  blst_leaf_alloc(blmeta_t *scan, daddr_t blk,
131     int *count, int maxcount);
132 static daddr_t  blst_meta_alloc(blmeta_t *scan, daddr_t cursor, int *count,
133     int maxcount, u_daddr_t radix);
134 static void blst_leaf_free(blmeta_t *scan, daddr_t relblk, int count);
135 static void blst_meta_free(blmeta_t *scan, daddr_t freeBlk, daddr_t count,
136                     u_daddr_t radix);
137 static void blst_copy(blmeta_t *scan, daddr_t blk, daddr_t radix,
138                     blist_t dest, daddr_t count);
139 static daddr_t blst_leaf_fill(blmeta_t *scan, daddr_t blk, int count);
140 static daddr_t blst_meta_fill(blmeta_t *scan, daddr_t allocBlk, daddr_t count,
141                     u_daddr_t radix);
142 #ifndef _KERNEL
143 static void     blst_radix_print(blmeta_t *scan, daddr_t blk, daddr_t radix,
144                     int tab);
145 #endif
146
147 #ifdef _KERNEL
148 static MALLOC_DEFINE(M_SWAP, "SWAP", "Swap space");
149 #endif
150
151 #define BLIST_MASK      (BLIST_RADIX - 1)
152
153 /*
154  * For a subtree that can represent the state of up to 'radix' blocks, the
155  * number of leaf nodes of the subtree is L=radix/BLIST_RADIX.  If 'm'
156  * is short for BLIST_RADIX, then for a tree of height h with L=m**h
157  * leaf nodes, the total number of tree nodes is 1 + m + m**2 + ... + m**h,
158  * or, equivalently, (m**(h+1)-1)/(m-1).  This quantity is called 'skip'
159  * in the 'meta' functions that process subtrees.  Since integer division
160  * discards remainders, we can express this computation as
161  * skip = (m * m**h) / (m - 1)
162  * skip = (m * (radix / m)) / (m - 1)
163  * skip = radix / (m - 1)
164  * so that simple integer division by a constant can safely be used for the
165  * calculation.
166  */
167 static inline daddr_t
168 radix_to_skip(daddr_t radix)
169 {
170
171         return (radix / BLIST_MASK);
172 }
173
174 /*
175  * Provide a mask with count bits set, starting as position n.
176  */
177 static inline u_daddr_t
178 bitrange(int n, int count)
179 {
180
181         return (((u_daddr_t)-1 << n) &
182             ((u_daddr_t)-1 >> (BLIST_RADIX - (n + count))));
183 }
184
185 static inline int
186 bitpos(u_daddr_t mask)
187 {
188
189         _Static_assert(sizeof(long long) >= sizeof(mask),
190             "mask too big for ffsll()");
191         return (ffsll(mask) - 1);
192 }
193
194 /*
195  * blist_create() - create a blist capable of handling up to the specified
196  *                  number of blocks
197  *
198  *      blocks - must be greater than 0
199  *      flags  - malloc flags
200  *
201  *      The smallest blist consists of a single leaf node capable of
202  *      managing BLIST_RADIX blocks.
203  */
204 blist_t
205 blist_create(daddr_t blocks, int flags)
206 {
207         blist_t bl;
208         u_daddr_t nodes, radix;
209
210         KASSERT(blocks > 0, ("invalid block count"));
211
212         /*
213          * Calculate the radix and node count used for scanning.
214          */
215         nodes = 1;
216         for (radix = 1; (blocks - 1) / BLIST_RADIX / radix > 0;
217             radix *= BLIST_RADIX)
218                 nodes += 1 + (blocks - 1) / BLIST_RADIX / radix;
219
220         /*
221          * Include a sentinel node to ensure that cross-leaf scans stay within
222          * the bounds of the allocation.
223          */
224         if (blocks % BLIST_RADIX == 0)
225                 nodes++;
226
227         bl = malloc(offsetof(struct blist, bl_root[nodes]), M_SWAP, flags |
228             M_ZERO);
229         if (bl == NULL)
230                 return (NULL);
231
232         bl->bl_blocks = blocks;
233         bl->bl_radix = radix;
234
235 #if defined(BLIST_DEBUG)
236         printf(
237                 "BLIST representing %lld blocks (%lld MB of swap)"
238                 ", requiring %lldK of ram\n",
239                 (long long)bl->bl_blocks,
240                 (long long)bl->bl_blocks * 4 / 1024,
241                 (long long)(nodes * sizeof(blmeta_t) + 1023) / 1024
242         );
243         printf("BLIST raw radix tree contains %lld records\n",
244             (long long)nodes);
245 #endif
246
247         return (bl);
248 }
249
250 void
251 blist_destroy(blist_t bl)
252 {
253
254         free(bl, M_SWAP);
255 }
256
257 /*
258  * blist_alloc() -   reserve space in the block bitmap.  Return the base
259  *                   of a contiguous region or SWAPBLK_NONE if space could
260  *                   not be allocated.
261  */
262 daddr_t
263 blist_alloc(blist_t bl, int *count, int maxcount)
264 {
265         daddr_t blk, cursor;
266
267         KASSERT(*count <= maxcount,
268             ("invalid parameters %d > %d", *count, maxcount));
269         KASSERT(*count <= BLIST_MAX_ALLOC,
270             ("minimum allocation too large: %d", *count));
271
272         /*
273          * This loop iterates at most twice.  An allocation failure in the
274          * first iteration leads to a second iteration only if the cursor was
275          * non-zero.  When the cursor is zero, an allocation failure will
276          * stop further iterations.
277          */
278         for (cursor = bl->bl_cursor;; cursor = 0) {
279                 blk = blst_meta_alloc(bl->bl_root, cursor, count, maxcount,
280                     bl->bl_radix);
281                 if (blk != SWAPBLK_NONE) {
282                         bl->bl_avail -= *count;
283                         bl->bl_cursor = blk + *count;
284                         if (bl->bl_cursor == bl->bl_blocks)
285                                 bl->bl_cursor = 0;
286                         return (blk);
287                 }
288                 if (cursor == 0)
289                         return (SWAPBLK_NONE);
290         }
291 }
292
293 /*
294  * blist_avail() -      return the number of free blocks.
295  */
296 daddr_t
297 blist_avail(blist_t bl)
298 {
299
300         return (bl->bl_avail);
301 }
302
303 /*
304  * blist_free() -       free up space in the block bitmap.  Return the base
305  *                      of a contiguous region.
306  */
307 void
308 blist_free(blist_t bl, daddr_t blkno, daddr_t count)
309 {
310
311         KASSERT(blkno >= 0 && blkno + count <= bl->bl_blocks,
312             ("freeing invalid range: blkno %jx, count %d, blocks %jd",
313             (uintmax_t)blkno, (int)count, (uintmax_t)bl->bl_blocks));
314         blst_meta_free(bl->bl_root, blkno, count, bl->bl_radix);
315         bl->bl_avail += count;
316 }
317
318 /*
319  * blist_fill() -       mark a region in the block bitmap as off-limits
320  *                      to the allocator (i.e. allocate it), ignoring any
321  *                      existing allocations.  Return the number of blocks
322  *                      actually filled that were free before the call.
323  */
324 daddr_t
325 blist_fill(blist_t bl, daddr_t blkno, daddr_t count)
326 {
327         daddr_t filled;
328
329         KASSERT(blkno >= 0 && blkno + count <= bl->bl_blocks,
330             ("filling invalid range: blkno %jx, count %d, blocks %jd",
331             (uintmax_t)blkno, (int)count, (uintmax_t)bl->bl_blocks));
332         filled = blst_meta_fill(bl->bl_root, blkno, count, bl->bl_radix);
333         bl->bl_avail -= filled;
334         return (filled);
335 }
336
337 /*
338  * blist_resize() -     resize an existing radix tree to handle the
339  *                      specified number of blocks.  This will reallocate
340  *                      the tree and transfer the previous bitmap to the new
341  *                      one.  When extending the tree you can specify whether
342  *                      the new blocks are to left allocated or freed.
343  */
344 void
345 blist_resize(blist_t *pbl, daddr_t count, int freenew, int flags)
346 {
347     blist_t newbl = blist_create(count, flags);
348     blist_t save = *pbl;
349
350     *pbl = newbl;
351     if (count > save->bl_blocks)
352             count = save->bl_blocks;
353     blst_copy(save->bl_root, 0, save->bl_radix, newbl, count);
354
355     /*
356      * If resizing upwards, should we free the new space or not?
357      */
358     if (freenew && count < newbl->bl_blocks) {
359             blist_free(newbl, count, newbl->bl_blocks - count);
360     }
361     blist_destroy(save);
362 }
363
364 #ifdef BLIST_DEBUG
365
366 /*
367  * blist_print()    - dump radix tree
368  */
369 void
370 blist_print(blist_t bl)
371 {
372         printf("BLIST avail = %jd, cursor = %08jx {\n",
373             (uintmax_t)bl->bl_avail, (uintmax_t)bl->bl_cursor);
374
375         if (bl->bl_root->bm_bitmap != 0)
376                 blst_radix_print(bl->bl_root, 0, bl->bl_radix, 4);
377         printf("}\n");
378 }
379
380 #endif
381
382 static const u_daddr_t fib[] = {
383         1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584,
384         4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811,
385         514229, 832040, 1346269, 2178309, 3524578,
386 };
387
388 /*
389  * Use 'gap' to describe a maximal range of unallocated blocks/bits.
390  */
391 struct gap_stats {
392         daddr_t start;          /* current gap start, or SWAPBLK_NONE */
393         daddr_t num;            /* number of gaps observed */
394         daddr_t max;            /* largest gap size */
395         daddr_t avg;            /* average gap size */
396         daddr_t err;            /* sum - num * avg */
397         daddr_t histo[nitems(fib)]; /* # gaps in each size range */
398         int     max_bucket;     /* last histo elt with nonzero val */
399 };
400
401 /*
402  * gap_stats_counting()    - is the state 'counting 1 bits'?
403  *                           or 'skipping 0 bits'?
404  */
405 static inline bool
406 gap_stats_counting(const struct gap_stats *stats)
407 {
408
409         return (stats->start != SWAPBLK_NONE);
410 }
411
412 /*
413  * init_gap_stats()    - initialize stats on gap sizes
414  */
415 static inline void
416 init_gap_stats(struct gap_stats *stats)
417 {
418
419         bzero(stats, sizeof(*stats));
420         stats->start = SWAPBLK_NONE;
421 }
422
423 /*
424  * update_gap_stats()    - update stats on gap sizes
425  */
426 static void
427 update_gap_stats(struct gap_stats *stats, daddr_t posn)
428 {
429         daddr_t size;
430         int hi, lo, mid;
431
432         if (!gap_stats_counting(stats)) {
433                 stats->start = posn;
434                 return;
435         }
436         size = posn - stats->start;
437         stats->start = SWAPBLK_NONE;
438         if (size > stats->max)
439                 stats->max = size;
440
441         /*
442          * Find the fibonacci range that contains size,
443          * expecting to find it in an early range.
444          */
445         lo = 0;
446         hi = 1;
447         while (hi < nitems(fib) && fib[hi] <= size) {
448                 lo = hi;
449                 hi *= 2;
450         }
451         if (hi >= nitems(fib))
452                 hi = nitems(fib);
453         while (lo + 1 != hi) {
454                 mid = (lo + hi) >> 1;
455                 if (fib[mid] <= size)
456                         lo = mid;
457                 else
458                         hi = mid;
459         }
460         stats->histo[lo]++;
461         if (lo > stats->max_bucket)
462                 stats->max_bucket = lo;
463         stats->err += size - stats->avg;
464         stats->num++;
465         stats->avg += stats->err / stats->num;
466         stats->err %= stats->num;
467 }
468
469 /*
470  * dump_gap_stats()    - print stats on gap sizes
471  */
472 static inline void
473 dump_gap_stats(const struct gap_stats *stats, struct sbuf *s)
474 {
475         int i;
476
477         sbuf_printf(s, "number of maximal free ranges: %jd\n",
478             (intmax_t)stats->num);
479         sbuf_printf(s, "largest free range: %jd\n", (intmax_t)stats->max);
480         sbuf_printf(s, "average maximal free range size: %jd\n",
481             (intmax_t)stats->avg);
482         sbuf_cat(s, "number of maximal free ranges of different sizes:\n");
483         sbuf_cat(s, "               count  |  size range\n");
484         sbuf_cat(s, "               -----  |  ----------\n");
485         for (i = 0; i < stats->max_bucket; i++) {
486                 if (stats->histo[i] != 0) {
487                         sbuf_printf(s, "%20jd  |  ",
488                             (intmax_t)stats->histo[i]);
489                         if (fib[i] != fib[i + 1] - 1)
490                                 sbuf_printf(s, "%jd to %jd\n", (intmax_t)fib[i],
491                                     (intmax_t)fib[i + 1] - 1);
492                         else
493                                 sbuf_printf(s, "%jd\n", (intmax_t)fib[i]);
494                 }
495         }
496         sbuf_printf(s, "%20jd  |  ", (intmax_t)stats->histo[i]);
497         if (stats->histo[i] > 1)
498                 sbuf_printf(s, "%jd to %jd\n", (intmax_t)fib[i],
499                     (intmax_t)stats->max);
500         else
501                 sbuf_printf(s, "%jd\n", (intmax_t)stats->max);
502 }
503
504 /*
505  * blist_stats()    - dump radix tree stats
506  */
507 void
508 blist_stats(blist_t bl, struct sbuf *s)
509 {
510         struct gap_stats gstats;
511         struct gap_stats *stats = &gstats;
512         daddr_t i, nodes, radix;
513         u_daddr_t diff, mask;
514         int digit;
515
516         init_gap_stats(stats);
517         nodes = 0;
518         radix = bl->bl_radix;
519         for (i = 0; i < bl->bl_blocks; ) {
520                 /*
521                  * Check for skippable subtrees starting at i.
522                  */
523                 while (radix != 1) {
524                         if (bl->bl_root[nodes].bm_bitmap == 0) {
525                                 if (gap_stats_counting(stats))
526                                         update_gap_stats(stats, i);
527                                 break;
528                         }
529
530                         /*
531                          * Skip subtree root.
532                          */
533                         nodes++;
534                         radix /= BLIST_RADIX;
535                 }
536                 if (radix == 1) {
537                         /*
538                          * Scan leaf.
539                          */
540                         mask = bl->bl_root[nodes].bm_bitmap;
541                         diff = mask ^ (mask << 1);
542                         if (gap_stats_counting(stats))
543                                 diff ^= 1;
544                         while (diff != 0) {
545                                 digit = bitpos(diff);
546                                 update_gap_stats(stats, i + digit);
547                                 diff ^= bitrange(digit, 1);
548                         }
549                 }
550                 nodes += radix_to_skip(radix * BLIST_RADIX);
551                 i += radix * BLIST_RADIX;
552
553                 /*
554                  * Find max size subtree starting at i.
555                  */
556                 for (radix = 1; 
557                     ((i / BLIST_RADIX / radix) & BLIST_MASK) == 0;
558                     radix *= BLIST_RADIX)
559                         ;
560         }
561         update_gap_stats(stats, i);
562         dump_gap_stats(stats, s);
563 }
564
565 /************************************************************************
566  *                        ALLOCATION SUPPORT FUNCTIONS                  *
567  ************************************************************************
568  *
569  *      These support functions do all the actual work.  They may seem
570  *      rather longish, but that's because I've commented them up.  The
571  *      actual code is straight forward.
572  *
573  */
574
575 /*
576  * BLST_NEXT_LEAF_ALLOC() - allocate the blocks starting with the next leaf.
577  *
578  *      'scan' is a leaf node, and its first block is at address 'start'.  The
579  *      next leaf node could be adjacent, or several nodes away if the least
580  *      common ancestor of 'scan' and its neighbor is several levels up.  Use
581  *      addresses to determine how many meta-nodes lie between the leaves.  If
582  *      sequence of leaves starting with the next one has enough initial bits
583  *      set, clear them and clear the bits in the meta nodes on the path up to
584  *      the least common ancestor to mark any subtrees made completely empty.
585  */
586 static int
587 blst_next_leaf_alloc(blmeta_t *scan, daddr_t start, int count, int maxcount)
588 {
589         u_daddr_t radix;
590         daddr_t blk;
591         int avail, digit;
592
593         start += BLIST_RADIX;
594         for (blk = start; blk - start < maxcount; blk += BLIST_RADIX) {
595                 /* Skip meta-nodes, as long as they promise more free blocks. */
596                 radix = BLIST_RADIX;
597                 while (((++scan)->bm_bitmap & 1) == 1 &&
598                     ((blk / radix) & BLIST_MASK) == 0)
599                         radix *= BLIST_RADIX;
600                 if (~scan->bm_bitmap != 0) {
601                         /*
602                          * Either there is no next leaf with any free blocks,
603                          * or we've reached the next leaf and found that some
604                          * of its blocks are not free.  In the first case,
605                          * bitpos() returns zero here.
606                          */
607                         avail = blk - start + bitpos(~scan->bm_bitmap);
608                         if (avail < count || avail == 0) {
609                                 /*
610                                  * There isn't a next leaf with enough free
611                                  * blocks at its beginning to bother
612                                  * allocating.
613                                  */
614                                 return (avail);
615                         }
616                         maxcount = imin(avail, maxcount);
617                         if (maxcount % BLIST_RADIX == 0) {
618                                 /*
619                                  * There was no next leaf.  Back scan up to
620                                  * last leaf.
621                                  */
622                                 do {
623                                         radix /= BLIST_RADIX;
624                                         --scan;
625                                 } while (radix != 1);
626                                 blk -= BLIST_RADIX;
627                         }
628                 }
629         }
630
631         /*
632          * 'scan' is the last leaf that provides blocks.  Clear from 1 to
633          * BLIST_RADIX bits to represent the allocation of those last blocks.
634          */
635         if (maxcount % BLIST_RADIX != 0)
636                 scan->bm_bitmap &= ~bitrange(0, maxcount % BLIST_RADIX);
637         else
638                 scan->bm_bitmap = 0;
639
640         for (;;) {
641                 /* Back up over meta-nodes, clearing bits if necessary. */
642                 blk -= BLIST_RADIX;
643                 for (radix = BLIST_RADIX;
644                     (digit = ((blk / radix) & BLIST_MASK)) == 0;
645                     radix *= BLIST_RADIX) {
646                         if ((scan--)->bm_bitmap == 0)
647                                 scan->bm_bitmap ^= 1;
648                 }
649                 if ((scan--)->bm_bitmap == 0)
650                         scan[-digit * radix_to_skip(radix)].bm_bitmap ^=
651                             (u_daddr_t)1 << digit;
652
653                 if (blk == start)
654                         break;
655                 /* Clear all the bits of this leaf. */
656                 scan->bm_bitmap = 0;
657         }
658         return (maxcount);
659 }
660
661 /*
662  * BLST_LEAF_ALLOC() -  allocate at a leaf in the radix tree (a bitmap).
663  *
664  *      This function is the core of the allocator.  Its execution time is
665  *      proportional to log(count), plus height of the tree if the allocation
666  *      crosses a leaf boundary.
667  */
668 static daddr_t
669 blst_leaf_alloc(blmeta_t *scan, daddr_t blk, int *count, int maxcount)
670 {
671         u_daddr_t mask;
672         int bighint, count1, hi, lo, num_shifts;
673
674         count1 = *count - 1;
675         num_shifts = fls(count1);
676         mask = ~scan->bm_bitmap;
677         while ((mask & (mask + 1)) != 0 && num_shifts > 0) {
678                 /*
679                  * If bit i is 0 in mask, then bits in [i, i + (count1 >>
680                  * num_shifts)] are 1 in scan->bm_bitmap.  Reduce num_shifts to
681                  * 0, while preserving this invariant.  The updates to mask
682                  * leave fewer bits 0, but each bit that remains 0 represents a
683                  * longer string of consecutive 1-bits in scan->bm_bitmap.  If
684                  * more updates to mask cannot set more bits, because mask is
685                  * partitioned with all 1 bits following all 0 bits, the loop
686                  * terminates immediately.
687                  */
688                 num_shifts--;
689                 mask |= mask >> ((count1 >> num_shifts) + 1) / 2;
690         }
691         bighint = count1 >> num_shifts;
692         if (~mask == 0) {
693                 /*
694                  * Update bighint.  There is no allocation bigger than
695                  * count1 >> num_shifts starting in this leaf.
696                  */
697                 scan->bm_bighint = bighint;
698                 return (SWAPBLK_NONE);
699         }
700
701         /* Discard any candidates that appear before blk. */
702         if ((blk & BLIST_MASK) != 0) {
703                 if ((~mask & bitrange(0, blk & BLIST_MASK)) != 0) {
704                         /* Grow bighint in case all discarded bits are set. */
705                         bighint += blk & BLIST_MASK;
706                         mask |= bitrange(0, blk & BLIST_MASK);
707                         if (~mask == 0) {
708                                 scan->bm_bighint = bighint;
709                                 return (SWAPBLK_NONE);
710                         }
711                 }
712                 blk -= blk & BLIST_MASK;
713         }
714
715         /*
716          * The least significant set bit in mask marks the start of the first
717          * available range of sufficient size.  Find its position.
718          */
719         lo = bitpos(~mask);
720
721         /*
722          * Find how much space is available starting at that position.
723          */
724         if ((mask & (mask + 1)) != 0) {
725                 /* Count the 1 bits starting at position lo. */
726                 hi = bitpos(mask & (mask + 1)) + count1;
727                 if (maxcount < hi - lo)
728                         hi = lo + maxcount;
729                 *count = hi - lo;
730                 mask = ~bitrange(lo, *count);
731         } else if (maxcount <= BLIST_RADIX - lo) {
732                 /* All the blocks we can use are available here. */
733                 hi = lo + maxcount;
734                 *count = maxcount;
735                 mask = ~bitrange(lo, *count);
736                 if (hi == BLIST_RADIX)
737                         scan->bm_bighint = bighint;
738         } else {
739                 /* Check next leaf for some of the blocks we want or need. */
740                 count1 = *count - (BLIST_RADIX - lo);
741                 maxcount -= BLIST_RADIX - lo;
742                 hi = blst_next_leaf_alloc(scan, blk, count1, maxcount);
743                 if (hi < count1)
744                         /*
745                          * The next leaf cannot supply enough blocks to reach
746                          * the minimum required allocation.  The hint cannot be
747                          * updated, because the same allocation request could
748                          * be satisfied later, by this leaf, if the state of
749                          * the next leaf changes, and without any changes to
750                          * this leaf.
751                          */
752                         return (SWAPBLK_NONE);
753                 *count = BLIST_RADIX - lo + hi;
754                 scan->bm_bighint = bighint;
755         }
756
757         /* Clear the allocated bits from this leaf. */
758         scan->bm_bitmap &= mask;
759         return (blk + lo);
760 }
761
762 /*
763  * blist_meta_alloc() - allocate at a meta in the radix tree.
764  *
765  *      Attempt to allocate at a meta node.  If we can't, we update
766  *      bighint and return a failure.  Updating bighint optimize future
767  *      calls that hit this node.  We have to check for our collapse cases
768  *      and we have a few optimizations strewn in as well.
769  */
770 static daddr_t
771 blst_meta_alloc(blmeta_t *scan, daddr_t cursor, int *count,
772     int maxcount, u_daddr_t radix)
773 {
774         daddr_t blk, i, r, skip;
775         u_daddr_t mask;
776         bool scan_from_start;
777         int digit;
778
779         if (radix == 1)
780                 return (blst_leaf_alloc(scan, cursor, count, maxcount));
781         blk = cursor & -(radix * BLIST_RADIX);
782         scan_from_start = (cursor == blk);
783         skip = radix_to_skip(radix);
784         mask = scan->bm_bitmap;
785
786         /* Discard any candidates that appear before cursor. */
787         digit = (cursor / radix) & BLIST_MASK;
788         mask &= (u_daddr_t)-1 << digit;
789         if (mask == 0)
790                 return (SWAPBLK_NONE);
791
792         /*
793          * If the first try is for a block that includes the cursor, pre-undo
794          * the digit * radix offset in the first call; otherwise, ignore the
795          * cursor entirely.
796          */
797         if (((mask >> digit) & 1) == 1)
798                 cursor -= digit * radix;
799         else
800                 cursor = blk;
801
802         /*
803          * Examine the nonempty subtree associated with each bit set in mask.
804          */
805         do {
806                 digit = bitpos(mask);
807                 i = 1 + digit * skip;
808                 if (*count <= scan[i].bm_bighint) {
809                         /*
810                          * The allocation might fit beginning in the i'th subtree.
811                          */
812                         r = blst_meta_alloc(&scan[i], cursor + digit * radix,
813                             count, maxcount, radix / BLIST_RADIX);
814                         if (r != SWAPBLK_NONE) {
815                                 if (scan[i].bm_bitmap == 0)
816                                         scan->bm_bitmap ^= bitrange(digit, 1);
817                                 return (r);
818                         }
819                 }
820                 cursor = blk;
821         } while ((mask ^= bitrange(digit, 1)) != 0);
822
823         /*
824          * We couldn't allocate count in this subtree.  If the whole tree was
825          * scanned, and the last tree node is allocated, update bighint.
826          */
827         if (scan_from_start && !(digit == BLIST_RADIX - 1 &&
828             scan[i].bm_bighint == BLIST_MAX_ALLOC))
829                 scan->bm_bighint = *count - 1;
830
831         return (SWAPBLK_NONE);
832 }
833
834 /*
835  * BLST_LEAF_FREE() -   free allocated block from leaf bitmap
836  *
837  */
838 static void
839 blst_leaf_free(blmeta_t *scan, daddr_t blk, int count)
840 {
841         u_daddr_t mask;
842
843         /*
844          * free some data in this bitmap
845          * mask=0000111111111110000
846          *          \_________/\__/
847          *              count   n
848          */
849         mask = bitrange(blk & BLIST_MASK, count);
850         KASSERT((scan->bm_bitmap & mask) == 0,
851             ("freeing free block: %jx, size %d, mask %jx",
852             (uintmax_t)blk, count, (uintmax_t)scan->bm_bitmap & mask));
853         scan->bm_bitmap |= mask;
854 }
855
856 /*
857  * BLST_META_FREE() - free allocated blocks from radix tree meta info
858  *
859  *      This support routine frees a range of blocks from the bitmap.
860  *      The range must be entirely enclosed by this radix node.  If a
861  *      meta node, we break the range down recursively to free blocks
862  *      in subnodes (which means that this code can free an arbitrary
863  *      range whereas the allocation code cannot allocate an arbitrary
864  *      range).
865  */
866 static void
867 blst_meta_free(blmeta_t *scan, daddr_t freeBlk, daddr_t count, u_daddr_t radix)
868 {
869         daddr_t blk, endBlk, i, skip;
870         int digit, endDigit;
871
872         /*
873          * We could probably do a better job here.  We are required to make
874          * bighint at least as large as the biggest allocable block of data.
875          * If we just shoehorn it, a little extra overhead will be incurred
876          * on the next allocation (but only that one typically).
877          */
878         scan->bm_bighint = BLIST_MAX_ALLOC;
879
880         if (radix == 1)
881                 return (blst_leaf_free(scan, freeBlk, count));
882
883         endBlk = freeBlk + count;
884         blk = (freeBlk + radix * BLIST_RADIX) & -(radix * BLIST_RADIX);
885         /*
886          * blk is first block past the end of the range of this meta node,
887          * or 0 in case of overflow.
888          */
889         if (blk != 0)
890                 endBlk = ummin(endBlk, blk);
891         skip = radix_to_skip(radix);
892         blk = freeBlk & -radix;
893         digit = (blk / radix) & BLIST_MASK;
894         endDigit = 1 + (((endBlk - 1) / radix) & BLIST_MASK);
895         scan->bm_bitmap |= bitrange(digit, endDigit - digit);
896         for (i = 1 + digit * skip; blk < endBlk; i += skip) {
897                 blk += radix;
898                 count = ummin(blk, endBlk) - freeBlk;
899                 blst_meta_free(&scan[i], freeBlk, count, radix / BLIST_RADIX);
900                 freeBlk = blk;
901         }
902 }
903
904 /*
905  * BLST_COPY() - copy one radix tree to another
906  *
907  *      Locates free space in the source tree and frees it in the destination
908  *      tree.  The space may not already be free in the destination.
909  */
910 static void
911 blst_copy(blmeta_t *scan, daddr_t blk, daddr_t radix, blist_t dest,
912     daddr_t count)
913 {
914         daddr_t endBlk, i, skip;
915
916         /*
917          * Leaf node
918          */
919
920         if (radix == 1) {
921                 u_daddr_t v = scan->bm_bitmap;
922
923                 if (v == (u_daddr_t)-1) {
924                         blist_free(dest, blk, count);
925                 } else if (v != 0) {
926                         int i;
927
928                         for (i = 0; i < count; ++i) {
929                                 if (v & ((u_daddr_t)1 << i))
930                                         blist_free(dest, blk + i, 1);
931                         }
932                 }
933                 return;
934         }
935
936         /*
937          * Meta node
938          */
939
940         if (scan->bm_bitmap == 0) {
941                 /*
942                  * Source all allocated, leave dest allocated
943                  */
944                 return;
945         }
946
947         endBlk = blk + count;
948         skip = radix_to_skip(radix);
949         for (i = 1; blk < endBlk; i += skip) {
950                 blk += radix;
951                 count = radix;
952                 if (blk >= endBlk)
953                         count -= blk - endBlk;
954                 blst_copy(&scan[i], blk - radix,
955                     radix / BLIST_RADIX, dest, count);
956         }
957 }
958
959 /*
960  * BLST_LEAF_FILL() -   allocate specific blocks in leaf bitmap
961  *
962  *      This routine allocates all blocks in the specified range
963  *      regardless of any existing allocations in that range.  Returns
964  *      the number of blocks allocated by the call.
965  */
966 static daddr_t
967 blst_leaf_fill(blmeta_t *scan, daddr_t blk, int count)
968 {
969         daddr_t nblks;
970         u_daddr_t mask;
971
972         mask = bitrange(blk & BLIST_MASK, count);
973
974         /* Count the number of blocks that we are allocating. */
975         nblks = bitcount64(scan->bm_bitmap & mask);
976
977         scan->bm_bitmap &= ~mask;
978         return (nblks);
979 }
980
981 /*
982  * BLIST_META_FILL() -  allocate specific blocks at a meta node
983  *
984  *      This routine allocates the specified range of blocks,
985  *      regardless of any existing allocations in the range.  The
986  *      range must be within the extent of this node.  Returns the
987  *      number of blocks allocated by the call.
988  */
989 static daddr_t
990 blst_meta_fill(blmeta_t *scan, daddr_t allocBlk, daddr_t count, u_daddr_t radix)
991 {
992         daddr_t blk, endBlk, i, nblks, skip;
993         int digit;
994
995         if (radix == 1)
996                 return (blst_leaf_fill(scan, allocBlk, count));
997
998         endBlk = allocBlk + count;
999         blk = (allocBlk + radix * BLIST_RADIX) & -(radix * BLIST_RADIX);
1000         /*
1001          * blk is first block past the end of the range of this meta node,
1002          * or 0 in case of overflow.
1003          */
1004         if (blk != 0)
1005                 endBlk = ummin(endBlk, blk);
1006         skip = radix_to_skip(radix);
1007         blk = allocBlk & -radix;
1008         nblks = 0;
1009         while (blk < endBlk) {
1010                 digit = (blk / radix) & BLIST_MASK;
1011                 i = 1 + digit * skip;
1012                 blk += radix;
1013                 count = ummin(blk, endBlk) - allocBlk;
1014                 nblks += blst_meta_fill(&scan[i], allocBlk, count,
1015                     radix / BLIST_RADIX);
1016                 if (scan[i].bm_bitmap == 0)
1017                         scan->bm_bitmap &= ~((u_daddr_t)1 << digit);
1018                 allocBlk = blk;
1019         }
1020         return (nblks);
1021 }
1022
1023 #ifdef BLIST_DEBUG
1024
1025 static void
1026 blst_radix_print(blmeta_t *scan, daddr_t blk, daddr_t radix, int tab)
1027 {
1028         daddr_t skip;
1029         u_daddr_t mask;
1030         int digit;
1031
1032         if (radix == 1) {
1033                 printf(
1034                     "%*.*s(%08llx,%lld): bitmap %0*llx big=%lld\n",
1035                     tab, tab, "",
1036                     (long long)blk, (long long)BLIST_RADIX,
1037                     (int)(1 + (BLIST_RADIX - 1) / 4),
1038                     (long long)scan->bm_bitmap,
1039                     (long long)scan->bm_bighint
1040                 );
1041                 return;
1042         }
1043
1044         printf(
1045             "%*.*s(%08llx): subtree (%lld/%lld) bitmap %0*llx big=%lld {\n",
1046             tab, tab, "",
1047             (long long)blk, (long long)radix * BLIST_RADIX,
1048             (long long)radix * BLIST_RADIX,
1049             (int)(1 + (BLIST_RADIX - 1) / 4),
1050             (long long)scan->bm_bitmap,
1051             (long long)scan->bm_bighint
1052         );
1053
1054         skip = radix_to_skip(radix);
1055         tab += 4;
1056
1057         mask = scan->bm_bitmap;
1058         /* Examine the nonempty subtree associated with each bit set in mask */
1059         do {
1060                 digit = bitpos(mask);
1061                 blst_radix_print(&scan[1 + digit * skip], blk + digit * radix,
1062                     radix / BLIST_RADIX, tab);
1063         } while ((mask ^= bitrange(digit, 1)) != 0);
1064         tab -= 4;
1065
1066         printf(
1067             "%*.*s}\n",
1068             tab, tab, ""
1069         );
1070 }
1071
1072 #endif
1073
1074 #ifdef BLIST_DEBUG
1075
1076 int
1077 main(int ac, char **av)
1078 {
1079         daddr_t size = BLIST_RADIX * BLIST_RADIX;
1080         int i;
1081         blist_t bl;
1082         struct sbuf *s;
1083
1084         for (i = 1; i < ac; ++i) {
1085                 const char *ptr = av[i];
1086                 if (*ptr != '-') {
1087                         size = strtoll(ptr, NULL, 0);
1088                         continue;
1089                 }
1090                 ptr += 2;
1091                 fprintf(stderr, "Bad option: %s\n", ptr - 2);
1092                 exit(1);
1093         }
1094         bl = blist_create(size, M_WAITOK);
1095         if (bl == NULL) {
1096                 fprintf(stderr, "blist_create failed\n");
1097                 exit(1);
1098         }
1099         blist_free(bl, 0, size);
1100
1101         for (;;) {
1102                 char buf[1024];
1103                 long long da = 0;
1104                 int count = 0, maxcount = 0;
1105
1106                 printf("%lld/%lld/%lld> ", (long long)blist_avail(bl),
1107                     (long long)size, (long long)bl->bl_radix * BLIST_RADIX);
1108                 fflush(stdout);
1109                 if (fgets(buf, sizeof(buf), stdin) == NULL)
1110                         break;
1111                 switch(buf[0]) {
1112                 case 'r':
1113                         if (sscanf(buf + 1, "%d", &count) == 1) {
1114                                 blist_resize(&bl, count, 1, M_WAITOK);
1115                         } else {
1116                                 printf("?\n");
1117                         }
1118                 case 'p':
1119                         blist_print(bl);
1120                         break;
1121                 case 's':
1122                         s = sbuf_new_auto();
1123                         blist_stats(bl, s);
1124                         sbuf_finish(s);
1125                         printf("%s", sbuf_data(s));
1126                         sbuf_delete(s);
1127                         break;
1128                 case 'a':
1129                         if (sscanf(buf + 1, "%d%d", &count, &maxcount) == 2) {
1130                                 daddr_t blk = blist_alloc(bl, &count, maxcount);
1131                                 printf("    R=%08llx, c=%08d\n",
1132                                     (long long)blk, count);
1133                         } else {
1134                                 printf("?\n");
1135                         }
1136                         break;
1137                 case 'f':
1138                         if (sscanf(buf + 1, "%llx %d", &da, &count) == 2) {
1139                                 blist_free(bl, da, count);
1140                         } else {
1141                                 printf("?\n");
1142                         }
1143                         break;
1144                 case 'l':
1145                         if (sscanf(buf + 1, "%llx %d", &da, &count) == 2) {
1146                                 printf("    n=%jd\n",
1147                                     (intmax_t)blist_fill(bl, da, count));
1148                         } else {
1149                                 printf("?\n");
1150                         }
1151                         break;
1152                 case '?':
1153                 case 'h':
1154                         puts(
1155                             "p          -print\n"
1156                             "s          -stats\n"
1157                             "a %d %d    -allocate\n"
1158                             "f %x %d    -free\n"
1159                             "l %x %d    -fill\n"
1160                             "r %d       -resize\n"
1161                             "h/?        -help\n"
1162                             "q          -quit"
1163                         );
1164                         break;
1165                 case 'q':
1166                         break;
1167                 default:
1168                         printf("?\n");
1169                         break;
1170                 }
1171                 if (buf[0] == 'q')
1172                         break;
1173         }
1174         return (0);
1175 }
1176
1177 #endif