答复: [PATCH 2/2] lib: bitmap: reduce the number of goto again in bitmap_find_next_zero_area_off()
From: 孙毅 (Yi Sun)
Date: Wed May 13 2026 - 23:04:34 EST
> -----邮件原件-----
> 发件人: Yury Norov <ynorov@xxxxxxxxxx>
> 发送时间: 2026年5月13日 0:52
> 收件人: 孙毅 (Yi Sun) <Yi.Sun@xxxxxxxxxx>
> 抄送: yury.norov@xxxxxxxxx; akpm@xxxxxxxxxxxxxxxxxxxx;
> mina86@xxxxxxxxxx; akinobu.mita@xxxxxxxxx; linux-kernel@xxxxxxxxxxxxxxx
> 主题: Re: [PATCH 2/2] lib: bitmap: reduce the number of goto again in
> bitmap_find_next_zero_area_off()
>
>
> 注意: 这封邮件来自于外部。除非你确定邮件内容安全,否则不要点击任何链
> 接和附件。
> CAUTION: This email originated from outside of the organization. Do not click links
> or open attachments unless you recognize the sender and know the content is
> safe.
>
>
>
> 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.
That's true, but this makes the bitmap_find_next_zero_area_off() more complex.
I will submit the changes as PATCH v2.
find_last_bit_range() is only used here for now, but I believe it will be useful in the future.
Thanks to Michał Nazarewicz for his suggestions on optimizing find_last_bit_range().
I will submit the optimized code to PATCH v3.
>
> (Not tested, just an illustration)
>
> Thanks,
> Yury