From 931f63d47845139791ef6d28d2795df7e71e13f9 Mon Sep 17 00:00:00 2001 From: Antti Kantee Date: Tue, 3 Nov 2015 18:17:08 +0000 Subject: [PATCH] pgalloc: use builtin_ctz/clz instead of for loops. --- lib/libbmk_core/pgalloc.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/lib/libbmk_core/pgalloc.c b/lib/libbmk_core/pgalloc.c index ceb61c3..8c2d5db 100644 --- a/lib/libbmk_core/pgalloc.c +++ b/lib/libbmk_core/pgalloc.c @@ -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); -- 2.39.5