The Linux Kernel Mailing List
 help / color / mirror / Atom feed
* [PATCH v5 0/2] Improve the performance of bitmap_find_next_zero_area_off()
@ 2026-06-18  1:52 Yi Sun
  2026-06-18  1:52 ` [PATCH v5 1/2] lib: bitmap: add tests for bitmap_find_next_zero_area_off() Yi Sun
  2026-06-18  1:52 ` [PATCH v5 2/2] lib: bitmap: optimize bitmap_find_next_zero_area_off() Yi Sun
  0 siblings, 2 replies; 8+ messages in thread
From: Yi Sun @ 2026-06-18  1:52 UTC (permalink / raw)
  To: yury.norov, mina86
  Cc: yi.sun, 279644543, mnazarewicz, akpm, akinobu.mita, linux-kernel,
	john.stultz, tjmercier, qiang.zhao, scottwood, benjamin.gaignard,
	fvdl, tglx, andreas.herrmann, song, hch, sasha.levin, minchan

Use lib/find_bit_benchmark.c for testing.
Test results showed a 40% improvement in dense cases,
and almost no change in sparse cases.

Performance test results on my hardware:
	before(ns)	after(ns)	change	p-value
dense	1211		688		-43.2%	8.3e-11
sparse	13.3		13.4		0.8%	0.27


The following modifications were made based on v4:
- Improve test code and testing methods to make
  test results more stable and accurate.
- Change the "goto again" code structure to a for loop.

---
v4: https://lore.kernel.org/all/20260601094234.103863-1-yi.sun@unisoc.com
- Test code has been added to PATCH v2.

v3: https://lore.kernel.org/all/20260514090607.231387-1-yi.sun@unisoc.com
- Code optimization was performed on PATCH v1.

v2: https://lore.kernel.org/all/20260514035644.4118050-1-yi.sun@unisoc.com
- Do not introduce find_last_bit_from().

v1: https://lore.kernel.org/all/20260512040659.2992142-1-yi.sun@unisoc.com


Yi Sun (2):
  lib: bitmap: add tests for bitmap_find_next_zero_area_off()
  lib: bitmap: optimize bitmap_find_next_zero_area_off()

 lib/bitmap.c             | 35 +++++++++++++++++++++--------------
 lib/find_bit_benchmark.c | 17 +++++++++++++++++
 lib/test_bitmap.c        | 38 ++++++++++++++++++++++++++++++++++++++
 3 files changed, 76 insertions(+), 14 deletions(-)

-- 
2.34.1


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH v5 1/2] lib: bitmap: add tests for bitmap_find_next_zero_area_off()
  2026-06-18  1:52 [PATCH v5 0/2] Improve the performance of bitmap_find_next_zero_area_off() Yi Sun
@ 2026-06-18  1:52 ` Yi Sun
  2026-06-18  5:48   ` Yury Norov
  2026-06-18  1:52 ` [PATCH v5 2/2] lib: bitmap: optimize bitmap_find_next_zero_area_off() Yi Sun
  1 sibling, 1 reply; 8+ messages in thread
From: Yi Sun @ 2026-06-18  1:52 UTC (permalink / raw)
  To: yury.norov, mina86
  Cc: yi.sun, 279644543, mnazarewicz, akpm, akinobu.mita, linux-kernel,
	john.stultz, tjmercier, qiang.zhao, scottwood, benjamin.gaignard,
	fvdl, tglx, andreas.herrmann, song, hch, sasha.levin, minchan

Add functional and performance tests
for bitmap_find_next_zero_area_off().

To maintain consistent output format,
use "find_next_0_area" instead of
"bitmap_find_next_zero_area_off".

performance tests partial output:
Start testing find_bit() with random-filled bitmap
[    0.191166] find_next_0_area:              1521308 ns,   1326 iterations
[    0.192552] find_next_bit:                 1382385 ns, 163724 iterations
Start testing find_bit() with sparse bitmap
[    0.196835] find_next_0_area:              4250307 ns, 322497 iterations
[    0.196853] find_next_bit:                   15077 ns,    656 iterations

Signed-off-by: Yi Sun <yi.sun@unisoc.com>
---
 lib/find_bit_benchmark.c | 17 +++++++++++++++++
 lib/test_bitmap.c        | 38 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 55 insertions(+)

diff --git a/lib/find_bit_benchmark.c b/lib/find_bit_benchmark.c
index 00d9dc61cd46..062a69930d83 100644
--- a/lib/find_bit_benchmark.c
+++ b/lib/find_bit_benchmark.c
@@ -149,6 +149,21 @@ static int __init test_find_next_and_bit(const void *bitmap,
 	return 0;
 }
 
+static int __init
+test_bitmap_find_next_zero_area_off(unsigned long *bitmap, unsigned long len)
+{
+	unsigned long i, cnt;
+	ktime_t time;
+
+	time = ktime_get();
+	for (cnt = i = 0; i < BITMAP_LEN; cnt++)
+		i = bitmap_find_next_zero_area_off(bitmap, BITMAP_LEN, i, 8, 0, 0) + 1;
+	time = ktime_get() - time;
+	pr_err("find_next_0_area:   %18llu ns, %6ld iterations\n", time, cnt);
+
+	return 0;
+}
+
 static int __init find_bit_test(void)
 {
 	unsigned long nbits = BITMAP_LEN / SPARSE;
@@ -158,6 +173,7 @@ static int __init find_bit_test(void)
 	get_random_bytes(bitmap, sizeof(bitmap));
 	get_random_bytes(bitmap2, sizeof(bitmap2));
 
+	test_bitmap_find_next_zero_area_off(bitmap, BITMAP_LEN);
 	test_find_next_bit(bitmap, BITMAP_LEN);
 	test_find_next_zero_bit(bitmap, BITMAP_LEN);
 	test_find_last_bit(bitmap, BITMAP_LEN);
@@ -181,6 +197,7 @@ static int __init find_bit_test(void)
 		__set_bit(get_random_u32_below(BITMAP_LEN), bitmap2);
 	}
 
+	test_bitmap_find_next_zero_area_off(bitmap, BITMAP_LEN);
 	test_find_next_bit(bitmap, BITMAP_LEN);
 	test_find_next_zero_bit(bitmap, BITMAP_LEN);
 	test_find_last_bit(bitmap, BITMAP_LEN);
diff --git a/lib/test_bitmap.c b/lib/test_bitmap.c
index 69813c10e6c0..12aa2ca37fe1 100644
--- a/lib/test_bitmap.c
+++ b/lib/test_bitmap.c
@@ -234,6 +234,43 @@ static void __init test_find_nth_bit(void)
 	}
 }
 
+static void __init
+test_bitmap_find_next_zero_area_off(void)
+{
+	DECLARE_BITMAP(bmap, 192);
+
+	bitmap_set(bmap, 0, 192);
+
+	bitmap_clear(bmap, 0, 8);
+	__clear_bit(50, bmap);
+	bitmap_clear(bmap, 60, 18);
+	__set_bit(69, bmap);
+	__clear_bit(80, bmap);
+	bitmap_clear(bmap, 100, 10);
+	__clear_bit(120, bmap);
+	bitmap_clear(bmap, 145, 8);
+	bitmap_clear(bmap, 160, 32);
+
+	expect_eq_uint(0,
+		bitmap_find_next_zero_area_off(bmap, 192, 0, 8, 0, 0));
+	expect_eq_uint(0,
+		bitmap_find_next_zero_area_off(bmap, 192, 0, 8, 3, 0));
+	expect_eq_uint(163,
+		bitmap_find_next_zero_area_off(bmap, 192, 0, 8, 3, 1));
+	expect_eq_uint(60,
+		bitmap_find_next_zero_area_off(bmap, 192, 1, 8, 0, 0));
+	expect_eq_uint(160,
+		bitmap_find_next_zero_area_off(bmap, 192, 1, 8, 7, 0));
+	expect_eq_uint(60,
+		bitmap_find_next_zero_area_off(bmap, 192, 1, 8, 7, 4));
+	expect_eq_uint(100,
+		bitmap_find_next_zero_area_off(bmap, 192, 0, 10, 0, 0));
+	expect_eq_uint(160,
+		bitmap_find_next_zero_area_off(bmap, 192, 0, 32, 0, 0));
+	expect_eq_uint(1,
+		!!(bitmap_find_next_zero_area_off(bmap, 192, 0, 33, 0, 0) > 192));
+}
+
 static void __init test_fill_set(void)
 {
 	DECLARE_BITMAP(bmap, 1024);
@@ -1559,6 +1596,7 @@ static void __init selftest(void)
 	test_for_each_clear_bitrange_from();
 	test_for_each_set_clump8();
 	test_for_each_set_bit_wrap();
+	test_bitmap_find_next_zero_area_off();
 }
 
 KSTM_MODULE_LOADERS(test_bitmap);
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v5 2/2] lib: bitmap: optimize bitmap_find_next_zero_area_off()
  2026-06-18  1:52 [PATCH v5 0/2] Improve the performance of bitmap_find_next_zero_area_off() Yi Sun
  2026-06-18  1:52 ` [PATCH v5 1/2] lib: bitmap: add tests for bitmap_find_next_zero_area_off() Yi Sun
