Re: [PATCH 2/2] lib: bitmap: reduce the number of goto again in bitmap_find_next_zero_area_off()
From: Yury Norov
Date: Tue May 12 2026 - 13:09:19 EST
On Tue, May 12, 2026 at 12:06:59PM +0800, Yi Sun wrote:
> Finding a contiguous free region in a highly fragmented
> bitmap is not easy and may require many repeated attempts.
> Therefore, find_next_bit(map, end, index) is not the optimal choice.
> This is because there may be multiple scattered free regions
> within the range [index, end) and none of them will meet the length
> requirement of @nr.
> Instead, it's sufficient to directly find the last bit within
> the range [index, end), thus reducing unnecessary "goto again" calls.
>
> Signed-off-by: Yi Sun <yi.sun@xxxxxxxxxx>
> ---
> lib/bitmap.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/lib/bitmap.c b/lib/bitmap.c
> index b9bfa157e095..53961a7683a4 100644
> --- a/lib/bitmap.c
> +++ b/lib/bitmap.c
> @@ -442,7 +442,7 @@ unsigned long bitmap_find_next_zero_area_off(unsigned long *map,
> end = index + nr;
> if (end > size)
> return end;
> - i = find_next_bit(map, end, index);
> + i = find_last_bit_range(map, end, index);
> if (i < end) {
> start = i + 1;
> goto again;
If the only user of the API is in-house, I believe we can just move
the 'map' pointer and decrease the 'end' accordingly:
i = find_last_bit(map + BITS_TO_LONGS(index),
end - round_down(index, BITS_PER_LONG));
That way you'll be able to bail out earlier just as well.
(Not tested, just an illustration)
Thanks,
Yury