1 // SPDX-License-Identifier: GPL-2.0-only
3 * Test cases for bitmap API.
6 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
8 #include <linux/bitmap.h>
9 #include <linux/init.h>
10 #include <linux/kernel.h>
11 #include <linux/module.h>
12 #include <linux/printk.h>
13 #include <linux/slab.h>
14 #include <linux/string.h>
15 #include <linux/uaccess.h>
17 #include "../tools/testing/selftests/kselftest_module.h"
19 #define EXP1_IN_BITS (sizeof(exp1) * 8)
21 KSTM_MODULE_GLOBALS();
23 static char pbl_buffer[PAGE_SIZE] __initdata;
24 static char print_buf[PAGE_SIZE * 2] __initdata;
26 static const unsigned long exp1[] __initconst = {
29 BITMAP_FROM_U64(0x0000ffff),
30 BITMAP_FROM_U64(0xffff0000),
31 BITMAP_FROM_U64(0x55555555),
32 BITMAP_FROM_U64(0xaaaaaaaa),
33 BITMAP_FROM_U64(0x11111111),
34 BITMAP_FROM_U64(0x22222222),
35 BITMAP_FROM_U64(0xffffffff),
36 BITMAP_FROM_U64(0xfffffffe),
37 BITMAP_FROM_U64(0x3333333311111111ULL),
38 BITMAP_FROM_U64(0xffffffff77777777ULL),
40 BITMAP_FROM_U64(0x00008000),
41 BITMAP_FROM_U64(0x80000000),
44 static const unsigned long exp2[] __initconst = {
45 BITMAP_FROM_U64(0x3333333311111111ULL),
46 BITMAP_FROM_U64(0xffffffff77777777ULL),
49 /* Fibonacci sequence */
50 static const unsigned long exp2_to_exp3_mask[] __initconst = {
51 BITMAP_FROM_U64(0x008000020020212eULL),
53 /* exp3_0_1 = (exp2[0] & ~exp2_to_exp3_mask) | (exp2[1] & exp2_to_exp3_mask) */
54 static const unsigned long exp3_0_1[] __initconst = {
55 BITMAP_FROM_U64(0x33b3333311313137ULL),
57 /* exp3_1_0 = (exp2[1] & ~exp2_to_exp3_mask) | (exp2[0] & exp2_to_exp3_mask) */
58 static const unsigned long exp3_1_0[] __initconst = {
59 BITMAP_FROM_U64(0xff7fffff77575751ULL),
63 __check_eq_uint(const char *srcfile, unsigned int line,
64 const unsigned int exp_uint, unsigned int x)
67 pr_err("[%s:%u] expected %u, got %u\n",
68 srcfile, line, exp_uint, x);
76 __check_eq_bitmap(const char *srcfile, unsigned int line,
77 const unsigned long *exp_bmap, const unsigned long *bmap,
80 if (!bitmap_equal(exp_bmap, bmap, nbits)) {
81 pr_warn("[%s:%u] bitmaps contents differ: expected \"%*pbl\", got \"%*pbl\"\n",
83 nbits, exp_bmap, nbits, bmap);
90 __check_eq_pbl(const char *srcfile, unsigned int line,
91 const char *expected_pbl,
92 const unsigned long *bitmap, unsigned int nbits)
94 snprintf(pbl_buffer, sizeof(pbl_buffer), "%*pbl", nbits, bitmap);
95 if (strcmp(expected_pbl, pbl_buffer)) {
96 pr_warn("[%s:%u] expected \"%s\", got \"%s\"\n",
98 expected_pbl, pbl_buffer);
105 __check_eq_u32_array(const char *srcfile, unsigned int line,
106 const u32 *exp_arr, unsigned int exp_len,
107 const u32 *arr, unsigned int len) __used;
109 __check_eq_u32_array(const char *srcfile, unsigned int line,
110 const u32 *exp_arr, unsigned int exp_len,
111 const u32 *arr, unsigned int len)
113 if (exp_len != len) {
114 pr_warn("[%s:%u] array length differ: expected %u, got %u\n",
120 if (memcmp(exp_arr, arr, len*sizeof(*arr))) {
121 pr_warn("[%s:%u] array contents differ\n", srcfile, line);
122 print_hex_dump(KERN_WARNING, " exp: ", DUMP_PREFIX_OFFSET,
123 32, 4, exp_arr, exp_len*sizeof(*exp_arr), false);
124 print_hex_dump(KERN_WARNING, " got: ", DUMP_PREFIX_OFFSET,
125 32, 4, arr, len*sizeof(*arr), false);
132 static bool __init __check_eq_clump8(const char *srcfile, unsigned int line,
133 const unsigned int offset,
134 const unsigned int size,
135 const unsigned char *const clump_exp,
136 const unsigned long *const clump)
140 if (offset >= size) {
141 pr_warn("[%s:%u] bit offset for clump out-of-bounds: expected less than %u, got %u\n",
142 srcfile, line, size, offset);
146 exp = clump_exp[offset / 8];
148 pr_warn("[%s:%u] bit offset for zero clump: expected nonzero clump, got bit offset %u with clump value 0",
149 srcfile, line, offset);
154 pr_warn("[%s:%u] expected clump value of 0x%lX, got clump value of 0x%lX",
155 srcfile, line, exp, *clump);
163 __check_eq_str(const char *srcfile, unsigned int line,
164 const char *exp_str, const char *str,
169 eq = strncmp(exp_str, str, len) == 0;
171 pr_err("[%s:%u] expected %s, got %s\n", srcfile, line, exp_str, str);
176 #define __expect_eq(suffix, ...) \
180 if (!__check_eq_ ## suffix(__FILE__, __LINE__, \
188 #define expect_eq_uint(...) __expect_eq(uint, ##__VA_ARGS__)
189 #define expect_eq_bitmap(...) __expect_eq(bitmap, ##__VA_ARGS__)
190 #define expect_eq_pbl(...) __expect_eq(pbl, ##__VA_ARGS__)
191 #define expect_eq_u32_array(...) __expect_eq(u32_array, ##__VA_ARGS__)
192 #define expect_eq_clump8(...) __expect_eq(clump8, ##__VA_ARGS__)
193 #define expect_eq_str(...) __expect_eq(str, ##__VA_ARGS__)
195 static void __init test_zero_clear(void)
197 DECLARE_BITMAP(bmap, 1024);
199 /* Known way to set all bits */
200 memset(bmap, 0xff, 128);
202 expect_eq_pbl("0-22", bmap, 23);
203 expect_eq_pbl("0-1023", bmap, 1024);
205 /* single-word bitmaps */
206 bitmap_clear(bmap, 0, 9);
207 expect_eq_pbl("9-1023", bmap, 1024);
209 bitmap_zero(bmap, 35);
210 expect_eq_pbl("64-1023", bmap, 1024);
212 /* cross boundaries operations */
213 bitmap_clear(bmap, 79, 19);
214 expect_eq_pbl("64-78,98-1023", bmap, 1024);
216 bitmap_zero(bmap, 115);
217 expect_eq_pbl("128-1023", bmap, 1024);
219 /* Zeroing entire area */
220 bitmap_zero(bmap, 1024);
221 expect_eq_pbl("", bmap, 1024);
224 static void __init test_find_nth_bit(void)
226 unsigned long b, bit, cnt = 0;
227 DECLARE_BITMAP(bmap, 64 * 3);
229 bitmap_zero(bmap, 64 * 3);
237 __set_bit(123, bmap);
239 expect_eq_uint(10, find_nth_bit(bmap, 64 * 3, 0));
240 expect_eq_uint(20, find_nth_bit(bmap, 64 * 3, 1));
241 expect_eq_uint(30, find_nth_bit(bmap, 64 * 3, 2));
242 expect_eq_uint(40, find_nth_bit(bmap, 64 * 3, 3));
243 expect_eq_uint(50, find_nth_bit(bmap, 64 * 3, 4));
244 expect_eq_uint(60, find_nth_bit(bmap, 64 * 3, 5));
245 expect_eq_uint(80, find_nth_bit(bmap, 64 * 3, 6));
246 expect_eq_uint(123, find_nth_bit(bmap, 64 * 3, 7));
247 expect_eq_uint(64 * 3, find_nth_bit(bmap, 64 * 3, 8));
249 expect_eq_uint(10, find_nth_bit(bmap, 64 * 3 - 1, 0));
250 expect_eq_uint(20, find_nth_bit(bmap, 64 * 3 - 1, 1));
251 expect_eq_uint(30, find_nth_bit(bmap, 64 * 3 - 1, 2));
252 expect_eq_uint(40, find_nth_bit(bmap, 64 * 3 - 1, 3));
253 expect_eq_uint(50, find_nth_bit(bmap, 64 * 3 - 1, 4));
254 expect_eq_uint(60, find_nth_bit(bmap, 64 * 3 - 1, 5));
255 expect_eq_uint(80, find_nth_bit(bmap, 64 * 3 - 1, 6));
256 expect_eq_uint(123, find_nth_bit(bmap, 64 * 3 - 1, 7));
257 expect_eq_uint(64 * 3 - 1, find_nth_bit(bmap, 64 * 3 - 1, 8));
259 for_each_set_bit(bit, exp1, EXP1_IN_BITS) {
260 b = find_nth_bit(exp1, EXP1_IN_BITS, cnt++);
261 expect_eq_uint(b, bit);
265 static void __init test_fill_set(void)
267 DECLARE_BITMAP(bmap, 1024);
269 /* Known way to clear all bits */
270 memset(bmap, 0x00, 128);
272 expect_eq_pbl("", bmap, 23);
273 expect_eq_pbl("", bmap, 1024);
275 /* single-word bitmaps */
276 bitmap_set(bmap, 0, 9);
277 expect_eq_pbl("0-8", bmap, 1024);
279 bitmap_fill(bmap, 35);
280 expect_eq_pbl("0-63", bmap, 1024);
282 /* cross boundaries operations */
283 bitmap_set(bmap, 79, 19);
284 expect_eq_pbl("0-63,79-97", bmap, 1024);
286 bitmap_fill(bmap, 115);
287 expect_eq_pbl("0-127", bmap, 1024);
289 /* Zeroing entire area */
290 bitmap_fill(bmap, 1024);
291 expect_eq_pbl("0-1023", bmap, 1024);
294 static void __init test_copy(void)
296 DECLARE_BITMAP(bmap1, 1024);
297 DECLARE_BITMAP(bmap2, 1024);
299 bitmap_zero(bmap1, 1024);
300 bitmap_zero(bmap2, 1024);
302 /* single-word bitmaps */
303 bitmap_set(bmap1, 0, 19);
304 bitmap_copy(bmap2, bmap1, 23);
305 expect_eq_pbl("0-18", bmap2, 1024);
307 bitmap_set(bmap2, 0, 23);
308 bitmap_copy(bmap2, bmap1, 23);
309 expect_eq_pbl("0-18", bmap2, 1024);
311 /* multi-word bitmaps */
312 bitmap_set(bmap1, 0, 109);
313 bitmap_copy(bmap2, bmap1, 1024);
314 expect_eq_pbl("0-108", bmap2, 1024);
316 bitmap_fill(bmap2, 1024);
317 bitmap_copy(bmap2, bmap1, 1024);
318 expect_eq_pbl("0-108", bmap2, 1024);
320 /* the following tests assume a 32- or 64-bit arch (even 128b
324 bitmap_fill(bmap2, 1024);
325 bitmap_copy(bmap2, bmap1, 109); /* ... but 0-padded til word length */
326 expect_eq_pbl("0-108,128-1023", bmap2, 1024);
328 bitmap_fill(bmap2, 1024);
329 bitmap_copy(bmap2, bmap1, 97); /* ... but aligned on word length */
330 expect_eq_pbl("0-108,128-1023", bmap2, 1024);
333 #define EXP2_IN_BITS (sizeof(exp2) * 8)
335 static void __init test_replace(void)
337 unsigned int nbits = 64;
338 unsigned int nlongs = DIV_ROUND_UP(nbits, BITS_PER_LONG);
339 DECLARE_BITMAP(bmap, 1024);
341 BUILD_BUG_ON(EXP2_IN_BITS < nbits * 2);
343 bitmap_zero(bmap, 1024);
344 bitmap_replace(bmap, &exp2[0 * nlongs], &exp2[1 * nlongs], exp2_to_exp3_mask, nbits);
345 expect_eq_bitmap(bmap, exp3_0_1, nbits);
347 bitmap_zero(bmap, 1024);
348 bitmap_replace(bmap, &exp2[1 * nlongs], &exp2[0 * nlongs], exp2_to_exp3_mask, nbits);
349 expect_eq_bitmap(bmap, exp3_1_0, nbits);
351 bitmap_fill(bmap, 1024);
352 bitmap_replace(bmap, &exp2[0 * nlongs], &exp2[1 * nlongs], exp2_to_exp3_mask, nbits);
353 expect_eq_bitmap(bmap, exp3_0_1, nbits);
355 bitmap_fill(bmap, 1024);
356 bitmap_replace(bmap, &exp2[1 * nlongs], &exp2[0 * nlongs], exp2_to_exp3_mask, nbits);
357 expect_eq_bitmap(bmap, exp3_1_0, nbits);
360 #define PARSE_TIME 0x1
363 struct test_bitmap_parselist{
366 const unsigned long *expected;
371 static const struct test_bitmap_parselist parselist_tests[] __initconst = {
372 #define step (sizeof(u64) / sizeof(unsigned long))
374 {0, "0", &exp1[0], 8, 0},
375 {0, "1", &exp1[1 * step], 8, 0},
376 {0, "0-15", &exp1[2 * step], 32, 0},
377 {0, "16-31", &exp1[3 * step], 32, 0},
378 {0, "0-31:1/2", &exp1[4 * step], 32, 0},
379 {0, "1-31:1/2", &exp1[5 * step], 32, 0},
380 {0, "0-31:1/4", &exp1[6 * step], 32, 0},
381 {0, "1-31:1/4", &exp1[7 * step], 32, 0},
382 {0, "0-31:4/4", &exp1[8 * step], 32, 0},
383 {0, "1-31:4/4", &exp1[9 * step], 32, 0},
384 {0, "0-31:1/4,32-63:2/4", &exp1[10 * step], 64, 0},
385 {0, "0-31:3/4,32-63:4/4", &exp1[11 * step], 64, 0},
386 {0, " ,, 0-31:3/4 ,, 32-63:4/4 ,, ", &exp1[11 * step], 64, 0},
388 {0, "0-31:1/4,32-63:2/4,64-95:3/4,96-127:4/4", exp2, 128, 0},
390 {0, "0-2047:128/256", NULL, 2048, PARSE_TIME},
392 {0, "", &exp1[12 * step], 8, 0},
393 {0, "\n", &exp1[12 * step], 8, 0},
394 {0, ",, ,, , , ,", &exp1[12 * step], 8, 0},
395 {0, " , ,, , , ", &exp1[12 * step], 8, 0},
396 {0, " , ,, , , \n", &exp1[12 * step], 8, 0},
398 {0, "0-0", &exp1[0], 32, 0},
399 {0, "1-1", &exp1[1 * step], 32, 0},
400 {0, "15-15", &exp1[13 * step], 32, 0},
401 {0, "31-31", &exp1[14 * step], 32, 0},
403 {0, "0-0:0/1", &exp1[12 * step], 32, 0},
404 {0, "0-0:1/1", &exp1[0], 32, 0},
405 {0, "0-0:1/31", &exp1[0], 32, 0},
406 {0, "0-0:31/31", &exp1[0], 32, 0},
407 {0, "1-1:1/1", &exp1[1 * step], 32, 0},
408 {0, "0-15:16/31", &exp1[2 * step], 32, 0},
409 {0, "15-15:1/2", &exp1[13 * step], 32, 0},
410 {0, "15-15:31/31", &exp1[13 * step], 32, 0},
411 {0, "15-31:1/31", &exp1[13 * step], 32, 0},
412 {0, "16-31:16/31", &exp1[3 * step], 32, 0},
413 {0, "31-31:31/31", &exp1[14 * step], 32, 0},
415 {0, "N-N", &exp1[14 * step], 32, 0},
416 {0, "0-0:1/N", &exp1[0], 32, 0},
417 {0, "0-0:N/N", &exp1[0], 32, 0},
418 {0, "0-15:16/N", &exp1[2 * step], 32, 0},
419 {0, "15-15:N/N", &exp1[13 * step], 32, 0},
420 {0, "15-N:1/N", &exp1[13 * step], 32, 0},
421 {0, "16-N:16/N", &exp1[3 * step], 32, 0},
422 {0, "N-N:N/N", &exp1[14 * step], 32, 0},
424 {0, "0-N:1/3,1-N:1/3,2-N:1/3", &exp1[8 * step], 32, 0},
425 {0, "0-31:1/3,1-31:1/3,2-31:1/3", &exp1[8 * step], 32, 0},
426 {0, "1-10:8/12,8-31:24/29,0-31:0/3", &exp1[9 * step], 32, 0},
428 {0, "all", &exp1[8 * step], 32, 0},
429 {0, "0, 1, all, ", &exp1[8 * step], 32, 0},
430 {0, "all:1/2", &exp1[4 * step], 32, 0},
431 {0, "ALL:1/2", &exp1[4 * step], 32, 0},
432 {-EINVAL, "al", NULL, 8, 0},
433 {-EINVAL, "alll", NULL, 8, 0},
435 {-EINVAL, "-1", NULL, 8, 0},
436 {-EINVAL, "-0", NULL, 8, 0},
437 {-EINVAL, "10-1", NULL, 8, 0},
438 {-ERANGE, "8-8", NULL, 8, 0},
439 {-ERANGE, "0-31", NULL, 8, 0},
440 {-EINVAL, "0-31:", NULL, 32, 0},
441 {-EINVAL, "0-31:0", NULL, 32, 0},
442 {-EINVAL, "0-31:0/", NULL, 32, 0},
443 {-EINVAL, "0-31:0/0", NULL, 32, 0},
444 {-EINVAL, "0-31:1/0", NULL, 32, 0},
445 {-EINVAL, "0-31:10/1", NULL, 32, 0},
446 {-EOVERFLOW, "0-98765432123456789:10/1", NULL, 8, 0},
448 {-EINVAL, "a-31", NULL, 8, 0},
449 {-EINVAL, "0-a1", NULL, 8, 0},
450 {-EINVAL, "a-31:10/1", NULL, 8, 0},
451 {-EINVAL, "0-31:a/1", NULL, 8, 0},
452 {-EINVAL, "0-\n", NULL, 8, 0},
456 static void __init test_bitmap_parselist(void)
461 DECLARE_BITMAP(bmap, 2048);
463 for (i = 0; i < ARRAY_SIZE(parselist_tests); i++) {
464 #define ptest parselist_tests[i]
467 err = bitmap_parselist(ptest.in, bmap, ptest.nbits);
468 time = ktime_get() - time;
470 if (err != ptest.errno) {
471 pr_err("parselist: %d: input is %s, errno is %d, expected %d\n",
472 i, ptest.in, err, ptest.errno);
476 if (!err && ptest.expected
477 && !__bitmap_equal(bmap, ptest.expected, ptest.nbits)) {
478 pr_err("parselist: %d: input is %s, result is 0x%lx, expected 0x%lx\n",
479 i, ptest.in, bmap[0],
484 if (ptest.flags & PARSE_TIME)
485 pr_err("parselist: %d: input is '%s' OK, Time: %llu\n",
492 static void __init test_bitmap_printlist(void)
494 unsigned long *bmap = kmalloc(PAGE_SIZE, GFP_KERNEL);
495 char *buf = kmalloc(PAGE_SIZE, GFP_KERNEL);
503 memset(bmap, -1, PAGE_SIZE);
504 slen = snprintf(expected, 256, "0-%ld", PAGE_SIZE * 8 - 1);
509 ret = bitmap_print_to_pagebuf(true, buf, bmap, PAGE_SIZE * 8);
510 time = ktime_get() - time;
512 if (ret != slen + 1) {
513 pr_err("bitmap_print_to_pagebuf: result is %d, expected %d\n", ret, slen);
517 if (strncmp(buf, expected, slen)) {
518 pr_err("bitmap_print_to_pagebuf: result is %s, expected %s\n", buf, expected);
522 pr_err("bitmap_print_to_pagebuf: input is '%s', Time: %llu\n", buf, time);
528 static const unsigned long parse_test[] __initconst = {
531 BITMAP_FROM_U64(0xdeadbeef),
532 BITMAP_FROM_U64(0x100000000ULL),
535 static const unsigned long parse_test2[] __initconst = {
536 BITMAP_FROM_U64(0x100000000ULL), BITMAP_FROM_U64(0xdeadbeef),
537 BITMAP_FROM_U64(0x100000000ULL), BITMAP_FROM_U64(0xbaadf00ddeadbeef),
538 BITMAP_FROM_U64(0x100000000ULL), BITMAP_FROM_U64(0x0badf00ddeadbeef),
541 static const struct test_bitmap_parselist parse_tests[] __initconst = {
542 {0, "", &parse_test[0 * step], 32, 0},
543 {0, " ", &parse_test[0 * step], 32, 0},
544 {0, "0", &parse_test[0 * step], 32, 0},
545 {0, "0\n", &parse_test[0 * step], 32, 0},
546 {0, "1", &parse_test[1 * step], 32, 0},
547 {0, "deadbeef", &parse_test[2 * step], 32, 0},
548 {0, "1,0", &parse_test[3 * step], 33, 0},
549 {0, "deadbeef,\n,0,1", &parse_test[2 * step], 96, 0},
551 {0, "deadbeef,1,0", &parse_test2[0 * 2 * step], 96, 0},
552 {0, "baadf00d,deadbeef,1,0", &parse_test2[1 * 2 * step], 128, 0},
553 {0, "badf00d,deadbeef,1,0", &parse_test2[2 * 2 * step], 124, 0},
554 {0, "badf00d,deadbeef,1,0", &parse_test2[2 * 2 * step], 124, NO_LEN},
555 {0, " badf00d,deadbeef,1,0 ", &parse_test2[2 * 2 * step], 124, 0},
556 {0, " , badf00d,deadbeef,1,0 , ", &parse_test2[2 * 2 * step], 124, 0},
557 {0, " , badf00d, ,, ,,deadbeef,1,0 , ", &parse_test2[2 * 2 * step], 124, 0},
559 {-EINVAL, "goodfood,deadbeef,1,0", NULL, 128, 0},
560 {-EOVERFLOW, "3,0", NULL, 33, 0},
561 {-EOVERFLOW, "123badf00d,deadbeef,1,0", NULL, 128, 0},
562 {-EOVERFLOW, "badf00d,deadbeef,1,0", NULL, 90, 0},
563 {-EOVERFLOW, "fbadf00d,deadbeef,1,0", NULL, 95, 0},
564 {-EOVERFLOW, "badf00d,deadbeef,1,0", NULL, 100, 0},
568 static void __init test_bitmap_parse(void)
573 DECLARE_BITMAP(bmap, 2048);
575 for (i = 0; i < ARRAY_SIZE(parse_tests); i++) {
576 struct test_bitmap_parselist test = parse_tests[i];
577 size_t len = test.flags & NO_LEN ? UINT_MAX : strlen(test.in);
580 err = bitmap_parse(test.in, len, bmap, test.nbits);
581 time = ktime_get() - time;
583 if (err != test.errno) {
584 pr_err("parse: %d: input is %s, errno is %d, expected %d\n",
585 i, test.in, err, test.errno);
589 if (!err && test.expected
590 && !__bitmap_equal(bmap, test.expected, test.nbits)) {
591 pr_err("parse: %d: input is %s, result is 0x%lx, expected 0x%lx\n",
597 if (test.flags & PARSE_TIME)
598 pr_err("parse: %d: input is '%s' OK, Time: %llu\n",
603 static void __init test_bitmap_arr32(void)
605 unsigned int nbits, next_bit;
606 u32 arr[EXP1_IN_BITS / 32];
607 DECLARE_BITMAP(bmap2, EXP1_IN_BITS);
609 memset(arr, 0xa5, sizeof(arr));
611 for (nbits = 0; nbits < EXP1_IN_BITS; ++nbits) {
612 bitmap_to_arr32(arr, exp1, nbits);
613 bitmap_from_arr32(bmap2, arr, nbits);
614 expect_eq_bitmap(bmap2, exp1, nbits);
616 next_bit = find_next_bit(bmap2,
617 round_up(nbits, BITS_PER_LONG), nbits);
618 if (next_bit < round_up(nbits, BITS_PER_LONG))
619 pr_err("bitmap_copy_arr32(nbits == %d:"
620 " tail is not safely cleared: %d\n",
623 if (nbits < EXP1_IN_BITS - 32)
624 expect_eq_uint(arr[DIV_ROUND_UP(nbits, 32)],
629 static void __init test_bitmap_arr64(void)
631 unsigned int nbits, next_bit;
632 u64 arr[EXP1_IN_BITS / 64];
633 DECLARE_BITMAP(bmap2, EXP1_IN_BITS);
635 memset(arr, 0xa5, sizeof(arr));
637 for (nbits = 0; nbits < EXP1_IN_BITS; ++nbits) {
638 memset(bmap2, 0xff, sizeof(arr));
639 bitmap_to_arr64(arr, exp1, nbits);
640 bitmap_from_arr64(bmap2, arr, nbits);
641 expect_eq_bitmap(bmap2, exp1, nbits);
643 next_bit = find_next_bit(bmap2, round_up(nbits, BITS_PER_LONG), nbits);
644 if (next_bit < round_up(nbits, BITS_PER_LONG))
645 pr_err("bitmap_copy_arr64(nbits == %d:"
646 " tail is not safely cleared: %d\n", nbits, next_bit);
649 (arr[(nbits - 1) / 64] & ~GENMASK_ULL((nbits - 1) % 64, 0)))
650 pr_err("bitmap_to_arr64(nbits == %d): tail is not safely cleared: 0x%016llx (must be 0x%016llx)\n",
651 nbits, arr[(nbits - 1) / 64],
652 GENMASK_ULL((nbits - 1) % 64, 0));
654 if (nbits < EXP1_IN_BITS - 64)
655 expect_eq_uint(arr[DIV_ROUND_UP(nbits, 64)], 0xa5a5a5a5);
659 static void noinline __init test_mem_optimisations(void)
661 DECLARE_BITMAP(bmap1, 1024);
662 DECLARE_BITMAP(bmap2, 1024);
663 unsigned int start, nbits;
665 for (start = 0; start < 1024; start += 8) {
666 for (nbits = 0; nbits < 1024 - start; nbits += 8) {
667 memset(bmap1, 0x5a, sizeof(bmap1));
668 memset(bmap2, 0x5a, sizeof(bmap2));
670 bitmap_set(bmap1, start, nbits);
671 __bitmap_set(bmap2, start, nbits);
672 if (!bitmap_equal(bmap1, bmap2, 1024)) {
673 printk("set not equal %d %d\n", start, nbits);
676 if (!__bitmap_equal(bmap1, bmap2, 1024)) {
677 printk("set not __equal %d %d\n", start, nbits);
681 bitmap_clear(bmap1, start, nbits);
682 __bitmap_clear(bmap2, start, nbits);
683 if (!bitmap_equal(bmap1, bmap2, 1024)) {
684 printk("clear not equal %d %d\n", start, nbits);
687 if (!__bitmap_equal(bmap1, bmap2, 1024)) {
688 printk("clear not __equal %d %d\n", start,
696 static const unsigned char clump_exp[] __initconst = {
697 0x01, /* 1 bit set */
698 0x02, /* non-edge 1 bit set */
699 0x00, /* zero bits set */
700 0x38, /* 3 bits set across 4-bit boundary */
701 0x38, /* Repeated clump */
702 0x0F, /* 4 bits set */
703 0xFF, /* all bits set */
704 0x05, /* non-adjacent 2 bits set */
707 static void __init test_for_each_set_clump8(void)
709 #define CLUMP_EXP_NUMBITS 64
710 DECLARE_BITMAP(bits, CLUMP_EXP_NUMBITS);
714 /* set bitmap to test case */
715 bitmap_zero(bits, CLUMP_EXP_NUMBITS);
716 bitmap_set(bits, 0, 1); /* 0x01 */
717 bitmap_set(bits, 9, 1); /* 0x02 */
718 bitmap_set(bits, 27, 3); /* 0x28 */
719 bitmap_set(bits, 35, 3); /* 0x28 */
720 bitmap_set(bits, 40, 4); /* 0x0F */
721 bitmap_set(bits, 48, 8); /* 0xFF */
722 bitmap_set(bits, 56, 1); /* 0x05 - part 1 */
723 bitmap_set(bits, 58, 1); /* 0x05 - part 2 */
725 for_each_set_clump8(start, clump, bits, CLUMP_EXP_NUMBITS)
726 expect_eq_clump8(start, CLUMP_EXP_NUMBITS, clump_exp, &clump);
729 static void __init test_for_each_set_bit_wrap(void)
731 DECLARE_BITMAP(orig, 500);
732 DECLARE_BITMAP(copy, 500);
733 unsigned int wr, bit;
735 bitmap_zero(orig, 500);
737 /* Set individual bits */
738 for (bit = 0; bit < 500; bit += 10)
739 bitmap_set(orig, bit, 1);
741 /* Set range of bits */
742 bitmap_set(orig, 100, 50);
744 for (wr = 0; wr < 500; wr++) {
745 bitmap_zero(copy, 500);
747 for_each_set_bit_wrap(bit, orig, 500, wr)
748 bitmap_set(copy, bit, 1);
750 expect_eq_bitmap(orig, copy, 500);
754 static void __init test_for_each_set_bit(void)
756 DECLARE_BITMAP(orig, 500);
757 DECLARE_BITMAP(copy, 500);
760 bitmap_zero(orig, 500);
761 bitmap_zero(copy, 500);
763 /* Set individual bits */
764 for (bit = 0; bit < 500; bit += 10)
765 bitmap_set(orig, bit, 1);
767 /* Set range of bits */
768 bitmap_set(orig, 100, 50);
770 for_each_set_bit(bit, orig, 500)
771 bitmap_set(copy, bit, 1);
773 expect_eq_bitmap(orig, copy, 500);
776 static void __init test_for_each_set_bit_from(void)
778 DECLARE_BITMAP(orig, 500);
779 DECLARE_BITMAP(copy, 500);
780 unsigned int wr, bit;
782 bitmap_zero(orig, 500);
784 /* Set individual bits */
785 for (bit = 0; bit < 500; bit += 10)
786 bitmap_set(orig, bit, 1);
788 /* Set range of bits */
789 bitmap_set(orig, 100, 50);
791 for (wr = 0; wr < 500; wr++) {
792 DECLARE_BITMAP(tmp, 500);
794 bitmap_zero(copy, 500);
797 for_each_set_bit_from(bit, orig, 500)
798 bitmap_set(copy, bit, 1);
800 bitmap_copy(tmp, orig, 500);
801 bitmap_clear(tmp, 0, wr);
802 expect_eq_bitmap(tmp, copy, 500);
806 static void __init test_for_each_clear_bit(void)
808 DECLARE_BITMAP(orig, 500);
809 DECLARE_BITMAP(copy, 500);
812 bitmap_fill(orig, 500);
813 bitmap_fill(copy, 500);
815 /* Set individual bits */
816 for (bit = 0; bit < 500; bit += 10)
817 bitmap_clear(orig, bit, 1);
819 /* Set range of bits */
820 bitmap_clear(orig, 100, 50);
822 for_each_clear_bit(bit, orig, 500)
823 bitmap_clear(copy, bit, 1);
825 expect_eq_bitmap(orig, copy, 500);
828 static void __init test_for_each_clear_bit_from(void)
830 DECLARE_BITMAP(orig, 500);
831 DECLARE_BITMAP(copy, 500);
832 unsigned int wr, bit;
834 bitmap_fill(orig, 500);
836 /* Set individual bits */
837 for (bit = 0; bit < 500; bit += 10)
838 bitmap_clear(orig, bit, 1);
840 /* Set range of bits */
841 bitmap_clear(orig, 100, 50);
843 for (wr = 0; wr < 500; wr++) {
844 DECLARE_BITMAP(tmp, 500);
846 bitmap_fill(copy, 500);
849 for_each_clear_bit_from(bit, orig, 500)
850 bitmap_clear(copy, bit, 1);
852 bitmap_copy(tmp, orig, 500);
853 bitmap_set(tmp, 0, wr);
854 expect_eq_bitmap(tmp, copy, 500);
858 static void __init test_for_each_set_bitrange(void)
860 DECLARE_BITMAP(orig, 500);
861 DECLARE_BITMAP(copy, 500);
864 bitmap_zero(orig, 500);
865 bitmap_zero(copy, 500);
867 /* Set individual bits */
868 for (s = 0; s < 500; s += 10)
869 bitmap_set(orig, s, 1);
871 /* Set range of bits */
872 bitmap_set(orig, 100, 50);
874 for_each_set_bitrange(s, e, orig, 500)
875 bitmap_set(copy, s, e-s);
877 expect_eq_bitmap(orig, copy, 500);
880 static void __init test_for_each_clear_bitrange(void)
882 DECLARE_BITMAP(orig, 500);
883 DECLARE_BITMAP(copy, 500);
886 bitmap_fill(orig, 500);
887 bitmap_fill(copy, 500);
889 /* Set individual bits */
890 for (s = 0; s < 500; s += 10)
891 bitmap_clear(orig, s, 1);
893 /* Set range of bits */
894 bitmap_clear(orig, 100, 50);
896 for_each_clear_bitrange(s, e, orig, 500)
897 bitmap_clear(copy, s, e-s);
899 expect_eq_bitmap(orig, copy, 500);
902 static void __init test_for_each_set_bitrange_from(void)
904 DECLARE_BITMAP(orig, 500);
905 DECLARE_BITMAP(copy, 500);
906 unsigned int wr, s, e;
908 bitmap_zero(orig, 500);
910 /* Set individual bits */
911 for (s = 0; s < 500; s += 10)
912 bitmap_set(orig, s, 1);
914 /* Set range of bits */
915 bitmap_set(orig, 100, 50);
917 for (wr = 0; wr < 500; wr++) {
918 DECLARE_BITMAP(tmp, 500);
920 bitmap_zero(copy, 500);
923 for_each_set_bitrange_from(s, e, orig, 500)
924 bitmap_set(copy, s, e - s);
926 bitmap_copy(tmp, orig, 500);
927 bitmap_clear(tmp, 0, wr);
928 expect_eq_bitmap(tmp, copy, 500);
932 static void __init test_for_each_clear_bitrange_from(void)
934 DECLARE_BITMAP(orig, 500);
935 DECLARE_BITMAP(copy, 500);
936 unsigned int wr, s, e;
938 bitmap_fill(orig, 500);
940 /* Set individual bits */
941 for (s = 0; s < 500; s += 10)
942 bitmap_clear(orig, s, 1);
944 /* Set range of bits */
945 bitmap_set(orig, 100, 50);
947 for (wr = 0; wr < 500; wr++) {
948 DECLARE_BITMAP(tmp, 500);
950 bitmap_fill(copy, 500);
953 for_each_clear_bitrange_from(s, e, orig, 500)
954 bitmap_clear(copy, s, e - s);
956 bitmap_copy(tmp, orig, 500);
957 bitmap_set(tmp, 0, wr);
958 expect_eq_bitmap(tmp, copy, 500);
962 struct test_bitmap_cut {
967 unsigned long expected[4];
970 static struct test_bitmap_cut test_cut[] = {
971 { 0, 0, 8, { 0x0000000aUL, }, { 0x0000000aUL, }, },
972 { 0, 0, 32, { 0xdadadeadUL, }, { 0xdadadeadUL, }, },
973 { 0, 3, 8, { 0x000000aaUL, }, { 0x00000015UL, }, },
974 { 3, 3, 8, { 0x000000aaUL, }, { 0x00000012UL, }, },
975 { 0, 1, 32, { 0xa5a5a5a5UL, }, { 0x52d2d2d2UL, }, },
976 { 0, 8, 32, { 0xdeadc0deUL, }, { 0x00deadc0UL, }, },
977 { 1, 1, 32, { 0x5a5a5a5aUL, }, { 0x2d2d2d2cUL, }, },
978 { 0, 15, 32, { 0xa5a5a5a5UL, }, { 0x00014b4bUL, }, },
979 { 0, 16, 32, { 0xa5a5a5a5UL, }, { 0x0000a5a5UL, }, },
980 { 15, 15, 32, { 0xa5a5a5a5UL, }, { 0x000125a5UL, }, },
981 { 15, 16, 32, { 0xa5a5a5a5UL, }, { 0x0000a5a5UL, }, },
982 { 16, 15, 32, { 0xa5a5a5a5UL, }, { 0x0001a5a5UL, }, },
984 { BITS_PER_LONG, BITS_PER_LONG, BITS_PER_LONG,
985 { 0xa5a5a5a5UL, 0xa5a5a5a5UL, },
986 { 0xa5a5a5a5UL, 0xa5a5a5a5UL, },
988 { 1, BITS_PER_LONG - 1, BITS_PER_LONG,
989 { 0xa5a5a5a5UL, 0xa5a5a5a5UL, },
990 { 0x00000001UL, 0x00000001UL, },
993 { 0, BITS_PER_LONG * 2, BITS_PER_LONG * 2 + 1,
994 { 0xa5a5a5a5UL, 0x00000001UL, 0x00000001UL, 0x00000001UL },
997 { 16, BITS_PER_LONG * 2 + 1, BITS_PER_LONG * 2 + 1 + 16,
998 { 0x0000ffffUL, 0x5a5a5a5aUL, 0x5a5a5a5aUL, 0x5a5a5a5aUL },
1003 static void __init test_bitmap_cut(void)
1005 unsigned long b[5], *in = &b[1], *out = &b[0]; /* Partial overlap */
1008 for (i = 0; i < ARRAY_SIZE(test_cut); i++) {
1009 struct test_bitmap_cut *t = &test_cut[i];
1011 memcpy(in, t->in, sizeof(t->in));
1013 bitmap_cut(out, in, t->first, t->cut, t->nbits);
1015 expect_eq_bitmap(t->expected, out, t->nbits);
1019 struct test_bitmap_print {
1020 const unsigned long *bitmap;
1021 unsigned long nbits;
1026 static const unsigned long small_bitmap[] __initconst = {
1027 BITMAP_FROM_U64(0x3333333311111111ULL),
1030 static const char small_mask[] __initconst = "33333333,11111111\n";
1031 static const char small_list[] __initconst = "0,4,8,12,16,20,24,28,32-33,36-37,40-41,44-45,48-49,52-53,56-57,60-61\n";
1033 static const unsigned long large_bitmap[] __initconst = {
1034 BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL),
1035 BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL),
1036 BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL),
1037 BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL),
1038 BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL),
1039 BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL),
1040 BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL),
1041 BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL),
1042 BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL),
1043 BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL),
1044 BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL),
1045 BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL),
1046 BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL),
1047 BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL),
1048 BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL),
1049 BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL),
1050 BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL),
1051 BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL),
1052 BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL),
1053 BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL),
1056 static const char large_mask[] __initconst = "33333333,11111111,33333333,11111111,"
1057 "33333333,11111111,33333333,11111111,"
1058 "33333333,11111111,33333333,11111111,"
1059 "33333333,11111111,33333333,11111111,"
1060 "33333333,11111111,33333333,11111111,"
1061 "33333333,11111111,33333333,11111111,"
1062 "33333333,11111111,33333333,11111111,"
1063 "33333333,11111111,33333333,11111111,"
1064 "33333333,11111111,33333333,11111111,"
1065 "33333333,11111111,33333333,11111111,"
1066 "33333333,11111111,33333333,11111111,"
1067 "33333333,11111111,33333333,11111111,"
1068 "33333333,11111111,33333333,11111111,"
1069 "33333333,11111111,33333333,11111111,"
1070 "33333333,11111111,33333333,11111111,"
1071 "33333333,11111111,33333333,11111111,"
1072 "33333333,11111111,33333333,11111111,"
1073 "33333333,11111111,33333333,11111111,"
1074 "33333333,11111111,33333333,11111111,"
1075 "33333333,11111111,33333333,11111111\n";
1077 static const char large_list[] __initconst = /* more than 4KB */
1078 "0,4,8,12,16,20,24,28,32-33,36-37,40-41,44-45,48-49,52-53,56-57,60-61,64,68,72,76,80,84,88,92,96-97,100-101,104-1"
1079 "05,108-109,112-113,116-117,120-121,124-125,128,132,136,140,144,148,152,156,160-161,164-165,168-169,172-173,176-1"
1080 "77,180-181,184-185,188-189,192,196,200,204,208,212,216,220,224-225,228-229,232-233,236-237,240-241,244-245,248-2"
1081 "49,252-253,256,260,264,268,272,276,280,284,288-289,292-293,296-297,300-301,304-305,308-309,312-313,316-317,320,3"
1082 "24,328,332,336,340,344,348,352-353,356-357,360-361,364-365,368-369,372-373,376-377,380-381,384,388,392,396,400,4"
1083 "04,408,412,416-417,420-421,424-425,428-429,432-433,436-437,440-441,444-445,448,452,456,460,464,468,472,476,480-4"
1084 "81,484-485,488-489,492-493,496-497,500-501,504-505,508-509,512,516,520,524,528,532,536,540,544-545,548-549,552-5"
1085 "53,556-557,560-561,564-565,568-569,572-573,576,580,584,588,592,596,600,604,608-609,612-613,616-617,620-621,624-6"
1086 "25,628-629,632-633,636-637,640,644,648,652,656,660,664,668,672-673,676-677,680-681,684-685,688-689,692-693,696-6"
1087 "97,700-701,704,708,712,716,720,724,728,732,736-737,740-741,744-745,748-749,752-753,756-757,760-761,764-765,768,7"
1088 "72,776,780,784,788,792,796,800-801,804-805,808-809,812-813,816-817,820-821,824-825,828-829,832,836,840,844,848,8"
1089 "52,856,860,864-865,868-869,872-873,876-877,880-881,884-885,888-889,892-893,896,900,904,908,912,916,920,924,928-9"
1090 "29,932-933,936-937,940-941,944-945,948-949,952-953,956-957,960,964,968,972,976,980,984,988,992-993,996-997,1000-"
1091 "1001,1004-1005,1008-1009,1012-1013,1016-1017,1020-1021,1024,1028,1032,1036,1040,1044,1048,1052,1056-1057,1060-10"
1092 "61,1064-1065,1068-1069,1072-1073,1076-1077,1080-1081,1084-1085,1088,1092,1096,1100,1104,1108,1112,1116,1120-1121"
1093 ",1124-1125,1128-1129,1132-1133,1136-1137,1140-1141,1144-1145,1148-1149,1152,1156,1160,1164,1168,1172,1176,1180,1"
1094 "184-1185,1188-1189,1192-1193,1196-1197,1200-1201,1204-1205,1208-1209,1212-1213,1216,1220,1224,1228,1232,1236,124"
1095 "0,1244,1248-1249,1252-1253,1256-1257,1260-1261,1264-1265,1268-1269,1272-1273,1276-1277,1280,1284,1288,1292,1296,"
1096 "1300,1304,1308,1312-1313,1316-1317,1320-1321,1324-1325,1328-1329,1332-1333,1336-1337,1340-1341,1344,1348,1352,13"
1097 "56,1360,1364,1368,1372,1376-1377,1380-1381,1384-1385,1388-1389,1392-1393,1396-1397,1400-1401,1404-1405,1408,1412"
1098 ",1416,1420,1424,1428,1432,1436,1440-1441,1444-1445,1448-1449,1452-1453,1456-1457,1460-1461,1464-1465,1468-1469,1"
1099 "472,1476,1480,1484,1488,1492,1496,1500,1504-1505,1508-1509,1512-1513,1516-1517,1520-1521,1524-1525,1528-1529,153"
1100 "2-1533,1536,1540,1544,1548,1552,1556,1560,1564,1568-1569,1572-1573,1576-1577,1580-1581,1584-1585,1588-1589,1592-"
1101 "1593,1596-1597,1600,1604,1608,1612,1616,1620,1624,1628,1632-1633,1636-1637,1640-1641,1644-1645,1648-1649,1652-16"
1102 "53,1656-1657,1660-1661,1664,1668,1672,1676,1680,1684,1688,1692,1696-1697,1700-1701,1704-1705,1708-1709,1712-1713"
1103 ",1716-1717,1720-1721,1724-1725,1728,1732,1736,1740,1744,1748,1752,1756,1760-1761,1764-1765,1768-1769,1772-1773,1"
1104 "776-1777,1780-1781,1784-1785,1788-1789,1792,1796,1800,1804,1808,1812,1816,1820,1824-1825,1828-1829,1832-1833,183"
1105 "6-1837,1840-1841,1844-1845,1848-1849,1852-1853,1856,1860,1864,1868,1872,1876,1880,1884,1888-1889,1892-1893,1896-"
1106 "1897,1900-1901,1904-1905,1908-1909,1912-1913,1916-1917,1920,1924,1928,1932,1936,1940,1944,1948,1952-1953,1956-19"
1107 "57,1960-1961,1964-1965,1968-1969,1972-1973,1976-1977,1980-1981,1984,1988,1992,1996,2000,2004,2008,2012,2016-2017"
1108 ",2020-2021,2024-2025,2028-2029,2032-2033,2036-2037,2040-2041,2044-2045,2048,2052,2056,2060,2064,2068,2072,2076,2"
1109 "080-2081,2084-2085,2088-2089,2092-2093,2096-2097,2100-2101,2104-2105,2108-2109,2112,2116,2120,2124,2128,2132,213"
1110 "6,2140,2144-2145,2148-2149,2152-2153,2156-2157,2160-2161,2164-2165,2168-2169,2172-2173,2176,2180,2184,2188,2192,"
1111 "2196,2200,2204,2208-2209,2212-2213,2216-2217,2220-2221,2224-2225,2228-2229,2232-2233,2236-2237,2240,2244,2248,22"
1112 "52,2256,2260,2264,2268,2272-2273,2276-2277,2280-2281,2284-2285,2288-2289,2292-2293,2296-2297,2300-2301,2304,2308"
1113 ",2312,2316,2320,2324,2328,2332,2336-2337,2340-2341,2344-2345,2348-2349,2352-2353,2356-2357,2360-2361,2364-2365,2"
1114 "368,2372,2376,2380,2384,2388,2392,2396,2400-2401,2404-2405,2408-2409,2412-2413,2416-2417,2420-2421,2424-2425,242"
1115 "8-2429,2432,2436,2440,2444,2448,2452,2456,2460,2464-2465,2468-2469,2472-2473,2476-2477,2480-2481,2484-2485,2488-"
1116 "2489,2492-2493,2496,2500,2504,2508,2512,2516,2520,2524,2528-2529,2532-2533,2536-2537,2540-2541,2544-2545,2548-25"
1117 "49,2552-2553,2556-2557\n";
1119 static const struct test_bitmap_print test_print[] __initconst = {
1120 { small_bitmap, sizeof(small_bitmap) * BITS_PER_BYTE, small_mask, small_list },
1121 { large_bitmap, sizeof(large_bitmap) * BITS_PER_BYTE, large_mask, large_list },
1124 static void __init test_bitmap_print_buf(void)
1128 for (i = 0; i < ARRAY_SIZE(test_print); i++) {
1129 const struct test_bitmap_print *t = &test_print[i];
1132 n = bitmap_print_bitmask_to_buf(print_buf, t->bitmap, t->nbits,
1134 expect_eq_uint(strlen(t->mask) + 1, n);
1135 expect_eq_str(t->mask, print_buf, n);
1137 n = bitmap_print_list_to_buf(print_buf, t->bitmap, t->nbits,
1139 expect_eq_uint(strlen(t->list) + 1, n);
1140 expect_eq_str(t->list, print_buf, n);
1142 /* test by non-zero offset */
1143 if (strlen(t->list) > PAGE_SIZE) {
1144 n = bitmap_print_list_to_buf(print_buf, t->bitmap, t->nbits,
1145 PAGE_SIZE, PAGE_SIZE);
1146 expect_eq_uint(strlen(t->list) + 1 - PAGE_SIZE, n);
1147 expect_eq_str(t->list + PAGE_SIZE, print_buf, n);
1153 * FIXME: Clang breaks compile-time evaluations when KASAN and GCOV are enabled.
1154 * To workaround it, GCOV is force-disabled in Makefile for this configuration.
1156 static void __init test_bitmap_const_eval(void)
1158 DECLARE_BITMAP(bitmap, BITS_PER_LONG);
1159 unsigned long initvar = BIT(2);
1160 unsigned long bitopvar = 0;
1161 unsigned long var = 0;
1165 * Compilers must be able to optimize all of those to compile-time
1166 * constants on any supported optimization level (-O2, -Os) and any
1167 * architecture. Otherwise, trigger a build bug.
1168 * The whole function gets optimized out then, there's nothing to do
1173 * Equals to `unsigned long bitmap[1] = { GENMASK(6, 5), }`.
1174 * Clang on s390 optimizes bitops at compile-time as intended, but at
1175 * the same time stops treating @bitmap and @bitopvar as compile-time
1176 * constants after regular test_bit() is executed, thus triggering the
1177 * build bugs below. So, call const_test_bit() there directly until
1178 * the compiler is fixed.
1180 bitmap_clear(bitmap, 0, BITS_PER_LONG);
1181 if (!test_bit(7, bitmap))
1182 bitmap_set(bitmap, 5, 2);
1184 /* Equals to `unsigned long bitopvar = BIT(20)` */
1185 __change_bit(31, &bitopvar);
1186 bitmap_shift_right(&bitopvar, &bitopvar, 11, BITS_PER_LONG);
1188 /* Equals to `unsigned long var = BIT(25)` */
1191 var ^= GENMASK(9, 6);
1193 /* __const_hweight<32|64>(GENMASK(6, 5)) == 2 */
1194 res = bitmap_weight(bitmap, 20);
1195 BUILD_BUG_ON(!__builtin_constant_p(res));
1196 BUILD_BUG_ON(res != 2);
1198 /* !(BIT(31) & BIT(18)) == 1 */
1199 res = !test_bit(18, &bitopvar);
1200 BUILD_BUG_ON(!__builtin_constant_p(res));
1203 /* BIT(2) & GENMASK(14, 8) == 0 */
1204 res = initvar & GENMASK(14, 8);
1205 BUILD_BUG_ON(!__builtin_constant_p(res));
1209 BUILD_BUG_ON(!__builtin_constant_p(~var));
1210 BUILD_BUG_ON(~var != ~BIT(25));
1213 static void __init selftest(void)
1219 test_bitmap_arr32();
1220 test_bitmap_arr64();
1221 test_bitmap_parse();
1222 test_bitmap_parselist();
1223 test_bitmap_printlist();
1224 test_mem_optimisations();
1226 test_bitmap_print_buf();
1227 test_bitmap_const_eval();
1229 test_find_nth_bit();
1230 test_for_each_set_bit();
1231 test_for_each_set_bit_from();
1232 test_for_each_clear_bit();
1233 test_for_each_clear_bit_from();
1234 test_for_each_set_bitrange();
1235 test_for_each_clear_bitrange();
1236 test_for_each_set_bitrange_from();
1237 test_for_each_clear_bitrange_from();
1238 test_for_each_set_clump8();
1239 test_for_each_set_bit_wrap();
1242 KSTM_MODULE_LOADERS(test_bitmap);
1243 MODULE_AUTHOR("david decotigny <david.decotigny@googlers.com>");
1244 MODULE_LICENSE("GPL");