@ 2026-06-18  1:52 ` Yi Sun
  2026-06-18  6:14   ` Yury Norov
  1 sibling, 1 reply; 8+ messages in thread
From: Yi Sun @ 2026-06-18  1:52 UTC (permalink / raw)
  To: yury.norov, mina86
  Cc: yi.sun, 279644543, mnazarewicz, akpm, akinobu.mita, linux-kernel,
	john.stultz, tjmercier, qiang.zhao, scottwood, benjamin.gaignard,
	fvdl, tglx, andreas.herrmann, song, hch, sasha.levin, minchan

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 repeated calls.

An example of a bitmap:
Bits 0-3:   cleared(4 bits)
Bits 4-5:   set    (2 bits)
Bits 6-8:   cleared(4 bits)
Bits 9-10:  set    (2 bits)
Bits 11-20: cleared(10 bits)

The goal is to find a 10-bit free region.

The old code logic is as follows:
find_next_zero_bit(start = 0, find bit 0) -> find_next_bit(find bit 4) ->
goto again ->
find_next_zero_bit(start = 5, find bit 6) -> find_next_bit(find bit 9) ->
goto again ->
find_next_zero_bit(start = 10, find bit 11) -> success

The new code logic is as follows:
find_next_zero_bit(start = 0, find bit 0) -> find_last_bit(find bit 9) ->
goto again ->
find_next_zero_bit(start = 10, find bit 11) -> success

Performance test results on my hardware(use lib/find_bit_benchmark.c):

		before	after	change	p-value
dense		1211	688	-43.2%	8.3e-11
sparse		13.3	13.4	0.8%	0.27

Signed-off-by: Yi Sun <yi.sun@unisoc.com>
---
 lib/bitmap.c | 35 +++++++++++++++++++++--------------
 1 file changed, 21 insertions(+), 14 deletions(-)

diff --git a/lib/bitmap.c b/lib/bitmap.c
index b9bfa157e095..a2c4bd22d875 100644
--- a/lib/bitmap.c
+++ b/lib/bitmap.c
@@ -432,22 +432,29 @@ unsigned long bitmap_find_next_zero_area_off(unsigned long *map,
 					     unsigned long align_mask,
 					     unsigned long align_offset)
 {
-	unsigned long index, end, i;
-again:
-	index = find_next_zero_bit(map, size, start);
-
-	/* Align allocation */
-	index = __ALIGN_MASK(index + align_offset, align_mask) - align_offset;
-
-	end = index + nr;
-	if (end > size)
-		return end;
-	i = find_next_bit(map, end, index);
-	if (i < end) {
+	unsigned long find_idx, end, i, find_word_idx, find_word_off;
+
+	for (;;) {
+		find_idx = find_next_zero_bit(map, size, start);
+
+		/* Align allocation */
+		find_idx = __ALIGN_MASK(find_idx + align_offset,
+			align_mask) - align_offset;
+
+		end = find_idx + nr;
+		if (end > size)
+			return end;
+
+		find_word_idx = find_idx / BITS_PER_LONG;
+		find_word_off = find_word_idx * BITS_PER_LONG;
+
+		i = find_last_bit(map + find_word_idx,
+			end - find_word_off) + find_word_off;
+		if (i >= end || i < find_idx)
+			return find_idx;
+
 		start = i + 1;
-		goto again;
 	}
-	return index;
 }
 EXPORT_SYMBOL(bitmap_find_next_zero_area_off);
 
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH v5 1/2] lib: bitmap: add tests for bitmap_find_next_zero_area_off()
  2026-06-18  1:52 ` [PATCH v5 1/2] lib: bitmap: add tests for bitmap_find_next_zero_area_off() Yi Sun
@ 2026-06-18  5:48   ` Yury Norov
  2026-06-18  9:43     ` 答复: " 孙毅 (Yi Sun)
  2026-06-18 12:44     ` 孙毅 (Yi Sun)
  0 siblings, 2 replies; 8+ messages in thread
