1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * Test cases for bitmap API. 4 */ 5 6 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 7 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> 16 17 #include "../tools/testing/selftests/kselftest_module.h" 18 19 #define EXP1_IN_BITS (sizeof(exp1) * 8) 20 21 KSTM_MODULE_GLOBALS(); 22 23 static char pbl_buffer[PAGE_SIZE] __initdata; 24 static char print_buf[PAGE_SIZE * 2] __initdata; 25 26 static const unsigned long exp1[] __initconst = { 27 BITMAP_FROM_U64(1), 28 BITMAP_FROM_U64(2), 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), 39 BITMAP_FROM_U64(0), 40 BITMAP_FROM_U64(0x00008000), 41 BITMAP_FROM_U64(0x80000000), 42 }; 43 44 static const unsigned long exp2[] __initconst = { 45 BITMAP_FROM_U64(0x3333333311111111ULL), 46 BITMAP_FROM_U64(0xffffffff77777777ULL), 47 }; 48 49 /* Fibonacci sequence */ 50 static const unsigned long exp2_to_exp3_mask[] __initconst = { 51 BITMAP_FROM_U64(0x008000020020212eULL), 52 }; 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), 56 }; 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), 60 }; 61 62 static bool __init 63 __check_eq_uint(const char *srcfile, unsigned int line, 64 const unsigned int exp_uint, unsigned int x) 65 { 66 if (exp_uint != x) { 67 pr_err("[%s:%u] expected %u, got %u\n", 68 srcfile, line, exp_uint, x); 69 return false; 70 } 71 return true; 72 } 73 74 75 static bool __init 76 __check_eq_bitmap(const char *srcfile, unsigned int line, 77 const unsigned long *exp_bmap, const unsigned long *bmap, 78 unsigned int nbits) 79 { 80 if (!bitmap_equal(exp_bmap, bmap, nbits)) { 81 pr_warn("[%s:%u] bitmaps contents differ: expected \"%*pbl\", got \"%*pbl\"\n", 82 srcfile, line, 83 nbits, exp_bmap, nbits, bmap); 84 return false; 85 } 86 return true; 87 } 88 89 static bool __init 90 __check_eq_pbl(const char *srcfile, unsigned int line, 91 const char *expected_pbl, 92 const unsigned long *bitmap, unsigned int nbits) 93 { 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", 97 srcfile, line, 98 expected_pbl, pbl_buffer); 99 return false; 100 } 101 return true; 102 } 103 104 static bool __init 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; 108 static bool __init 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) 112 { 113 if (exp_len != len) { 114 pr_warn("[%s:%u] array length differ: expected %u, got %u\n", 115 srcfile, line, 116 exp_len, len); 117 return false; 118 } 119 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); 126 return false; 127 } 128 129 return true; 130 } 131 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) 137 { 138 unsigned long exp; 139 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); 143 return false; 144 } 145 146 exp = clump_exp[offset / 8]; 147 if (!exp) { 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); 150 return false; 151 } 152 153 if (*clump != exp) { 154 pr_warn("[%s:%u] expected clump value of 0x%lX, got clump value of 0x%lX", 155 srcfile, line, exp, *clump); 156 return false; 157 } 158 159 return true; 160 } 161 162 static bool __init 163 __check_eq_str(const char *srcfile, unsigned int line, 164 const char *exp_str, const char *str, 165 unsigned int len) 166 { 167 bool eq; 168 169 eq = strncmp(exp_str, str, len) == 0; 170 if (!eq) 171 pr_err("[%s:%u] expected %s, got %s\n", srcfile, line, exp_str, str); 172 173 return eq; 174 } 175 176 #define __expect_eq(suffix, ...) \ 177 ({ \ 178 int result = 0; \ 179 total_tests++; \ 180 if (!__check_eq_ ## suffix(__FILE__, __LINE__, \ 181 ##__VA_ARGS__)) { \ 182 failed_tests++; \ 183 result = 1; \ 184 } \ 185 result; \ 186 }) 187 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__) 194 195 static void __init test_zero_clear(void) 196 { 197 DECLARE_BITMAP(bmap, 1024); 198 199 /* Known way to set all bits */ 200 memset(bmap, 0xff, 128); 201 202 expect_eq_pbl("0-22", bmap, 23); 203 expect_eq_pbl("0-1023", bmap, 1024); 204 205 /* single-word bitmaps */ 206 bitmap_clear(bmap, 0, 9); 207 expect_eq_pbl("9-1023", bmap, 1024); 208 209 bitmap_zero(bmap, 35); 210 expect_eq_pbl("64-1023", bmap, 1024); 211 212 /* cross boundaries operations */ 213 bitmap_clear(bmap, 79, 19); 214 expect_eq_pbl("64-78,98-1023", bmap, 1024); 215 216 bitmap_zero(bmap, 115); 217 expect_eq_pbl("128-1023", bmap, 1024); 218 219 /* Zeroing entire area */ 220 bitmap_zero(bmap, 1024); 221 expect_eq_pbl("", bmap, 1024); 222 } 223 224 static void __init test_find_nth_bit(void) 225 { 226 unsigned long b, bit, cnt = 0; 227 DECLARE_BITMAP(bmap, 64 * 3); 228 229 bitmap_zero(bmap, 64 * 3); 230 __set_bit(10, bmap); 231 __set_bit(20, bmap); 232 __set_bit(30, bmap); 233 __set_bit(40, bmap); 234 __set_bit(50, bmap); 235 __set_bit(60, bmap); 236 __set_bit(80, bmap); 237 __set_bit(123, bmap); 238 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)); 248 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)); 258 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); 262 } 263 } 264 265 static void __init test_fill_set(void) 266 { 267 DECLARE_BITMAP(bmap, 1024); 268 269 /* Known way to clear all bits */ 270 memset(bmap, 0x00, 128); 271 272 expect_eq_pbl("", bmap, 23); 273 expect_eq_pbl("", bmap, 1024); 274 275 /* single-word bitmaps */ 276 bitmap_set(bmap, 0, 9); 277 expect_eq_pbl("0-8", bmap, 1024); 278 279 bitmap_fill(bmap, 35); 280 expect_eq_pbl("0-63", bmap, 1024); 281 282 /* cross boundaries operations */ 283 bitmap_set(bmap, 79, 19); 284 expect_eq_pbl("0-63,79-97", bmap, 1024); 285 286 bitmap_fill(bmap, 115); 287 expect_eq_pbl("0-127", bmap, 1024); 288 289 /* Zeroing entire area */ 290 bitmap_fill(bmap, 1024); 291 expect_eq_pbl("0-1023", bmap, 1024); 292 } 293 294 static void __init test_copy(void) 295 { 296 DECLARE_BITMAP(bmap1, 1024); 297 DECLARE_BITMAP(bmap2, 1024); 298 299 bitmap_zero(bmap1, 1024); 300 bitmap_zero(bmap2, 1024); 301 302 /* single-word bitmaps */ 303 bitmap_set(bmap1, 0, 19); 304 bitmap_copy(bmap2, bmap1, 23); 305 expect_eq_pbl("0-18", bmap2, 1024); 306 307 bitmap_set(bmap2, 0, 23); 308 bitmap_copy(bmap2, bmap1, 23); 309 expect_eq_pbl("0-18", bmap2, 1024); 310 311 /* multi-word bitmaps */ 312 bitmap_set(bmap1, 0, 109); 313 bitmap_copy(bmap2, bmap1, 1024); 314 expect_eq_pbl("0-108", bmap2, 1024); 315 316 bitmap_fill(bmap2, 1024); 317 bitmap_copy(bmap2, bmap1, 1024); 318 expect_eq_pbl("0-108", bmap2, 1024); 319 320 /* the following tests assume a 32- or 64-bit arch (even 128b 321 * if we care) 322 */ 323 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); 327 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); 331 } 332 333 static void __init test_bitmap_region(void) 334 { 335 int pos, order; 336 337 DECLARE_BITMAP(bmap, 1000); 338 339 bitmap_zero(bmap, 1000); 340 341 for (order = 0; order < 10; order++) { 342 pos = bitmap_find_free_region(bmap, 1000, order); 343 if (order == 0) 344 expect_eq_uint(pos, 0); 345 else 346 expect_eq_uint(pos, order < 9 ? BIT(order) : -ENOMEM); 347 } 348 349 bitmap_release_region(bmap, 0, 0); 350 for (order = 1; order < 9; order++) 351 bitmap_release_region(bmap, BIT(order), order); 352 353 expect_eq_uint(bitmap_weight(bmap, 1000), 0); 354 } 355 356 #define EXP2_IN_BITS (sizeof(exp2) * 8) 357 358 static void __init test_replace(void) 359 { 360 unsigned int nbits = 64; 361 unsigned int nlongs = DIV_ROUND_UP(nbits, BITS_PER_LONG); 362 DECLARE_BITMAP(bmap, 1024); 363 364 BUILD_BUG_ON(EXP2_IN_BITS < nbits * 2); 365 366 bitmap_zero(bmap, 1024); 367 bitmap_replace(bmap, &exp2[0 * nlongs], &exp2[1 * nlongs], exp2_to_exp3_mask, nbits); 368 expect_eq_bitmap(bmap, exp3_0_1, nbits); 369 370 bitmap_zero(bmap, 1024); 371 bitmap_replace(bmap, &exp2[1 * nlongs], &exp2[0 * nlongs], exp2_to_exp3_mask, nbits); 372 expect_eq_bitmap(bmap, exp3_1_0, nbits); 373 374 bitmap_fill(bmap, 1024); 375 bitmap_replace(bmap, &exp2[0 * nlongs], &exp2[1 * nlongs], exp2_to_exp3_mask, nbits); 376 expect_eq_bitmap(bmap, exp3_0_1, nbits); 377 378 bitmap_fill(bmap, 1024); 379 bitmap_replace(bmap, &exp2[1 * nlongs], &exp2[0 * nlongs], exp2_to_exp3_mask, nbits); 380 expect_eq_bitmap(bmap, exp3_1_0, nbits); 381 } 382 383 static const unsigned long sg_mask[] __initconst = { 384 BITMAP_FROM_U64(0x000000000000035aULL), 385 }; 386 387 static const unsigned long sg_src[] __initconst = { 388 BITMAP_FROM_U64(0x0000000000000667ULL), 389 }; 390 391 static const unsigned long sg_gather_exp[] __initconst = { 392 BITMAP_FROM_U64(0x0000000000000029ULL), 393 }; 394 395 static const unsigned long sg_scatter_exp[] __initconst = { 396 BITMAP_FROM_U64(0x000000000000021aULL), 397 }; 398 399 static void __init test_bitmap_sg(void) 400 { 401 unsigned int nbits = 64; 402 DECLARE_BITMAP(bmap_gather, 100); 403 DECLARE_BITMAP(bmap_scatter, 100); 404 DECLARE_BITMAP(bmap_tmp, 100); 405 DECLARE_BITMAP(bmap_res, 100); 406 407 /* Simple gather call */ 408 bitmap_zero(bmap_gather, 100); 409 bitmap_gather(bmap_gather, sg_src, sg_mask, nbits); 410 expect_eq_bitmap(sg_gather_exp, bmap_gather, nbits); 411 412 /* Simple scatter call */ 413 bitmap_zero(bmap_scatter, 100); 414 bitmap_scatter(bmap_scatter, sg_src, sg_mask, nbits); 415 expect_eq_bitmap(sg_scatter_exp, bmap_scatter, nbits); 416 417 /* Scatter/gather relationship */ 418 bitmap_zero(bmap_tmp, 100); 419 bitmap_gather(bmap_tmp, bmap_scatter, sg_mask, nbits); 420 bitmap_scatter(bmap_res, bmap_tmp, sg_mask, nbits); 421 expect_eq_bitmap(bmap_scatter, bmap_res, nbits); 422 } 423 424 #define PARSE_TIME 0x1 425 #define NO_LEN 0x2 426 427 struct test_bitmap_parselist{ 428 const int errno; 429 const char *in; 430 const unsigned long *expected; 431 const int nbits; 432 const int flags; 433 }; 434 435 static const struct test_bitmap_parselist parselist_tests[] __initconst = { 436 #define step (sizeof(u64) / sizeof(unsigned long)) 437 438 {0, "0", &exp1[0], 8, 0}, 439 {0, "1", &exp1[1 * step], 8, 0}, 440 {0, "0-15", &exp1[2 * step], 32, 0}, 441 {0, "16-31", &exp1[3 * step], 32, 0}, 442 {0, "0-31:1/2", &exp1[4 * step], 32, 0}, 443 {0, "1-31:1/2", &exp1[5 * step], 32, 0}, 444 {0, "0-31:1/4", &exp1[6 * step], 32, 0}, 445 {0, "1-31:1/4", &exp1[7 * step], 32, 0}, 446 {0, "0-31:4/4", &exp1[8 * step], 32, 0}, 447 {0, "1-31:4/4", &exp1[9 * step], 32, 0}, 448 {0, "0-31:1/4,32-63:2/4", &exp1[10 * step], 64, 0}, 449 {0, "0-31:3/4,32-63:4/4", &exp1[11 * step], 64, 0}, 450 {0, " ,, 0-31:3/4 ,, 32-63:4/4 ,, ", &exp1[11 * step], 64, 0}, 451 452 {0, "0-31:1/4,32-63:2/4,64-95:3/4,96-127:4/4", exp2, 128, 0}, 453 454 {0, "0-2047:128/256", NULL, 2048, PARSE_TIME}, 455 456 {0, "", &exp1[12 * step], 8, 0}, 457 {0, "\n", &exp1[12 * step], 8, 0}, 458 {0, ",, ,, , , ,", &exp1[12 * step], 8, 0}, 459 {0, " , ,, , , ", &exp1[12 * step], 8, 0}, 460 {0, " , ,, , , \n", &exp1[12 * step], 8, 0}, 461 462 {0, "0-0", &exp1[0], 32, 0}, 463 {0, "1-1", &exp1[1 * step], 32, 0}, 464 {0, "15-15", &exp1[13 * step], 32, 0}, 465 {0, "31-31", &exp1[14 * step], 32, 0}, 466 467 {0, "0-0:0/1", &exp1[12 * step], 32, 0}, 468 {0, "0-0:1/1", &exp1[0], 32, 0}, 469 {0, "0-0:1/31", &exp1[0], 32, 0}, 470 {0, "0-0:31/31", &exp1[0], 32, 0}, 471 {0, "1-1:1/1", &exp1[1 * step], 32, 0}, 472 {0, "0-15:16/31", &exp1[2 * step], 32, 0}, 473 {0, "15-15:1/2", &exp1[13 * step], 32, 0}, 474 {0, "15-15:31/31", &exp1[13 * step], 32, 0}, 475 {0, "15-31:1/31", &exp1[13 * step], 32, 0}, 476 {0, "16-31:16/31", &exp1[3 * step], 32, 0}, 477 {0, "31-31:31/31", &exp1[14 * step], 32, 0}, 478 479 {0, "N-N", &exp1[14 * step], 32, 0}, 480 {0, "0-0:1/N", &exp1[0], 32, 0}, 481 {0, "0-0:N/N", &exp1[0], 32, 0}, 482 {0, "0-15:16/N", &exp1[2 * step], 32, 0}, 483 {0, "15-15:N/N", &exp1[13 * step], 32, 0}, 484 {0, "15-N:1/N", &exp1[13 * step], 32, 0}, 485 {0, "16-N:16/N", &exp1[3 * step], 32, 0}, 486 {0, "N-N:N/N", &exp1[14 * step], 32, 0}, 487 488 {0, "0-N:1/3,1-N:1/3,2-N:1/3", &exp1[8 * step], 32, 0}, 489 {0, "0-31:1/3,1-31:1/3,2-31:1/3", &exp1[8 * step], 32, 0}, 490 {0, "1-10:8/12,8-31:24/29,0-31:0/3", &exp1[9 * step], 32, 0}, 491 492 {0, "all", &exp1[8 * step], 32, 0}, 493 {0, "0, 1, all, ", &exp1[8 * step], 32, 0}, 494 {0, "all:1/2", &exp1[4 * step], 32, 0}, 495 {0, "ALL:1/2", &exp1[4 * step], 32, 0}, 496 {-EINVAL, "al", NULL, 8, 0}, 497 {-EINVAL, "alll", NULL, 8, 0}, 498 499 {-EINVAL, "-1", NULL, 8, 0}, 500 {-EINVAL, "-0", NULL, 8, 0}, 501 {-EINVAL, "10-1", NULL, 8, 0}, 502 {-ERANGE, "8-8", NULL, 8, 0}, 503 {-ERANGE, "0-31", NULL, 8, 0}, 504 {-EINVAL, "0-31:", NULL, 32, 0}, 505 {-EINVAL, "0-31:0", NULL, 32, 0}, 506 {-EINVAL, "0-31:0/", NULL, 32, 0}, 507 {-EINVAL, "0-31:0/0", NULL, 32, 0}, 508 {-EINVAL, "0-31:1/0", NULL, 32, 0}, 509 {-EINVAL, "0-31:10/1", NULL, 32, 0}, 510 {-EOVERFLOW, "0-98765432123456789:10/1", NULL, 8, 0}, 511 512 {-EINVAL, "a-31", NULL, 8, 0}, 513 {-EINVAL, "0-a1", NULL, 8, 0}, 514 {-EINVAL, "a-31:10/1", NULL, 8, 0}, 515 {-EINVAL, "0-31:a/1", NULL, 8, 0}, 516 {-EINVAL, "0-\n", NULL, 8, 0}, 517 518 }; 519 520 static void __init test_bitmap_parselist(void) 521 { 522 int i; 523 int err; 524 ktime_t time; 525 DECLARE_BITMAP(bmap, 2048); 526 527 for (i = 0; i < ARRAY_SIZE(parselist_tests); i++) { 528 #define ptest parselist_tests[i] 529 530 time = ktime_get(); 531 err = bitmap_parselist(ptest.in, bmap, ptest.nbits); 532 time = ktime_get() - time; 533 534 if (err != ptest.errno) { 535 pr_err("parselist: %d: input is %s, errno is %d, expected %d\n", 536 i, ptest.in, err, ptest.errno); 537 failed_tests++; 538 continue; 539 } 540 541 if (!err && ptest.expected 542 && !__bitmap_equal(bmap, ptest.expected, ptest.nbits)) { 543 pr_err("parselist: %d: input is %s, result is 0x%lx, expected 0x%lx\n", 544 i, ptest.in, bmap[0], 545 *ptest.expected); 546 failed_tests++; 547 continue; 548 } 549 550 if (ptest.flags & PARSE_TIME) 551 pr_err("parselist: %d: input is '%s' OK, Time: %llu\n", 552 i, ptest.in, time); 553 554 #undef ptest 555 } 556 } 557 558 static void __init test_bitmap_printlist(void) 559 { 560 unsigned long *bmap = kmalloc(PAGE_SIZE, GFP_KERNEL); 561 char *buf = kmalloc(PAGE_SIZE, GFP_KERNEL); 562 char expected[256]; 563 int ret, slen; 564 ktime_t time; 565 566 if (!buf || !bmap) 567 goto out; 568 569 memset(bmap, -1, PAGE_SIZE); 570 slen = snprintf(expected, 256, "0-%ld", PAGE_SIZE * 8 - 1); 571 if (slen < 0) 572 goto out; 573 574 time = ktime_get(); 575 ret = bitmap_print_to_pagebuf(true, buf, bmap, PAGE_SIZE * 8); 576 time = ktime_get() - time; 577 578 if (ret != slen + 1) { 579 pr_err("bitmap_print_to_pagebuf: result is %d, expected %d\n", ret, slen); 580 failed_tests++; 581 goto out; 582 } 583 584 if (strncmp(buf, expected, slen)) { 585 pr_err("bitmap_print_to_pagebuf: result is %s, expected %s\n", buf, expected); 586 failed_tests++; 587 goto out; 588 } 589 590 pr_err("bitmap_print_to_pagebuf: input is '%s', Time: %llu\n", buf, time); 591 out: 592 kfree(buf); 593 kfree(bmap); 594 } 595 596 static const unsigned long parse_test[] __initconst = { 597 BITMAP_FROM_U64(0), 598 BITMAP_FROM_U64(1), 599 BITMAP_FROM_U64(0xdeadbeef), 600 BITMAP_FROM_U64(0x100000000ULL), 601 }; 602 603 static const unsigned long parse_test2[] __initconst = { 604 BITMAP_FROM_U64(0x100000000ULL), BITMAP_FROM_U64(0xdeadbeef), 605 BITMAP_FROM_U64(0x100000000ULL), BITMAP_FROM_U64(0xbaadf00ddeadbeef), 606 BITMAP_FROM_U64(0x100000000ULL), BITMAP_FROM_U64(0x0badf00ddeadbeef), 607 }; 608 609 static const struct test_bitmap_parselist parse_tests[] __initconst = { 610 {0, "", &parse_test[0 * step], 32, 0}, 611 {0, " ", &parse_test[0 * step], 32, 0}, 612 {0, "0", &parse_test[0 * step], 32, 0}, 613 {0, "0\n", &parse_test[0 * step], 32, 0}, 614 {0, "1", &parse_test[1 * step], 32, 0}, 615 {0, "deadbeef", &parse_test[2 * step], 32, 0}, 616 {0, "1,0", &parse_test[3 * step], 33, 0}, 617 {0, "deadbeef,\n,0,1", &parse_test[2 * step], 96, 0}, 618 619 {0, "deadbeef,1,0", &parse_test2[0 * 2 * step], 96, 0}, 620 {0, "baadf00d,deadbeef,1,0", &parse_test2[1 * 2 * step], 128, 0}, 621 {0, "badf00d,deadbeef,1,0", &parse_test2[2 * 2 * step], 124, 0}, 622 {0, "badf00d,deadbeef,1,0", &parse_test2[2 * 2 * step], 124, NO_LEN}, 623 {0, " badf00d,deadbeef,1,0 ", &parse_test2[2 * 2 * step], 124, 0}, 624 {0, " , badf00d,deadbeef,1,0 , ", &parse_test2[2 * 2 * step], 124, 0}, 625 {0, " , badf00d, ,, ,,deadbeef,1,0 , ", &parse_test2[2 * 2 * step], 124, 0}, 626 627 {-EINVAL, "goodfood,deadbeef,1,0", NULL, 128, 0}, 628 {-EOVERFLOW, "3,0", NULL, 33, 0}, 629 {-EOVERFLOW, "123badf00d,deadbeef,1,0", NULL, 128, 0}, 630 {-EOVERFLOW, "badf00d,deadbeef,1,0", NULL, 90, 0}, 631 {-EOVERFLOW, "fbadf00d,deadbeef,1,0", NULL, 95, 0}, 632 {-EOVERFLOW, "badf00d,deadbeef,1,0", NULL, 100, 0}, 633 #undef step 634 }; 635 636 static void __init test_bitmap_parse(void) 637 { 638 int i; 639 int err; 640 ktime_t time; 641 DECLARE_BITMAP(bmap, 2048); 642 643 for (i = 0; i < ARRAY_SIZE(parse_tests); i++) { 644 struct test_bitmap_parselist test = parse_tests[i]; 645 size_t len = test.flags & NO_LEN ? UINT_MAX : strlen(test.in); 646 647 time = ktime_get(); 648 err = bitmap_parse(test.in, len, bmap, test.nbits); 649 time = ktime_get() - time; 650 651 if (err != test.errno) { 652 pr_err("parse: %d: input is %s, errno is %d, expected %d\n", 653 i, test.in, err, test.errno); 654 failed_tests++; 655 continue; 656 } 657 658 if (!err && test.expected 659 && !__bitmap_equal(bmap, test.expected, test.nbits)) { 660 pr_err("parse: %d: input is %s, result is 0x%lx, expected 0x%lx\n", 661 i, test.in, bmap[0], 662 *test.expected); 663 failed_tests++; 664 continue; 665 } 666 667 if (test.flags & PARSE_TIME) 668 pr_err("parse: %d: input is '%s' OK, Time: %llu\n", 669 i, test.in, time); 670 } 671 } 672 673 static void __init test_bitmap_arr32(void) 674 { 675 unsigned int nbits, next_bit; 676 u32 arr[EXP1_IN_BITS / 32]; 677 DECLARE_BITMAP(bmap2, EXP1_IN_BITS); 678 679 memset(arr, 0xa5, sizeof(arr)); 680 681 for (nbits = 0; nbits < EXP1_IN_BITS; ++nbits) { 682 bitmap_to_arr32(arr, exp1, nbits); 683 bitmap_from_arr32(bmap2, arr, nbits); 684 expect_eq_bitmap(bmap2, exp1, nbits); 685 686 next_bit = find_next_bit(bmap2, 687 round_up(nbits, BITS_PER_LONG), nbits); 688 if (next_bit < round_up(nbits, BITS_PER_LONG)) { 689 pr_err("bitmap_copy_arr32(nbits == %d:" 690 " tail is not safely cleared: %d\n", 691 nbits, next_bit); 692 failed_tests++; 693 } 694 695 if (nbits < EXP1_IN_BITS - 32) 696 expect_eq_uint(arr[DIV_ROUND_UP(nbits, 32)], 697 0xa5a5a5a5); 698 } 699 } 700 701 static void __init test_bitmap_arr64(void) 702 { 703 unsigned int nbits, next_bit; 704 u64 arr[EXP1_IN_BITS / 64]; 705 DECLARE_BITMAP(bmap2, EXP1_IN_BITS); 706 707 memset(arr, 0xa5, sizeof(arr)); 708 709 for (nbits = 0; nbits < EXP1_IN_BITS; ++nbits) { 710 memset(bmap2, 0xff, sizeof(arr)); 711 bitmap_to_arr64(arr, exp1, nbits); 712 bitmap_from_arr64(bmap2, arr, nbits); 713 expect_eq_bitmap(bmap2, exp1, nbits); 714 715 next_bit = find_next_bit(bmap2, round_up(nbits, BITS_PER_LONG), nbits); 716 if (next_bit < round_up(nbits, BITS_PER_LONG)) { 717 pr_err("bitmap_copy_arr64(nbits == %d:" 718 " tail is not safely cleared: %d\n", nbits, next_bit); 719 failed_tests++; 720 } 721 722 if ((nbits % 64) && 723 (arr[(nbits - 1) / 64] & ~GENMASK_ULL((nbits - 1) % 64, 0))) { 724 pr_err("bitmap_to_arr64(nbits == %d): tail is not safely cleared: 0x%016llx (must be 0x%016llx)\n", 725 nbits, arr[(nbits - 1) / 64], 726 GENMASK_ULL((nbits - 1) % 64, 0)); 727 failed_tests++; 728 } 729 730 if (nbits < EXP1_IN_BITS - 64) 731 expect_eq_uint(arr[DIV_ROUND_UP(nbits, 64)], 0xa5a5a5a5); 732 } 733 } 734 735 static void noinline __init test_mem_optimisations(void) 736 { 737 DECLARE_BITMAP(bmap1, 1024); 738 DECLARE_BITMAP(bmap2, 1024); 739 unsigned int start, nbits; 740 741 for (start = 0; start < 1024; start += 8) { 742 for (nbits = 0; nbits < 1024 - start; nbits += 8) { 743 memset(bmap1, 0x5a, sizeof(bmap1)); 744 memset(bmap2, 0x5a, sizeof(bmap2)); 745 746 bitmap_set(bmap1, start, nbits); 747 __bitmap_set(bmap2, start, nbits); 748 if (!bitmap_equal(bmap1, bmap2, 1024)) { 749 printk("set not equal %d %d\n", start, nbits); 750 failed_tests++; 751 } 752 if (!__bitmap_equal(bmap1, bmap2, 1024)) { 753 printk("set not __equal %d %d\n", start, nbits); 754 failed_tests++; 755 } 756 757 bitmap_clear(bmap1, start, nbits); 758 __bitmap_clear(bmap2, start, nbits); 759 if (!bitmap_equal(bmap1, bmap2, 1024)) { 760 printk("clear not equal %d %d\n", start, nbits); 761 failed_tests++; 762 } 763 if (!__bitmap_equal(bmap1, bmap2, 1024)) { 764 printk("clear not __equal %d %d\n", start, 765 nbits); 766 failed_tests++; 767 } 768 } 769 } 770 } 771 772 static const unsigned char clump_exp[] __initconst = { 773 0x01, /* 1 bit set */ 774 0x02, /* non-edge 1 bit set */ 775 0x00, /* zero bits set */ 776 0x38, /* 3 bits set across 4-bit boundary */ 777 0x38, /* Repeated clump */ 778 0x0F, /* 4 bits set */ 779 0xFF, /* all bits set */ 780 0x05, /* non-adjacent 2 bits set */ 781 }; 782 783 static void __init test_for_each_set_clump8(void) 784 { 785 #define CLUMP_EXP_NUMBITS 64 786 DECLARE_BITMAP(bits, CLUMP_EXP_NUMBITS); 787 unsigned int start; 788 unsigned long clump; 789 790 /* set bitmap to test case */ 791 bitmap_zero(bits, CLUMP_EXP_NUMBITS); 792 bitmap_set(bits, 0, 1); /* 0x01 */ 793 bitmap_set(bits, 9, 1); /* 0x02 */ 794 bitmap_set(bits, 27, 3); /* 0x28 */ 795 bitmap_set(bits, 35, 3); /* 0x28 */ 796 bitmap_set(bits, 40, 4); /* 0x0F */ 797 bitmap_set(bits, 48, 8); /* 0xFF */ 798 bitmap_set(bits, 56, 1); /* 0x05 - part 1 */ 799 bitmap_set(bits, 58, 1); /* 0x05 - part 2 */ 800 801 for_each_set_clump8(start, clump, bits, CLUMP_EXP_NUMBITS) 802 expect_eq_clump8(start, CLUMP_EXP_NUMBITS, clump_exp, &clump); 803 } 804 805 static void __init test_for_each_set_bit_wrap(void) 806 { 807 DECLARE_BITMAP(orig, 500); 808 DECLARE_BITMAP(copy, 500); 809 unsigned int wr, bit; 810 811 bitmap_zero(orig, 500); 812 813 /* Set individual bits */ 814 for (bit = 0; bit < 500; bit += 10) 815 bitmap_set(orig, bit, 1); 816 817 /* Set range of bits */ 818 bitmap_set(orig, 100, 50); 819 820 for (wr = 0; wr < 500; wr++) { 821 bitmap_zero(copy, 500); 822 823 for_each_set_bit_wrap(bit, orig, 500, wr) 824 bitmap_set(copy, bit, 1); 825 826 expect_eq_bitmap(orig, copy, 500); 827 } 828 } 829 830 static void __init test_for_each_set_bit(void) 831 { 832 DECLARE_BITMAP(orig, 500); 833 DECLARE_BITMAP(copy, 500); 834 unsigned int bit; 835 836 bitmap_zero(orig, 500); 837 bitmap_zero(copy, 500); 838 839 /* Set individual bits */ 840 for (bit = 0; bit < 500; bit += 10) 841 bitmap_set(orig, bit, 1); 842 843 /* Set range of bits */ 844 bitmap_set(orig, 100, 50); 845 846 for_each_set_bit(bit, orig, 500) 847 bitmap_set(copy, bit, 1); 848 849 expect_eq_bitmap(orig, copy, 500); 850 } 851 852 static void __init test_for_each_set_bit_from(void) 853 { 854 DECLARE_BITMAP(orig, 500); 855 DECLARE_BITMAP(copy, 500); 856 unsigned int wr, bit; 857 858 bitmap_zero(orig, 500); 859 860 /* Set individual bits */ 861 for (bit = 0; bit < 500; bit += 10) 862 bitmap_set(orig, bit, 1); 863 864 /* Set range of bits */ 865 bitmap_set(orig, 100, 50); 866 867 for (wr = 0; wr < 500; wr++) { 868 DECLARE_BITMAP(tmp, 500); 869 870 bitmap_zero(copy, 500); 871 bit = wr; 872 873 for_each_set_bit_from(bit, orig, 500) 874 bitmap_set(copy, bit, 1); 875 876 bitmap_copy(tmp, orig, 500); 877 bitmap_clear(tmp, 0, wr); 878 expect_eq_bitmap(tmp, copy, 500); 879 } 880 } 881 882 static void __init test_for_each_clear_bit(void) 883 { 884 DECLARE_BITMAP(orig, 500); 885 DECLARE_BITMAP(copy, 500); 886 unsigned int bit; 887 888 bitmap_fill(orig, 500); 889 bitmap_fill(copy, 500); 890 891 /* Set individual bits */ 892 for (bit = 0; bit < 500; bit += 10) 893 bitmap_clear(orig, bit, 1); 894 895 /* Set range of bits */ 896 bitmap_clear(orig, 100, 50); 897 898 for_each_clear_bit(bit, orig, 500) 899 bitmap_clear(copy, bit, 1); 900 901 expect_eq_bitmap(orig, copy, 500); 902 } 903 904 static void __init test_for_each_clear_bit_from(void) 905 { 906 DECLARE_BITMAP(orig, 500); 907 DECLARE_BITMAP(copy, 500); 908 unsigned int wr, bit; 909 910 bitmap_fill(orig, 500); 911 912 /* Set individual bits */ 913 for (bit = 0; bit < 500; bit += 10) 914 bitmap_clear(orig, bit, 1); 915 916 /* Set range of bits */ 917 bitmap_clear(orig, 100, 50); 918 919 for (wr = 0; wr < 500; wr++) { 920 DECLARE_BITMAP(tmp, 500); 921 922 bitmap_fill(copy, 500); 923 bit = wr; 924 925 for_each_clear_bit_from(bit, orig, 500) 926 bitmap_clear(copy, bit, 1); 927 928 bitmap_copy(tmp, orig, 500); 929 bitmap_set(tmp, 0, wr); 930 expect_eq_bitmap(tmp, copy, 500); 931 } 932 } 933 934 static void __init test_for_each_set_bitrange(void) 935 { 936 DECLARE_BITMAP(orig, 500); 937 DECLARE_BITMAP(copy, 500); 938 unsigned int s, e; 939 940 bitmap_zero(orig, 500); 941 bitmap_zero(copy, 500); 942 943 /* Set individual bits */ 944 for (s = 0; s < 500; s += 10) 945 bitmap_set(orig, s, 1); 946 947 /* Set range of bits */ 948 bitmap_set(orig, 100, 50); 949 950 for_each_set_bitrange(s, e, orig, 500) 951 bitmap_set(copy, s, e-s); 952 953 expect_eq_bitmap(orig, copy, 500); 954 } 955 956 static void __init test_for_each_clear_bitrange(void) 957 { 958 DECLARE_BITMAP(orig, 500); 959 DECLARE_BITMAP(copy, 500); 960 unsigned int s, e; 961 962 bitmap_fill(orig, 500); 963 bitmap_fill(copy, 500); 964 965 /* Set individual bits */ 966 for (s = 0; s < 500; s += 10) 967 bitmap_clear(orig, s, 1); 968 969 /* Set range of bits */ 970 bitmap_clear(orig, 100, 50); 971 972 for_each_clear_bitrange(s, e, orig, 500) 973 bitmap_clear(copy, s, e-s); 974 975 expect_eq_bitmap(orig, copy, 500); 976 } 977 978 static void __init test_for_each_set_bitrange_from(void) 979 { 980 DECLARE_BITMAP(orig, 500); 981 DECLARE_BITMAP(copy, 500); 982 unsigned int wr, s, e; 983 984 bitmap_zero(orig, 500); 985 986 /* Set individual bits */ 987 for (s = 0; s < 500; s += 10) 988 bitmap_set(orig, s, 1); 989 990 /* Set range of bits */ 991 bitmap_set(orig, 100, 50); 992 993 for (wr = 0; wr < 500; wr++) { 994 DECLARE_BITMAP(tmp, 500); 995 996 bitmap_zero(copy, 500); 997 s = wr; 998 999 for_each_set_bitrange_from(s, e, orig, 500) 1000 bitmap_set(copy, s, e - s); 1001 1002 bitmap_copy(tmp, orig, 500); 1003 bitmap_clear(tmp, 0, wr); 1004 expect_eq_bitmap(tmp, copy, 500); 1005 } 1006 } 1007 1008 static void __init test_for_each_clear_bitrange_from(void) 1009 { 1010 DECLARE_BITMAP(orig, 500); 1011 DECLARE_BITMAP(copy, 500); 1012 unsigned int wr, s, e; 1013 1014 bitmap_fill(orig, 500); 1015 1016 /* Set individual bits */ 1017 for (s = 0; s < 500; s += 10) 1018 bitmap_clear(orig, s, 1); 1019 1020 /* Set range of bits */ 1021 bitmap_set(orig, 100, 50); 1022 1023 for (wr = 0; wr < 500; wr++) { 1024 DECLARE_BITMAP(tmp, 500); 1025 1026 bitmap_fill(copy, 500); 1027 s = wr; 1028 1029 for_each_clear_bitrange_from(s, e, orig, 500) 1030 bitmap_clear(copy, s, e - s); 1031 1032 bitmap_copy(tmp, orig, 500); 1033 bitmap_set(tmp, 0, wr); 1034 expect_eq_bitmap(tmp, copy, 500); 1035 } 1036 } 1037 1038 struct test_bitmap_cut { 1039 unsigned int first; 1040 unsigned int cut; 1041 unsigned int nbits; 1042 unsigned long in[4]; 1043 unsigned long expected[4]; 1044 }; 1045 1046 static struct test_bitmap_cut test_cut[] = { 1047 { 0, 0, 8, { 0x0000000aUL, }, { 0x0000000aUL, }, }, 1048 { 0, 0, 32, { 0xdadadeadUL, }, { 0xdadadeadUL, }, }, 1049 { 0, 3, 8, { 0x000000aaUL, }, { 0x00000015UL, }, }, 1050 { 3, 3, 8, { 0x000000aaUL, }, { 0x00000012UL, }, }, 1051 { 0, 1, 32, { 0xa5a5a5a5UL, }, { 0x52d2d2d2UL, }, }, 1052 { 0, 8, 32, { 0xdeadc0deUL, }, { 0x00deadc0UL, }, }, 1053 { 1, 1, 32, { 0x5a5a5a5aUL, }, { 0x2d2d2d2cUL, }, }, 1054 { 0, 15, 32, { 0xa5a5a5a5UL, }, { 0x00014b4bUL, }, }, 1055 { 0, 16, 32, { 0xa5a5a5a5UL, }, { 0x0000a5a5UL, }, }, 1056 { 15, 15, 32, { 0xa5a5a5a5UL, }, { 0x000125a5UL, }, }, 1057 { 15, 16, 32, { 0xa5a5a5a5UL, }, { 0x0000a5a5UL, }, }, 1058 { 16, 15, 32, { 0xa5a5a5a5UL, }, { 0x0001a5a5UL, }, }, 1059 1060 { BITS_PER_LONG, BITS_PER_LONG, BITS_PER_LONG, 1061 { 0xa5a5a5a5UL, 0xa5a5a5a5UL, }, 1062 { 0xa5a5a5a5UL, 0xa5a5a5a5UL, }, 1063 }, 1064 { 1, BITS_PER_LONG - 1, BITS_PER_LONG, 1065 { 0xa5a5a5a5UL, 0xa5a5a5a5UL, }, 1066 { 0x00000001UL, 0x00000001UL, }, 1067 }, 1068 1069 { 0, BITS_PER_LONG * 2, BITS_PER_LONG * 2 + 1, 1070 { 0xa5a5a5a5UL, 0x00000001UL, 0x00000001UL, 0x00000001UL }, 1071 { 0x00000001UL, }, 1072 }, 1073 { 16, BITS_PER_LONG * 2 + 1, BITS_PER_LONG * 2 + 1 + 16, 1074 { 0x0000ffffUL, 0x5a5a5a5aUL, 0x5a5a5a5aUL, 0x5a5a5a5aUL }, 1075 { 0x2d2dffffUL, }, 1076 }, 1077 }; 1078 1079 static void __init test_bitmap_cut(void) 1080 { 1081 unsigned long b[5], *in = &b[1], *out = &b[0]; /* Partial overlap */ 1082 int i; 1083 1084 for (i = 0; i < ARRAY_SIZE(test_cut); i++) { 1085 struct test_bitmap_cut *t = &test_cut[i]; 1086 1087 memcpy(in, t->in, sizeof(t->in)); 1088 1089 bitmap_cut(out, in, t->first, t->cut, t->nbits); 1090 1091 expect_eq_bitmap(t->expected, out, t->nbits); 1092 } 1093 } 1094 1095 struct test_bitmap_print { 1096 const unsigned long *bitmap; 1097 unsigned long nbits; 1098 const char *mask; 1099 const char *list; 1100 }; 1101 1102 static const unsigned long small_bitmap[] __initconst = { 1103 BITMAP_FROM_U64(0x3333333311111111ULL), 1104 }; 1105 1106 static const char small_mask[] __initconst = "33333333,11111111\n"; 1107 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"; 1108 1109 static const unsigned long large_bitmap[] __initconst = { 1110 BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL), 1111 BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL), 1112 BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL), 1113 BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL), 1114 BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL), 1115 BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL), 1116 BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL), 1117 BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL), 1118 BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL), 1119 BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL), 1120 BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL), 1121 BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL), 1122 BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL), 1123 BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL), 1124 BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL), 1125 BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL), 1126 BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL), 1127 BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL), 1128 BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL), 1129 BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL), 1130 }; 1131 1132 static const char large_mask[] __initconst = "33333333,11111111,33333333,11111111," 1133 "33333333,11111111,33333333,11111111," 1134 "33333333,11111111,33333333,11111111," 1135 "33333333,11111111,33333333,11111111," 1136 "33333333,11111111,33333333,11111111," 1137 "33333333,11111111,33333333,11111111," 1138 "33333333,11111111,33333333,11111111," 1139 "33333333,11111111,33333333,11111111," 1140 "33333333,11111111,33333333,11111111," 1141 "33333333,11111111,33333333,11111111," 1142 "33333333,11111111,33333333,11111111," 1143 "33333333,11111111,33333333,11111111," 1144 "33333333,11111111,33333333,11111111," 1145 "33333333,11111111,33333333,11111111," 1146 "33333333,11111111,33333333,11111111," 1147 "33333333,11111111,33333333,11111111," 1148 "33333333,11111111,33333333,11111111," 1149 "33333333,11111111,33333333,11111111," 1150 "33333333,11111111,33333333,11111111," 1151 "33333333,11111111,33333333,11111111\n"; 1152 1153 static const char large_list[] __initconst = /* more than 4KB */ 1154 "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" 1155 "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" 1156 "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" 1157 "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" 1158 "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" 1159 "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" 1160 "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" 1161 "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" 1162 "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" 1163 "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" 1164 "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" 1165 "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" 1166 "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-" 1167 "1001,1004-1005,1008-1009,1012-1013,1016-1017,1020-1021,1024,1028,1032,1036,1040,1044,1048,1052,1056-1057,1060-10" 1168 "61,1064-1065,1068-1069,1072-1073,1076-1077,1080-1081,1084-1085,1088,1092,1096,1100,1104,1108,1112,1116,1120-1121" 1169 ",1124-1125,1128-1129,1132-1133,1136-1137,1140-1141,1144-1145,1148-1149,1152,1156,1160,1164,1168,1172,1176,1180,1" 1170 "184-1185,1188-1189,1192-1193,1196-1197,1200-1201,1204-1205,1208-1209,1212-1213,1216,1220,1224,1228,1232,1236,124" 1171 "0,1244,1248-1249,1252-1253,1256-1257,1260-1261,1264-1265,1268-1269,1272-1273,1276-1277,1280,1284,1288,1292,1296," 1172 "1300,1304,1308,1312-1313,1316-1317,1320-1321,1324-1325,1328-1329,1332-1333,1336-1337,1340-1341,1344,1348,1352,13" 1173 "56,1360,1364,1368,1372,1376-1377,1380-1381,1384-1385,1388-1389,1392-1393,1396-1397,1400-1401,1404-1405,1408,1412" 1174 ",1416,1420,1424,1428,1432,1436,1440-1441,1444-1445,1448-1449,1452-1453,1456-1457,1460-1461,1464-1465,1468-1469,1" 1175 "472,1476,1480,1484,1488,1492,1496,1500,1504-1505,1508-1509,1512-1513,1516-1517,1520-1521,1524-1525,1528-1529,153" 1176 "2-1533,1536,1540,1544,1548,1552,1556,1560,1564,1568-1569,1572-1573,1576-1577,1580-1581,1584-1585,1588-1589,1592-" 1177 "1593,1596-1597,1600,1604,1608,1612,1616,1620,1624,1628,1632-1633,1636-1637,1640-1641,1644-1645,1648-1649,1652-16" 1178 "53,1656-1657,1660-1661,1664,1668,1672,1676,1680,1684,1688,1692,1696-1697,1700-1701,1704-1705,1708-1709,1712-1713" 1179 ",1716-1717,1720-1721,1724-1725,1728,1732,1736,1740,1744,1748,1752,1756,1760-1761,1764-1765,1768-1769,1772-1773,1" 1180 "776-1777,1780-1781,1784-1785,1788-1789,1792,1796,1800,1804,1808,1812,1816,1820,1824-1825,1828-1829,1832-1833,183" 1181 "6-1837,1840-1841,1844-1845,1848-1849,1852-1853,1856,1860,1864,1868,1872,1876,1880,1884,1888-1889,1892-1893,1896-" 1182 "1897,1900-1901,1904-1905,1908-1909,1912-1913,1916-1917,1920,1924,1928,1932,1936,1940,1944,1948,1952-1953,1956-19" 1183 "57,1960-1961,1964-1965,1968-1969,1972-1973,1976-1977,1980-1981,1984,1988,1992,1996,2000,2004,2008,2012,2016-2017" 1184 ",2020-2021,2024-2025,2028-2029,2032-2033,2036-2037,2040-2041,2044-2045,2048,2052,2056,2060,2064,2068,2072,2076,2" 1185 "080-2081,2084-2085,2088-2089,2092-2093,2096-2097,2100-2101,2104-2105,2108-2109,2112,2116,2120,2124,2128,2132,213" 1186 "6,2140,2144-2145,2148-2149,2152-2153,2156-2157,2160-2161,2164-2165,2168-2169,2172-2173,2176,2180,2184,2188,2192," 1187 "2196,2200,2204,2208-2209,2212-2213,2216-2217,2220-2221,2224-2225,2228-2229,2232-2233,2236-2237,2240,2244,2248,22" 1188 "52,2256,2260,2264,2268,2272-2273,2276-2277,2280-2281,2284-2285,2288-2289,2292-2293,2296-2297,2300-2301,2304,2308" 1189 ",2312,2316,2320,2324,2328,2332,2336-2337,2340-2341,2344-2345,2348-2349,2352-2353,2356-2357,2360-2361,2364-2365,2" 1190 "368,2372,2376,2380,2384,2388,2392,2396,2400-2401,2404-2405,2408-2409,2412-2413,2416-2417,2420-2421,2424-2425,242" 1191 "8-2429,2432,2436,2440,2444,2448,2452,2456,2460,2464-2465,2468-2469,2472-2473,2476-2477,2480-2481,2484-2485,2488-" 1192 "2489,2492-2493,2496,2500,2504,2508,2512,2516,2520,2524,2528-2529,2532-2533,2536-2537,2540-2541,2544-2545,2548-25" 1193 "49,2552-2553,2556-2557\n"; 1194 1195 static const struct test_bitmap_print test_print[] __initconst = { 1196 { small_bitmap, sizeof(small_bitmap) * BITS_PER_BYTE, small_mask, small_list }, 1197 { large_bitmap, sizeof(large_bitmap) * BITS_PER_BYTE, large_mask, large_list }, 1198 }; 1199 1200 static void __init test_bitmap_print_buf(void) 1201 { 1202 int i; 1203 1204 for (i = 0; i < ARRAY_SIZE(test_print); i++) { 1205 const struct test_bitmap_print *t = &test_print[i]; 1206 int n; 1207 1208 n = bitmap_print_bitmask_to_buf(print_buf, t->bitmap, t->nbits, 1209 0, 2 * PAGE_SIZE); 1210 expect_eq_uint(strlen(t->mask) + 1, n); 1211 expect_eq_str(t->mask, print_buf, n); 1212 1213 n = bitmap_print_list_to_buf(print_buf, t->bitmap, t->nbits, 1214 0, 2 * PAGE_SIZE); 1215 expect_eq_uint(strlen(t->list) + 1, n); 1216 expect_eq_str(t->list, print_buf, n); 1217 1218 /* test by non-zero offset */ 1219 if (strlen(t->list) > PAGE_SIZE) { 1220 n = bitmap_print_list_to_buf(print_buf, t->bitmap, t->nbits, 1221 PAGE_SIZE, PAGE_SIZE); 1222 expect_eq_uint(strlen(t->list) + 1 - PAGE_SIZE, n); 1223 expect_eq_str(t->list + PAGE_SIZE, print_buf, n); 1224 } 1225 } 1226 } 1227 1228 /* 1229 * FIXME: Clang breaks compile-time evaluations when KASAN and GCOV are enabled. 1230 * To workaround it, GCOV is force-disabled in Makefile for this configuration. 1231 */ 1232 static void __init test_bitmap_const_eval(void) 1233 { 1234 DECLARE_BITMAP(bitmap, BITS_PER_LONG); 1235 unsigned long initvar = BIT(2); 1236 unsigned long bitopvar = 0; 1237 unsigned long var = 0; 1238 int res; 1239 1240 /* 1241 * Compilers must be able to optimize all of those to compile-time 1242 * constants on any supported optimization level (-O2, -Os) and any 1243 * architecture. Otherwise, trigger a build bug. 1244 * The whole function gets optimized out then, there's nothing to do 1245 * in runtime. 1246 */ 1247 1248 /* 1249 * Equals to `unsigned long bitmap[1] = { GENMASK(6, 5), }`. 1250 * Clang on s390 optimizes bitops at compile-time as intended, but at 1251 * the same time stops treating @bitmap and @bitopvar as compile-time 1252 * constants after regular test_bit() is executed, thus triggering the 1253 * build bugs below. So, call const_test_bit() there directly until 1254 * the compiler is fixed. 1255 */ 1256 bitmap_clear(bitmap, 0, BITS_PER_LONG); 1257 if (!test_bit(7, bitmap)) 1258 bitmap_set(bitmap, 5, 2); 1259 1260 /* Equals to `unsigned long bitopvar = BIT(20)` */ 1261 __change_bit(31, &bitopvar); 1262 bitmap_shift_right(&bitopvar, &bitopvar, 11, BITS_PER_LONG); 1263 1264 /* Equals to `unsigned long var = BIT(25)` */ 1265 var |= BIT(25); 1266 if (var & BIT(0)) 1267 var ^= GENMASK(9, 6); 1268 1269 /* __const_hweight<32|64>(GENMASK(6, 5)) == 2 */ 1270 res = bitmap_weight(bitmap, 20); 1271 BUILD_BUG_ON(!__builtin_constant_p(res)); 1272 BUILD_BUG_ON(res != 2); 1273 1274 /* !(BIT(31) & BIT(18)) == 1 */ 1275 res = !test_bit(18, &bitopvar); 1276 BUILD_BUG_ON(!__builtin_constant_p(res)); 1277 BUILD_BUG_ON(!res); 1278 1279 /* BIT(2) & GENMASK(14, 8) == 0 */ 1280 res = initvar & GENMASK(14, 8); 1281 BUILD_BUG_ON(!__builtin_constant_p(res)); 1282 BUILD_BUG_ON(res); 1283 1284 /* ~BIT(25) */ 1285 BUILD_BUG_ON(!__builtin_constant_p(~var)); 1286 BUILD_BUG_ON(~var != ~BIT(25)); 1287 } 1288 1289 static void __init selftest(void) 1290 { 1291 test_zero_clear(); 1292 test_fill_set(); 1293 test_copy(); 1294 test_bitmap_region(); 1295 test_replace(); 1296 test_bitmap_sg(); 1297 test_bitmap_arr32(); 1298 test_bitmap_arr64(); 1299 test_bitmap_parse(); 1300 test_bitmap_parselist(); 1301 test_bitmap_printlist(); 1302 test_mem_optimisations(); 1303 test_bitmap_cut(); 1304 test_bitmap_print_buf(); 1305 test_bitmap_const_eval(); 1306 1307 test_find_nth_bit(); 1308 test_for_each_set_bit(); 1309 test_for_each_set_bit_from(); 1310 test_for_each_clear_bit(); 1311 test_for_each_clear_bit_from(); 1312 test_for_each_set_bitrange(); 1313 test_for_each_clear_bitrange(); 1314 test_for_each_set_bitrange_from(); 1315 test_for_each_clear_bitrange_from(); 1316 test_for_each_set_clump8(); 1317 test_for_each_set_bit_wrap(); 1318 } 1319 1320 KSTM_MODULE_LOADERS(test_bitmap); 1321 MODULE_AUTHOR("david decotigny <david.decotigny@googlers.com>"); 1322 MODULE_LICENSE("GPL"); 1323