Add bench test of find_last_zero_bit. Also, this patch fix the unmatched iterations value with find_next_bit and find_last_bit which happen when the last bit set or not, Let suppose, 4096 bitmap size and 4095 bit is set only. In this case former find_next_bit returns iterations count as 0. But find_last_bit returns it as 1. This unmatched return value makes some confusion. So we fix it. Signed-off-by: Levi Yun <ppbuk5246@xxxxxxxxx> --- lib/find_bit_benchmark.c | 51 +++++++++++++++++++++++++++++----------- 1 file changed, 37 insertions(+), 14 deletions(-) diff --git a/lib/find_bit_benchmark.c b/lib/find_bit_benchmark.c index 5637c5711db9..007371169008 100644 --- a/lib/find_bit_benchmark.c +++ b/lib/find_bit_benchmark.c @@ -35,14 +35,14 @@ static DECLARE_BITMAP(bitmap2, BITMAP_LEN) __initdata; */ static int __init test_find_first_bit(void *bitmap, unsigned long len) { - unsigned long i, cnt; + unsigned long i = 0, cnt = 0; ktime_t time; time = ktime_get(); - for (cnt = i = 0; i < len; cnt++) { + do { i = find_first_bit(bitmap, len); __clear_bit(i, bitmap); - } + } while (i++ < len && ++cnt); time = ktime_get() - time; pr_err("find_first_bit: %18llu ns, %6ld iterations\n", time, cnt); @@ -51,12 +51,13 @@ static int __init test_find_first_bit(void *bitmap, unsigned long len) static int __init test_find_next_bit(const void *bitmap, unsigned long len) { - unsigned long i, cnt; + unsigned long i = 0, cnt = 0; ktime_t time; time = ktime_get(); - for (cnt = i = 0; i < BITMAP_LEN; cnt++) - i = find_next_bit(bitmap, BITMAP_LEN, i) + 1; + do { + i = find_next_bit(bitmap, BITMAP_LEN, i); + } while (i++ < BITMAP_LEN && ++cnt); time = ktime_get() - time; pr_err("find_next_bit: %18llu ns, %6ld iterations\n", time, cnt); @@ -65,12 +66,13 @@ static int __init test_find_next_bit(const void *bitmap, unsigned long len) static int __init test_find_next_zero_bit(const void *bitmap, unsigned long len) { - unsigned long i, cnt; + unsigned long i = 0, cnt = 0; ktime_t time; time = ktime_get(); - for (cnt = i = 0; i < BITMAP_LEN; cnt++) - i = find_next_zero_bit(bitmap, len, i) + 1; + do { + i = find_next_zero_bit(bitmap, len, i); + } while (i++ < BITMAP_LEN && ++cnt); time = ktime_get() - time; pr_err("find_next_zero_bit: %18llu ns, %6ld iterations\n", time, cnt); @@ -84,27 +86,46 @@ static int __init test_find_last_bit(const void *bitmap, unsigned long len) time = ktime_get(); do { - cnt++; l = find_last_bit(bitmap, len); if (l >= len) break; len = l; - } while (len); + } while (len >= 0 && ++cnt); /**< to find real 0 bit set. */ time = ktime_get() - time; pr_err("find_last_bit: %18llu ns, %6ld iterations\n", time, cnt); return 0; } +static int __init test_find_last_zero_bit(const void *bitmap, unsigned long len) +{ + unsigned long l, cnt = 0; + ktime_t time; + + time = ktime_get(); + do { + l = find_last_zero_bit(bitmap, len); + if (l >= len) + break; + len = l; + } while (len >= 0 && ++cnt); /**< to find real 0 bit set. */ + time = ktime_get() - time; + pr_err("find_last_zero_bit: %18llu ns, %6ld iterations\n", time, cnt); + + return 0; +} + + static int __init test_find_next_and_bit(const void *bitmap, const void *bitmap2, unsigned long len) { - unsigned long i, cnt; + unsigned long i, cnt = 0; ktime_t time; time = ktime_get(); - for (cnt = i = 0; i < BITMAP_LEN; cnt++) - i = find_next_and_bit(bitmap, bitmap2, BITMAP_LEN, i + 1); + do { + i = find_next_and_bit(bitmap, bitmap2, BITMAP_LEN, i); + } while (i++ < BITMAP_LEN && ++cnt); time = ktime_get() - time; pr_err("find_next_and_bit: %18llu ns, %6ld iterations\n", time, cnt); @@ -123,6 +144,7 @@ static int __init find_bit_test(void) test_find_next_bit(bitmap, BITMAP_LEN); test_find_next_zero_bit(bitmap, BITMAP_LEN); test_find_last_bit(bitmap, BITMAP_LEN); + test_find_last_zero_bit(bitmap, BITMAP_LEN); /* * test_find_first_bit() may take some time, so @@ -144,6 +166,7 @@ static int __init find_bit_test(void) test_find_next_bit(bitmap, BITMAP_LEN); test_find_next_zero_bit(bitmap, BITMAP_LEN); test_find_last_bit(bitmap, BITMAP_LEN); + test_find_last_zero_bit(bitmap, BITMAP_LEN); test_find_first_bit(bitmap, BITMAP_LEN); test_find_next_and_bit(bitmap, bitmap2, BITMAP_LEN); -- 2.27.0