From: Yury Norov @ 2026-06-18  5:48 UTC (permalink / raw)
  To: Yi Sun
  Cc: yury.norov, mina86, 279644543, mnazarewicz, akpm, akinobu.mita,
	linux-kernel, john.stultz, tjmercier, qiang.zhao, scottwood,
	benjamin.gaignard, fvdl, tglx, andreas.herrmann, song, hch,
	sasha.levin, minchan

On Thu, Jun 18, 2026 at 09:52:51AM +0800, Yi Sun wrote:
> Add functional and performance tests
> for bitmap_find_next_zero_area_off().
> 
> To maintain consistent output format,
> use "find_next_0_area" instead of
> "bitmap_find_next_zero_area_off".
> 
> performance tests partial output:
> Start testing find_bit() with random-filled bitmap
> [    0.191166] find_next_0_area:              1521308 ns,   1326 iterations
> [    0.192552] find_next_bit:                 1382385 ns, 163724 iterations
> Start testing find_bit() with sparse bitmap
> [    0.196835] find_next_0_area:              4250307 ns, 322497 iterations
> [    0.196853] find_next_bit:                   15077 ns,    656 iterations
> 
> Signed-off-by: Yi Sun <yi.sun@unisoc.com>
> ---
>  lib/find_bit_benchmark.c | 17 +++++++++++++++++
>  lib/test_bitmap.c        | 38 ++++++++++++++++++++++++++++++++++++++
>  2 files changed, 55 insertions(+)
> 
> diff --git a/lib/find_bit_benchmark.c b/lib/find_bit_benchmark.c
> index 00d9dc61cd46..062a69930d83 100644
> --- a/lib/find_bit_benchmark.c
> +++ b/lib/find_bit_benchmark.c
> @@ -149,6 +149,21 @@ static int __init test_find_next_and_bit(const void *bitmap,
>  	return 0;
>  }
>  
> +static int __init
> +test_bitmap_find_next_zero_area_off(unsigned long *bitmap, unsigned long len)
> +{
> +	unsigned long i, cnt;
> +	ktime_t time;
> +
> +	time = ktime_get();
> +	for (cnt = i = 0; i < BITMAP_LEN; cnt++)
> +		i = bitmap_find_next_zero_area_off(bitmap, BITMAP_LEN, i, 8, 0, 0) + 1;
> +	time = ktime_get() - time;
> +	pr_err("find_next_0_area:   %18llu ns, %6ld iterations\n", time, cnt);

Change %18llu to %14llu (or whatever), and keep the name as it should.

> +
> +	return 0;
> +}
> +
>  static int __init find_bit_test(void)
>  {
>  	unsigned long nbits = BITMAP_LEN / SPARSE;
> @@ -158,6 +173,7 @@ static int __init find_bit_test(void)
>  	get_random_bytes(bitmap, sizeof(bitmap));
>  	get_random_bytes(bitmap2, sizeof(bitmap2));
>  
> +	test_bitmap_find_next_zero_area_off(bitmap, BITMAP_LEN);
>  	test_find_next_bit(bitmap, BITMAP_LEN);
>  	test_find_next_zero_bit(bitmap, BITMAP_LEN);
>  	test_find_last_bit(bitmap, BITMAP_LEN);
> @@ -181,6 +197,7 @@ static int __init find_bit_test(void)
>  		__set_bit(get_random_u32_below(BITMAP_LEN), bitmap2);
>  	}
>  
> +	test_bitmap_find_next_zero_area_off(bitmap, BITMAP_LEN);
>  	test_find_next_bit(bitmap, BITMAP_LEN);
>  	test_find_next_zero_bit(bitmap, BITMAP_LEN);
>  	test_find_last_bit(bitmap, BITMAP_LEN);
> diff --git a/lib/test_bitmap.c b/lib/test_bitmap.c
> index 69813c10e6c0..12aa2ca37fe1 100644
> --- a/lib/test_bitmap.c
> +++ b/lib/test_bitmap.c
> @@ -234,6 +234,43 @@ static void __init test_find_nth_bit(void)
>  	}
>  }
>  
> +static void __init
> +test_bitmap_find_next_zero_area_off(void)
> +{
> +	DECLARE_BITMAP(bmap, 192);
> +
> +	bitmap_set(bmap, 0, 192);
> +
> +	bitmap_clear(bmap, 0, 8);
> +	__clear_bit(50, bmap);
> +	bitmap_clear(bmap, 60, 18);
> +	__set_bit(69, bmap);
> +	__clear_bit(80, bmap);
> +	bitmap_clear(bmap, 100, 10);
> +	__clear_bit(120, bmap);
> +	bitmap_clear(bmap, 145, 8);
> +	bitmap_clear(bmap, 160, 32);
> +
> +	expect_eq_uint(0,
> +		bitmap_find_next_zero_area_off(bmap, 192, 0, 8, 0, 0));
> +	expect_eq_uint(0,
> +		bitmap_find_next_zero_area_off(bmap, 192, 0, 8, 3, 0));
> +	expect_eq_uint(163,
> +		bitmap_find_next_zero_area_off(bmap, 192, 0, 8, 3, 1));
> +	expect_eq_uint(60,
> +		bitmap_find_next_zero_area_off(bmap, 192, 1, 8, 0, 0));
> +	expect_eq_uint(160,
> +		bitmap_find_next_zero_area_off(bmap, 192, 1, 8, 7, 0));
> +	expect_eq_uint(60,
> +		bitmap_find_next_zero_area_off(bmap, 192, 1, 8, 7, 4));
> +	expect_eq_uint(100,
> +		bitmap_find_next_zero_area_off(bmap, 192, 0, 10, 0, 0));
> +	expect_eq_uint(160,
> +		bitmap_find_next_zero_area_off(bmap, 192, 0, 32, 0, 0));
> +	expect_eq_uint(1,
> +		!!(bitmap_find_next_zero_area_off(bmap, 192, 0, 33, 0, 0) > 192));

It should be >= here.

> +}
> +
>  static void __init test_fill_set(void)
>  {
>  	DECLARE_BITMAP(bmap, 1024);
> @@ -1559,6 +1596,7 @@ static void __init selftest(void)
>  	test_for_each_clear_bitrange_from();
>  	test_for_each_set_clump8();
>  	test_for_each_set_bit_wrap();
> +	test_bitmap_find_next_zero_area_off();
>  }
>  
>  KSTM_MODULE_LOADERS(test_bitmap);
> -- 
> 2.34.1

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v5 2/2] lib: bitmap: optimize bitmap_find_next_zero_area_off()
  2026-06-18  1:52 ` [PATCH v5 2/2] lib: bitmap: optimize bitmap_find_next_zero_area_off() Yi Sun
@ 2026-06-18  6:14   ` Yury Norov
  2026-06-18  9:29     ` 答复: " 孙毅 (Yi Sun)
  0 siblings, 1 reply; 8+ messages in thread
From: Yury Norov @ 2026-06-18  6:14 UTC (permalink / raw)
  To: Yi Sun
  Cc: yury.norov, mina86, 279644543, mnazarewicz, akpm, akinobu.mita,
	linux-kernel, john.stultz, tjmercier, qiang.zhao, scottwood,
	benjamin.gaignard, fvdl, tglx, andreas.herrmann, song, hch,
	sasha.levin, minchan

On Thu, Jun 18, 2026 at 09:52:52AM +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 repeated calls.
> 
> An example of a bitmap:
> Bits 0-3:   cleared(4 bits)
> Bits 4-5:   set    (2 bits)
> Bits 6-8:   cleared(4 bits)
> Bits 9-10:  set    (2 bits)
> Bits 11-20: cleared(10 bits)
> 
> The goal is to find a 10-bit free region.
> 
> The old code logic is as follows:
> find_next_zero_bit(start = 0, find bit 0) -> find_next_bit(find bit 4) ->
> goto again ->
> find_next_zero_bit(start = 5, find bit 6) -> find_next_bit(find bit 9) ->
> goto again ->
> find_next_zero_bit(start = 10, find bit 11) -> success
> 
> The new code logic is as follows:
> find_next_zero_bit(start = 0, find bit 0) -> find_last_bit(find bit 9) ->
> goto again ->
> find_next_zero_bit(start = 10, find bit 11) -> success

In new logic there's no goto, right?

> Performance test results on my hardware(use lib/find_bit_benchmark.c):
> 
> 		before	after	change	p-value
> dense		1211	688	-43.2%	8.3e-11
> sparse		13.3	13.4	0.8%	0.27
> 
> Signed-off-by: Yi Sun <yi.sun@unisoc.com>
> ---
>  lib/bitmap.c | 35 +++++++++++++++++++++--------------
>  1 file changed, 21 insertions(+), 14 deletions(-)
> 
> diff --git a/lib/bitmap.c b/lib/bitmap.c
> index b9bfa157e095..a2c4bd22d875 100644
> --- a/lib/bitmap.c
> +++ b/lib/bitmap.c
> @@ -432,22 +432,29 @@ unsigned long bitmap_find_next_zero_area_off(unsigned long *map,
>  					     unsigned long align_mask,
>  					     unsigned long align_offset)
>  {
> -	unsigned long index, end, i;
> -again:
> -	index = find_next_zero_bit(map, size, start);
> -
> -	/* Align allocation */
> -	index = __ALIGN_MASK(index + align_offset, align_mask) - align_offset;
> -
> -	end = index + nr;
> -	if (end > size)
> -		return end;
> -	i = find_next_bit(map, end, index);
> -	if (i < end) {
> +	unsigned long find_idx, end, i, find_word_idx, find_word_off;
> +
> +	for (;;) {

"Infinite" loop is nothing better than the backward goto. 
Can you try this:

        unsigned long end, i, off;

        for_each_clear_bit_from(start, map, size) {
                start = __ALIGN_MASK(start + align_offset, align_mask) - align_offset;
                end = start + nr;
                if (end > size)
                        break;

                off = round_down(start, BITS_PER_LONG);
                i = find_last_bit(map + start / BITS_PER_LONG, end - off) + off;
                if (i >= end || i < start)
                        return start;

                start = i;
        }

        return size;

If it works for you, let's move with the for_each() version.
Can you test and add my Co-developed-by please?

Thanks,
Yury

> +		find_idx = find_next_zero_bit(map, size, start);
> +
> +		/* Align allocation */
> +		find_idx = __ALIGN_MASK(find_idx + align_offset,
> +			align_mask) - align_offset;
> +
> +		end = find_idx + nr;
> +		if (end > size)
> +			return end;
> +
> +		find_word_idx = find_idx / BITS_PER_LONG;
> +		find_word_off = find_word_idx * BITS_PER_LONG;
> +
> +		i = find_last_bit(map + find_word_idx,
> +			end - find_word_off) + find_word_off;
> +		if (i >= end || i < find_idx)
> +			return find_idx;
> +
>  		start = i + 1;
> -		goto again;
>  	}
> -	return index;
>  }
>  EXPORT_SYMBOL(bitmap_find_next_zero_area_off);
>  
> -- 
> 2.34.1

^ permalink raw reply	[flat|nested] 8+ messages in thread

* 答复: [PATCH v5 2/2] lib: bitmap: optimize bitmap_find_next_zero_area_off()
  2026-06-18  6:14   ` Yury Norov
