// SPDX-License-Identifier: GPL-2.0-only /* * Test for find_*_bit functions. * * Copyright (c) 2017 Cavium.
*/
/* * find_bit functions are widely used in kernel, so the successful boot * is good enough test for correctness. * * This test is focused on performance of traversing bitmaps. Two typical * scenarios are reproduced: * - randomly filled bitmap with approximately equal number of set and * cleared bits; * - sparse bitmap with few set bits at random positions.
*/
/* * This is Schlemiel the Painter's algorithm. It should be called after * all other tests for the same bitmap because it sets all bits of bitmap to 1.
*/ staticint __init test_find_first_bit(void *bitmap, unsignedlong len)
{ unsignedlong i, cnt;
ktime_t time;
time = ktime_get(); for (cnt = i = 0; i < len; cnt++) {
i = find_first_bit(bitmap, len);
__clear_bit(i, bitmap);
}
time = ktime_get() - time;
pr_err("find_first_bit: %18llu ns, %6ld iterations\n", time, cnt);
time = ktime_get(); for (cnt = i = 0; i < len; cnt++) {
i = find_first_and_bit(cp, bitmap2, len);
__clear_bit(i, cp);
}
time = ktime_get() - time;
pr_err("find_first_and_bit: %18llu ns, %6ld iterations\n", time, cnt);
time = ktime_get(); for (cnt = i = 0; i < BITMAP_LEN; cnt++)
i = find_next_bit(bitmap, BITMAP_LEN, i) + 1;
time = ktime_get() - time;
pr_err("find_next_bit: %18llu ns, %6ld iterations\n", time, cnt);
time = ktime_get(); for (cnt = i = 0; i < BITMAP_LEN; cnt++)
i = find_next_zero_bit(bitmap, len, i) + 1;
time = ktime_get() - time;
pr_err("find_next_zero_bit: %18llu ns, %6ld iterations\n", time, cnt);
time = ktime_get(); do {
cnt++;
l = find_last_bit(bitmap, len); if (l >= len) break;
len = l;
} while (len);
time = ktime_get() - time;
pr_err("find_last_bit: %18llu ns, %6ld iterations\n", time, cnt);
return 0;
}
staticint __init test_find_nth_bit(constunsignedlong *bitmap, unsignedlong len)
{ unsignedlong l, n, w = bitmap_weight(bitmap, len);
ktime_t time;
time = ktime_get(); for (n = 0; n < w; n++) {
l = find_nth_bit(bitmap, len, n);
WARN_ON(l >= len);
}
time = ktime_get() - time;
pr_err("find_nth_bit: %18llu ns, %6ld iterations\n", time, w);
time = ktime_get(); for (cnt = i = 0; i < BITMAP_LEN; cnt++)
i = find_next_and_bit(bitmap, bitmap2, BITMAP_LEN, i + 1);
time = ktime_get() - time;
pr_err("find_next_and_bit: %18llu ns, %6ld iterations\n", time, cnt);
/* * test_find_first_bit() may take some time, so * traverse only part of bitmap to avoid soft lockup.
*/
test_find_first_bit(bitmap, BITMAP_LEN / 10);
test_find_first_and_bit(bitmap, bitmap2, BITMAP_LEN / 2);
test_find_next_and_bit(bitmap, bitmap2, BITMAP_LEN);
pr_err("\nStart testing find_bit() with sparse bitmap\n");
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.