]> xenbits.xensource.com Git - osstest/rumprun.git/commitdiff
pgalloc: use builtin_ctz/clz instead of for loops.
authorAntti Kantee <pooka@iki.fi>
Tue, 3 Nov 2015 18:17:08 +0000 (18:17 +0000)
committerAntti Kantee <pooka@iki.fi>
Tue, 3 Nov 2015 18:17:08 +0000 (18:17 +0000)
lib/libbmk_core/pgalloc.c

index ceb61c3dff5118155a9000469b0e9fd99a9d8c04..8c2d5db70313dc1926c3827b8769dacc1bdb00d2 100644 (file)
@@ -276,16 +276,19 @@ static void
 carverange(unsigned long addr, unsigned long range)
 {
        struct chunk *ch;
-       unsigned i;
+       unsigned i, r;
 
        while (range) {
                /*
                 * Next chunk is limited by alignment of addr, but also
                 * must not be bigger than remaining range.
                 */
-               for (i = 0; order2size(i+1) <= range; i++)
-                       if (addr & order2size(i))
-                               break;
+               i = __builtin_ctzl(addr);
+               r = 8*sizeof(range) - (__builtin_clzl(range)+1);
+               if (i > r) {
+                       i = r;
+               }
+               i -= BMK_PCPU_PAGE_SHIFT;
 
                ch = addr2chunk(addr, 0);
                carveandlink_freechunk(ch, i);