@ 2026-06-18  9:29     ` 孙毅 (Yi Sun)
  0 siblings, 0 replies; 8+ messages in thread
From: 孙毅 (Yi Sun) @ 2026-06-18  9:29 UTC (permalink / raw)
  To: Yury Norov
  Cc: mina86@mina86.com, 279644543@qq.com, mnazarewicz@gmail.com,
	akpm@linux-foundation.org, akinobu.mita@gmail.com,
	linux-kernel@vger.kernel.org, tjmercier@google.com,
	qiang.zhao@freescale.com, scottwood@freescale.com,
	benjamin.gaignard@linaro.org, fvdl@google.com, tglx@kernel.org,
	song@kernel.org, hch@lst.de, minchan@kernel.org,
	王科 (Ke Wang), John Stultz



> -----邮件原件-----
> 发件人: Yury Norov <yury.norov@gmail.com>
> 发送时间: 2026年6月18日 14:15
> 收件人: 孙毅 (Yi Sun) <Yi.Sun@unisoc.com>
> 抄送: yury.norov@gmail.com; mina86@mina86.com; 279644543@qq.com;
> mnazarewicz@gmail.com; akpm@linux-foundation.org;
> akinobu.mita@gmail.com; linux-kernel@vger.kernel.org; john.stultz@linaro.org;
> tjmercier@google.com; qiang.zhao@freescale.com; scottwood@freescale.com;
> benjamin.gaignard@linaro.org; fvdl@google.com; tglx@kernel.org;
> andreas.herrmann@calxeda.com; song@kernel.org; hch@lst.de;
> sasha.levin@oracle.com; minchan@kernel.org
> 主题: Re: [PATCH v5 2/2] lib: bitmap: optimize 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 Thu, Jun 18, 2026 at 09:52:52AM +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 repeated calls.
> >
> > An example of a bitmap:
> > Bits 0-3:   cleared(4 bits)
> > Bits 4-5:   set    (2 bits)
> > Bits 6-8:   cleared(4 bits)
> > Bits 9-10:  set    (2 bits)
> > Bits 11-20: cleared(10 bits)
> >
> > The goal is to find a 10-bit free region.
> >
> > The old code logic is as follows:
> > find_next_zero_bit(start = 0, find bit 0) -> find_next_bit(find bit 4) ->
> > goto again ->
> > find_next_zero_bit(start = 5, find bit 6) -> find_next_bit(find bit 9) ->
> > goto again ->
> > find_next_zero_bit(start = 10, find bit 11) -> success
> >
> > The new code logic is as follows:
> > find_next_zero_bit(start = 0, find bit 0) -> find_last_bit(find bit 9) ->
> > goto again ->
> > find_next_zero_bit(start = 10, find bit 11) -> success
> 
> In new logic there's no goto, right?

ok, I will make changes in v6.

> 
> > Performance test results on my hardware(use lib/find_bit_benchmark.c):
> >
> >               before  after   change  p-value
> > dense         1211    688     -43.2%  8.3e-11
> > sparse                13.3    13.4    0.8%    0.27
> >
> > Signed-off-by: Yi Sun <yi.sun@unisoc.com>
> > ---
> >  lib/bitmap.c | 35 +++++++++++++++++++++--------------
> >  1 file changed, 21 insertions(+), 14 deletions(-)
> >
> > diff --git a/lib/bitmap.c b/lib/bitmap.c
> > index b9bfa157e095..a2c4bd22d875 100644
> > --- a/lib/bitmap.c
> > +++ b/lib/bitmap.c
> > @@ -432,22 +432,29 @@ unsigned long
> bitmap_find_next_zero_area_off(unsigned long *map,
> >                                            unsigned long align_mask,
> >                                            unsigned long align_offset)
> >  {
> > -     unsigned long index, end, i;
> > -again:
> > -     index = find_next_zero_bit(map, size, start);
> > -
> > -     /* Align allocation */
> > -     index = __ALIGN_MASK(index + align_offset, align_mask) - align_offset;
> > -
> > -     end = index + nr;
> > -     if (end > size)
> > -             return end;
> > -     i = find_next_bit(map, end, index);
> > -     if (i < end) {
> > +     unsigned long find_idx, end, i, find_word_idx, find_word_off;
> > +
> > +     for (;;) {
> 
> "Infinite" loop is nothing better than the backward goto.
> Can you try this:
> 
>         unsigned long end, i, off;
> 
>         for_each_clear_bit_from(start, map, size) {
>                 start = __ALIGN_MASK(start + align_offset, align_mask) - align_offset;
>                 end = start + nr;
>                 if (end > size)
>                         break;
> 
>                 off = round_down(start, BITS_PER_LONG);
>                 i = find_last_bit(map + start / BITS_PER_LONG, end - off) + off;
>                 if (i >= end || i < start)
>                         return start;
> 
>                 start = i;
>         }
> 
>         return size;
> 
> If it works for you, let's move with the for_each() version.
> Can you test and add my Co-developed-by please?

ok, I will test and make changes in v6.

> 
> Thanks,
> Yury
> 
> > +             find_idx = find_next_zero_bit(map, size, start);
> > +
> > +             /* Align allocation */
> > +             find_idx = __ALIGN_MASK(find_idx + align_offset,
> > +                     align_mask) - align_offset;
> > +
> > +             end = find_idx + nr;
> > +             if (end > size)
> > +                     return end;
> > +
> > +             find_word_idx = find_idx / BITS_PER_LONG;
> > +             find_word_off = find_word_idx * BITS_PER_LONG;
> > +
> > +             i = find_last_bit(map + find_word_idx,
> > +                     end - find_word_off) + find_word_off;
> > +             if (i >= end || i < find_idx)
> > +                     return find_idx;
> > +
> >               start = i + 1;
> > -             goto again;
> >       }
> > -     return index;
> >  }
> >  EXPORT_SYMBOL(bitmap_find_next_zero_area_off);
> >
> > --
> > 2.34.1

^ permalink raw reply	[flat|nested] 8+ messages in thread

* 答复: [PATCH v5 1/2] lib: bitmap: add tests for bitmap_find_next_zero_area_off()
  2026-06-18  5:48   ` Yury Norov
