]> git.ipfire.org Git - people/ms/linux.git/commitdiff
mm/percpu: micro-optimize pcpu_is_populated()
authorYury Norov <yury.norov@gmail.com>
Sat, 14 Aug 2021 21:17:10 +0000 (14:17 -0700)
committerYury Norov <yury.norov@gmail.com>
Sat, 15 Jan 2022 16:47:31 +0000 (08:47 -0800)
bitmap_next_clear_region() calls find_next_zero_bit() and find_next_bit()
sequentially to find a range of clear bits. In case of pcpu_is_populated()
there's a chance to return earlier if bitmap has all bits set.

Signed-off-by: Yury Norov <yury.norov@gmail.com>
Tested-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Acked-by: Dennis Zhou <dennis@kernel.org>
mm/percpu.c

index f5b2c2ea5a548adf4704ee7aacfdade4be3c1c13..0c6f85c5514f971922cbe06590ed34602a3094ce 100644 (file)
@@ -1070,17 +1070,18 @@ static void pcpu_block_update_hint_free(struct pcpu_chunk *chunk, int bit_off,
 static bool pcpu_is_populated(struct pcpu_chunk *chunk, int bit_off, int bits,
                              int *next_off)
 {
-       unsigned int page_start, page_end, rs, re;
+       unsigned int start, end;
 
-       page_start = PFN_DOWN(bit_off * PCPU_MIN_ALLOC_SIZE);
-       page_end = PFN_UP((bit_off + bits) * PCPU_MIN_ALLOC_SIZE);
+       start = PFN_DOWN(bit_off * PCPU_MIN_ALLOC_SIZE);
+       end = PFN_UP((bit_off + bits) * PCPU_MIN_ALLOC_SIZE);
 
-       rs = page_start;
-       bitmap_next_clear_region(chunk->populated, &rs, &re, page_end);
-       if (rs >= page_end)
+       start = find_next_zero_bit(chunk->populated, end, start);
+       if (start >= end)
                return true;
 
-       *next_off = re * PAGE_SIZE / PCPU_MIN_ALLOC_SIZE;
+       end = find_next_bit(chunk->populated, end, start + 1);
+
+       *next_off = end * PAGE_SIZE / PCPU_MIN_ALLOC_SIZE;
        return false;
 }