@ 2026-06-18  9:43     ` 孙毅 (Yi Sun)
  2026-06-18 12:44     ` 孙毅 (Yi Sun)
  1 sibling, 0 replies; 8+ messages in thread
From: 孙毅 (Yi Sun) @ 2026-06-18  9:43 UTC (permalink / raw)
  To: Yury Norov
  Cc: mina86@mina86.com, 279644543@qq.com, mnazarewicz@gmail.com,
	akpm@linux-foundation.org, akinobu.mita@gmail.com,
	linux-kernel@vger.kernel.org, tjmercier@google.com,
	qiang.zhao@freescale.com, scottwood@freescale.com,
	fvdl@google.com, tglx@kernel.org, song@kernel.org, hch@lst.de,
	minchan@kernel.org, 王科 (Ke Wang), John Stultz



> -----邮件原件-----
> 发件人: Yury Norov <yury.norov@gmail.com>
> 发送时间: 2026年6月18日 13:48
> 收件人: 孙毅 (Yi Sun) <Yi.Sun@unisoc.com>
> 抄送: yury.norov@gmail.com; mina86@mina86.com; 279644543@qq.com;
> mnazarewicz@gmail.com; akpm@linux-foundation.org;
> akinobu.mita@gmail.com; linux-kernel@vger.kernel.org; john.stultz@linaro.org;
> tjmercier@google.com; qiang.zhao@freescale.com; scottwood@freescale.com;
> benjamin.gaignard@linaro.org; fvdl@google.com; tglx@kernel.org;
> andreas.herrmann@calxeda.com; song@kernel.org; hch@lst.de;
> sasha.levin@oracle.com; minchan@kernel.org
> 主题: Re: [PATCH v5 1/2] lib: bitmap: add tests for
> 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 Thu, Jun 18, 2026 at 09:52:51AM +0800, Yi Sun wrote:
> > Add functional and performance tests
> > for bitmap_find_next_zero_area_off().
> >
> > To maintain consistent output format,
> > use "find_next_0_area" instead of
> > "bitmap_find_next_zero_area_off".
> >
> > performance tests partial output:
> > Start testing find_bit() with random-filled bitmap
> > [    0.191166] find_next_0_area:              1521308 ns,   1326 iterations
> > [    0.192552] find_next_bit:                 1382385 ns, 163724 iterations
> > Start testing find_bit() with sparse bitmap
> > [    0.196835] find_next_0_area:              4250307 ns, 322497 iterations
> > [    0.196853] find_next_bit:                   15077 ns,    656 iterations
> >
> > Signed-off-by: Yi Sun <yi.sun@unisoc.com>
> > ---
> >  lib/find_bit_benchmark.c | 17 +++++++++++++++++
> >  lib/test_bitmap.c        | 38 ++++++++++++++++++++++++++++++++++++++
> >  2 files changed, 55 insertions(+)
> >
> > diff --git a/lib/find_bit_benchmark.c b/lib/find_bit_benchmark.c
> > index 00d9dc61cd46..062a69930d83 100644
> > --- a/lib/find_bit_benchmark.c
> > +++ b/lib/find_bit_benchmark.c
> > @@ -149,6 +149,21 @@ static int __init test_find_next_and_bit(const void
> *bitmap,
> >       return 0;
> >  }
> >
> > +static int __init
> > +test_bitmap_find_next_zero_area_off(unsigned long *bitmap, unsigned long
> len)
> > +{
> > +     unsigned long i, cnt;
> > +     ktime_t time;
> > +
> > +     time = ktime_get();
> > +     for (cnt = i = 0; i < BITMAP_LEN; cnt++)
> > +             i = bitmap_find_next_zero_area_off(bitmap, BITMAP_LEN, i, 8, 0, 0) + 1;
> > +     time = ktime_get() - time;
> > +     pr_err("find_next_0_area:   %18llu ns, %6ld iterations\n", time, cnt);
> 
> Change %18llu to %14llu (or whatever), and keep the name as it should.

ok,  I will make changes in v6.

> 
> > +
> > +     return 0;
> > +}
> > +
> >  static int __init find_bit_test(void)
> >  {
> >       unsigned long nbits = BITMAP_LEN / SPARSE;
> > @@ -158,6 +173,7 @@ static int __init find_bit_test(void)
> >       get_random_bytes(bitmap, sizeof(bitmap));
> >       get_random_bytes(bitmap2, sizeof(bitmap2));
> >
> > +     test_bitmap_find_next_zero_area_off(bitmap, BITMAP_LEN);
> >       test_find_next_bit(bitmap, BITMAP_LEN);
> >       test_find_next_zero_bit(bitmap, BITMAP_LEN);
> >       test_find_last_bit(bitmap, BITMAP_LEN);
> > @@ -181,6 +197,7 @@ static int __init find_bit_test(void)
> >               __set_bit(get_random_u32_below(BITMAP_LEN), bitmap2);
> >       }
> >
> > +     test_bitmap_find_next_zero_area_off(bitmap, BITMAP_LEN);
> >       test_find_next_bit(bitmap, BITMAP_LEN);
> >       test_find_next_zero_bit(bitmap, BITMAP_LEN);
> >       test_find_last_bit(bitmap, BITMAP_LEN);
> > diff --git a/lib/test_bitmap.c b/lib/test_bitmap.c
> > index 69813c10e6c0..12aa2ca37fe1 100644
> > --- a/lib/test_bitmap.c
> > +++ b/lib/test_bitmap.c
> > @@ -234,6 +234,43 @@ static void __init test_find_nth_bit(void)
> >       }
> >  }
> >
> > +static void __init
> > +test_bitmap_find_next_zero_area_off(void)
> > +{
> > +     DECLARE_BITMAP(bmap, 192);
> > +
> > +     bitmap_set(bmap, 0, 192);
> > +
> > +     bitmap_clear(bmap, 0, 8);
> > +     __clear_bit(50, bmap);
> > +     bitmap_clear(bmap, 60, 18);
> > +     __set_bit(69, bmap);
> > +     __clear_bit(80, bmap);
> > +     bitmap_clear(bmap, 100, 10);
> > +     __clear_bit(120, bmap);
> > +     bitmap_clear(bmap, 145, 8);
> > +     bitmap_clear(bmap, 160, 32);
> > +
> > +     expect_eq_uint(0,
> > +             bitmap_find_next_zero_area_off(bmap, 192, 0, 8, 0, 0));
> > +     expect_eq_uint(0,
> > +             bitmap_find_next_zero_area_off(bmap, 192, 0, 8, 3, 0));
> > +     expect_eq_uint(163,
> > +             bitmap_find_next_zero_area_off(bmap, 192, 0, 8, 3, 1));
> > +     expect_eq_uint(60,
> > +             bitmap_find_next_zero_area_off(bmap, 192, 1, 8, 0, 0));
> > +     expect_eq_uint(160,
> > +             bitmap_find_next_zero_area_off(bmap, 192, 1, 8, 7, 0));
> > +     expect_eq_uint(60,
> > +             bitmap_find_next_zero_area_off(bmap, 192, 1, 8, 7, 4));
> > +     expect_eq_uint(100,
> > +             bitmap_find_next_zero_area_off(bmap, 192, 0, 10, 0, 0));
> > +     expect_eq_uint(160,
> > +             bitmap_find_next_zero_area_off(bmap, 192, 0, 32, 0, 0));
> > +     expect_eq_uint(1,
> > +             !!(bitmap_find_next_zero_area_off(bmap, 192, 0, 33, 0, 0) > 192));
> 
> It should be >= here.

There would be a problem if the return value equals 192.
size = 192;
if (end > size)
	return end;
So the return value must be greater than 192.

> 
> > +}
> > +
> >  static void __init test_fill_set(void)
> >  {
> >       DECLARE_BITMAP(bmap, 1024);
> > @@ -1559,6 +1596,7 @@ static void __init selftest(void)
> >       test_for_each_clear_bitrange_from();
> >       test_for_each_set_clump8();
> >       test_for_each_set_bit_wrap();
> > +     test_bitmap_find_next_zero_area_off();
> >  }
> >
> >  KSTM_MODULE_LOADERS(test_bitmap);
> > --
> > 2.34.1

^ permalink raw reply	[flat|nested] 8+ messages in thread

* 答复: [PATCH v5 1/2] lib: bitmap: add tests for bitmap_find_next_zero_area_off()
  2026-06-18  5:48   ` Yury Norov
  2026-06-18  9:43     ` 答复: " 孙毅 (Yi Sun)
@ 2026-06-18 12:44     ` 孙毅 (Yi Sun)
  1 sibling, 0 replies; 8+ messages in thread
From: 孙毅 (Yi Sun) @ 2026-06-18 12:44 UTC (permalink / raw)
  To: Yury Norov
  Cc: mina86@mina86.com, 279644543@qq.com, mnazarewicz@gmail.com,
	akpm@linux-foundation.org, akinobu.mita@gmail.com,
	linux-kernel@vger.kernel.org, tjmercier@google.com,
	qiang.zhao@freescale.com, scottwood@freescale.com,
	fvdl@google.com, tglx@kernel.org, song@kernel.org, hch@lst.de,
	minchan@kernel.org, 王科 (Ke Wang), John Stultz



> -----邮件原件-----
> 发件人: 孙毅 (Yi Sun)
> 发送时间: 2026年6月18日 17:43
> 收件人: 'Yury Norov' <yury.norov@gmail.com>
> 抄送: 'mina86@mina86.com' <mina86@mina86.com>; '279644543@qq.com'
> <279644543@qq.com>; 'mnazarewicz@gmail.com' <mnazarewicz@gmail.com>;
> 'akpm@linux-foundation.org' <akpm@linux-foundation.org>;
> 'akinobu.mita@gmail.com' <akinobu.mita@gmail.com>; 'linux-
> kernel@vger.kernel.org' <linux-kernel@vger.kernel.org>; 'tjmercier@google.com'
> <tjmercier@google.com>; 'qiang.zhao@freescale.com'
> <qiang.zhao@freescale.com>; 'scottwood@freescale.com'
> <scottwood@freescale.com>; 'fvdl@google.com' <fvdl@google.com>;
> 'tglx@kernel.org' <tglx@kernel.org>; 'song@kernel.org' <song@kernel.org>;
> 'hch@lst.de' <hch@lst.de>; 'minchan@kernel.org' <minchan@kernel.org>; 王科
> (Ke Wang) <Ke.Wang@unisoc.com>; 'John Stultz' <jstultz@google.com>
> 主题: 答复: [PATCH v5 1/2] lib: bitmap: add tests for
> bitmap_find_next_zero_area_off()
> 
> 
> 
> > -----邮件原件-----
> > 发件人: Yury Norov <yury.norov@gmail.com>
> > 发送时间: 2026年6月18日 13:48
> > 收件人: 孙毅 (Yi Sun) <Yi.Sun@unisoc.com>
> > 抄送: yury.norov@gmail.com; mina86@mina86.com; 279644543@qq.com;
> > mnazarewicz@gmail.com; akpm@linux-foundation.org;
> > akinobu.mita@gmail.com; linux-kernel@vger.kernel.org; john.stultz@linaro.org;
> > tjmercier@google.com; qiang.zhao@freescale.com; scottwood@freescale.com;
> > benjamin.gaignard@linaro.org; fvdl@google.com; tglx@kernel.org;
> > andreas.herrmann@calxeda.com; song@kernel.org; hch@lst.de;
> > sasha.levin@oracle.com; minchan@kernel.org
> > 主题: Re: [PATCH v5 1/2] lib: bitmap: add tests for
> > 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 Thu, Jun 18, 2026 at 09:52:51AM +0800, Yi Sun wrote:
> > > Add functional and performance tests
> > > for bitmap_find_next_zero_area_off().
> > >
> > > To maintain consistent output format,
> > > use "find_next_0_area" instead of
> > > "bitmap_find_next_zero_area_off".
> > >
> > > performance tests partial output:
> > > Start testing find_bit() with random-filled bitmap
> > > [    0.191166] find_next_0_area:              1521308 ns,   1326 iterations
> > > [    0.192552] find_next_bit:                 1382385 ns, 163724 iterations
> > > Start testing find_bit() with sparse bitmap
> > > [    0.196835] find_next_0_area:              4250307 ns, 322497 iterations
> > > [    0.196853] find_next_bit:                   15077 ns,    656 iterations
> > >
> > > Signed-off-by: Yi Sun <yi.sun@unisoc.com>
> > > ---
> > >  lib/find_bit_benchmark.c | 17 +++++++++++++++++
> > >  lib/test_bitmap.c        | 38 ++++++++++++++++++++++++++++++++++++++
> > >  2 files changed, 55 insertions(+)
> > >
> > > diff --git a/lib/find_bit_benchmark.c b/lib/find_bit_benchmark.c
> > > index 00d9dc61cd46..062a69930d83 100644
> > > --- a/lib/find_bit_benchmark.c
> > > +++ b/lib/find_bit_benchmark.c
> > > @@ -149,6 +149,21 @@ static int __init test_find_next_and_bit(const void
> > *bitmap,
> > >       return 0;
> > >  }
> > >
> > > +static int __init
> > > +test_bitmap_find_next_zero_area_off(unsigned long *bitmap, unsigned long
> > len)
> > > +{
> > > +     unsigned long i, cnt;
> > > +     ktime_t time;
> > > +
> > > +     time = ktime_get();
> > > +     for (cnt = i = 0; i < BITMAP_LEN; cnt++)
> > > +             i = bitmap_find_next_zero_area_off(bitmap, BITMAP_LEN, i, 8, 0, 0) +
> 1;
> > > +     time = ktime_get() - time;
> > > +     pr_err("find_next_0_area:   %18llu ns, %6ld iterations\n", time, cnt);
> >
> > Change %18llu to %14llu (or whatever), and keep the name as it should.
> 
> ok,  I will make changes in v6.
> 
> >
> > > +
> > > +     return 0;
> > > +}
> > > +
> > >  static int __init find_bit_test(void)
> > >  {
> > >       unsigned long nbits = BITMAP_LEN / SPARSE;
> > > @@ -158,6 +173,7 @@ static int __init find_bit_test(void)
> > >       get_random_bytes(bitmap, sizeof(bitmap));
> > >       get_random_bytes(bitmap2, sizeof(bitmap2));
> > >
> > > +     test_bitmap_find_next_zero_area_off(bitmap, BITMAP_LEN);
> > >       test_find_next_bit(bitmap, BITMAP_LEN);
> > >       test_find_next_zero_bit(bitmap, BITMAP_LEN);
> > >       test_find_last_bit(bitmap, BITMAP_LEN);
> > > @@ -181,6 +197,7 @@ static int __init find_bit_test(void)
> > >               __set_bit(get_random_u32_below(BITMAP_LEN), bitmap2);
> > >       }
> > >
> > > +     test_bitmap_find_next_zero_area_off(bitmap, BITMAP_LEN);
> > >       test_find_next_bit(bitmap, BITMAP_LEN);
> > >       test_find_next_zero_bit(bitmap, BITMAP_LEN);
> > >       test_find_last_bit(bitmap, BITMAP_LEN);
> > > diff --git a/lib/test_bitmap.c b/lib/test_bitmap.c
> > > index 69813c10e6c0..12aa2ca37fe1 100644
> > > --- a/lib/test_bitmap.c
> > > +++ b/lib/test_bitmap.c
> > > @@ -234,6 +234,43 @@ static void __init test_find_nth_bit(void)
> > >       }
> > >  }
> > >
> > > +static void __init
> > > +test_bitmap_find_next_zero_area_off(void)
> > > +{
> > > +     DECLARE_BITMAP(bmap, 192);
> > > +
> > > +     bitmap_set(bmap, 0, 192);
> > > +
> > > +     bitmap_clear(bmap, 0, 8);
> > > +     __clear_bit(50, bmap);
> > > +     bitmap_clear(bmap, 60, 18);
> > > +     __set_bit(69, bmap);
> > > +     __clear_bit(80, bmap);
> > > +     bitmap_clear(bmap, 100, 10);
> > > +     __clear_bit(120, bmap);
> > > +     bitmap_clear(bmap, 145, 8);
> > > +     bitmap_clear(bmap, 160, 32);
> > > +
> > > +     expect_eq_uint(0,
> > > +             bitmap_find_next_zero_area_off(bmap, 192, 0, 8, 0, 0));
> > > +     expect_eq_uint(0,
> > > +             bitmap_find_next_zero_area_off(bmap, 192, 0, 8, 3, 0));
> > > +     expect_eq_uint(163,
> > > +             bitmap_find_next_zero_area_off(bmap, 192, 0, 8, 3, 1));
> > > +     expect_eq_uint(60,
> > > +             bitmap_find_next_zero_area_off(bmap, 192, 1, 8, 0, 0));
> > > +     expect_eq_uint(160,
> > > +             bitmap_find_next_zero_area_off(bmap, 192, 1, 8, 7, 0));
> > > +     expect_eq_uint(60,
> > > +             bitmap_find_next_zero_area_off(bmap, 192, 1, 8, 7, 4));
> > > +     expect_eq_uint(100,
> > > +             bitmap_find_next_zero_area_off(bmap, 192, 0, 10, 0, 0));
> > > +     expect_eq_uint(160,
> > > +             bitmap_find_next_zero_area_off(bmap, 192, 0, 32, 0, 0));
> > > +     expect_eq_uint(1,
> > > +             !!(bitmap_find_next_zero_area_off(bmap, 192, 0, 33, 0, 0) > 192));
> >
> > It should be >= here.
> 
> There would be a problem if the return value equals 192.
> size = 192;
> if (end > size)
> 	return end;
> So the return value must be greater than 192.

I agree with the patch you suggested that returns the size, so it needs to be changed to >= here.

> 
> >
> > > +}
> > > +
> > >  static void __init test_fill_set(void)
> > >  {
> > >       DECLARE_BITMAP(bmap, 1024);
> > > @@ -1559,6 +1596,7 @@ static void __init selftest(void)
> > >       test_for_each_clear_bitrange_from();
> > >       test_for_each_set_clump8();
> > >       test_for_each_set_bit_wrap();
> > > +     test_bitmap_find_next_zero_area_off();
> > >  }
> > >
> > >  KSTM_MODULE_LOADERS(test_bitmap);
> > > --
> > > 2.34.1

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2026-06-18 12:44 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-06-18  1:52 [PATCH v5 0/2] Improve the performance of bitmap_find_next_zero_area_off() Yi Sun
2026-06-18  1:52 ` [PATCH v5 1/2] lib: bitmap: add tests for bitmap_find_next_zero_area_off() Yi Sun
2026-06-18  5:48   ` Yury Norov
2026-06-18  9:43     ` 答复: " 孙毅 (Yi Sun)
2026-06-18 12:44     ` 孙毅 (Yi Sun)
2026-06-18  1:52 ` [PATCH v5 2/2] lib: bitmap: optimize bitmap_find_next_zero_area_off() Yi Sun
2026-06-18  6:14   ` Yury Norov
2026-06-18  9:29     ` 答复: " 孙毅 (Yi Sun)

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox