1 // SPDX-License-Identifier: GPL-2.0+ 2 /* 3 * test_maple_tree.c: Test the maple tree API 4 * Copyright (c) 2018-2022 Oracle Corporation 5 * Author: Liam R. Howlett <Liam.Howlett@Oracle.com> 6 * 7 * Any tests that only require the interface of the tree. 8 */ 9 10 #include <linux/maple_tree.h> 11 #include <linux/module.h> 12 #include <linux/rwsem.h> 13 14 #define MTREE_ALLOC_MAX 0x2000000000000Ul 15 #define CONFIG_MAPLE_SEARCH 16 #define MAPLE_32BIT (MAPLE_NODE_SLOTS > 31) 17 18 #ifndef CONFIG_DEBUG_MAPLE_TREE 19 #define mt_dump(mt, fmt) do {} while (0) 20 #define mt_validate(mt) do {} while (0) 21 #define mt_cache_shrink() do {} while (0) 22 #define mas_dump(mas) do {} while (0) 23 #define mas_wr_dump(mas) do {} while (0) 24 atomic_t maple_tree_tests_run; 25 atomic_t maple_tree_tests_passed; 26 #undef MT_BUG_ON 27 28 #define MT_BUG_ON(__tree, __x) do { \ 29 atomic_inc(&maple_tree_tests_run); \ 30 if (__x) { \ 31 pr_info("BUG at %s:%d (%u)\n", \ 32 __func__, __LINE__, __x); \ 33 pr_info("Pass: %u Run:%u\n", \ 34 atomic_read(&maple_tree_tests_passed), \ 35 atomic_read(&maple_tree_tests_run)); \ 36 } else { \ 37 atomic_inc(&maple_tree_tests_passed); \ 38 } \ 39 } while (0) 40 #endif 41 42 /* #define BENCH_SLOT_STORE */ 43 /* #define BENCH_NODE_STORE */ 44 /* #define BENCH_AWALK */ 45 /* #define BENCH_WALK */ 46 /* #define BENCH_LOAD */ 47 /* #define BENCH_MT_FOR_EACH */ 48 /* #define BENCH_FORK */ 49 /* #define BENCH_MAS_FOR_EACH */ 50 /* #define BENCH_MAS_PREV */ 51 52 #ifdef __KERNEL__ 53 #define mt_set_non_kernel(x) do {} while (0) 54 #define mt_zero_nr_tallocated(x) do {} while (0) 55 #else 56 #define cond_resched() do {} while (0) 57 #endif 58 59 #define mas_is_none(x) ((x)->status == ma_none) 60 #define mas_is_overflow(x) ((x)->status == ma_overflow) 61 #define mas_is_underflow(x) ((x)->status == ma_underflow) 62 63 static int __init mtree_insert_index(struct maple_tree *mt, 64 unsigned long index, gfp_t gfp) 65 { 66 return mtree_insert(mt, index, xa_mk_value(index & LONG_MAX), gfp); 67 } 68 69 static void __init mtree_erase_index(struct maple_tree *mt, unsigned long index) 70 { 71 MT_BUG_ON(mt, mtree_erase(mt, index) != xa_mk_value(index & LONG_MAX)); 72 MT_BUG_ON(mt, mtree_load(mt, index) != NULL); 73 } 74 75 static int __init mtree_test_insert(struct maple_tree *mt, unsigned long index, 76 void *ptr) 77 { 78 return mtree_insert(mt, index, ptr, GFP_KERNEL); 79 } 80 81 static int __init mtree_test_store_range(struct maple_tree *mt, 82 unsigned long start, unsigned long end, void *ptr) 83 { 84 return mtree_store_range(mt, start, end, ptr, GFP_KERNEL); 85 } 86 87 static int __init mtree_test_store(struct maple_tree *mt, unsigned long start, 88 void *ptr) 89 { 90 return mtree_test_store_range(mt, start, start, ptr); 91 } 92 93 static int __init mtree_test_insert_range(struct maple_tree *mt, 94 unsigned long start, unsigned long end, void *ptr) 95 { 96 return mtree_insert_range(mt, start, end, ptr, GFP_KERNEL); 97 } 98 99 static void __init *mtree_test_load(struct maple_tree *mt, unsigned long index) 100 { 101 return mtree_load(mt, index); 102 } 103 104 static void __init *mtree_test_erase(struct maple_tree *mt, unsigned long index) 105 { 106 return mtree_erase(mt, index); 107 } 108 109 #if defined(CONFIG_64BIT) 110 static noinline void __init check_mtree_alloc_range(struct maple_tree *mt, 111 unsigned long start, unsigned long end, unsigned long size, 112 unsigned long expected, int eret, void *ptr) 113 { 114 115 unsigned long result = expected + 1; 116 int ret; 117 118 ret = mtree_alloc_range(mt, &result, ptr, size, start, end, 119 GFP_KERNEL); 120 MT_BUG_ON(mt, ret != eret); 121 if (ret) 122 return; 123 124 MT_BUG_ON(mt, result != expected); 125 } 126 127 static noinline void __init check_mtree_alloc_rrange(struct maple_tree *mt, 128 unsigned long start, unsigned long end, unsigned long size, 129 unsigned long expected, int eret, void *ptr) 130 { 131 132 unsigned long result = expected + 1; 133 int ret; 134 135 ret = mtree_alloc_rrange(mt, &result, ptr, size, start, end, 136 GFP_KERNEL); 137 MT_BUG_ON(mt, ret != eret); 138 if (ret) 139 return; 140 141 MT_BUG_ON(mt, result != expected); 142 } 143 #endif 144 145 static noinline void __init check_load(struct maple_tree *mt, 146 unsigned long index, void *ptr) 147 { 148 void *ret = mtree_test_load(mt, index); 149 150 if (ret != ptr) 151 pr_err("Load %lu returned %p expect %p\n", index, ret, ptr); 152 MT_BUG_ON(mt, ret != ptr); 153 } 154 155 static noinline void __init check_store_range(struct maple_tree *mt, 156 unsigned long start, unsigned long end, void *ptr, int expected) 157 { 158 int ret = -EINVAL; 159 unsigned long i; 160 161 ret = mtree_test_store_range(mt, start, end, ptr); 162 MT_BUG_ON(mt, ret != expected); 163 164 if (ret) 165 return; 166 167 for (i = start; i <= end; i++) 168 check_load(mt, i, ptr); 169 } 170 171 static noinline void __init check_insert_range(struct maple_tree *mt, 172 unsigned long start, unsigned long end, void *ptr, int expected) 173 { 174 int ret = -EINVAL; 175 unsigned long i; 176 177 ret = mtree_test_insert_range(mt, start, end, ptr); 178 MT_BUG_ON(mt, ret != expected); 179 180 if (ret) 181 return; 182 183 for (i = start; i <= end; i++) 184 check_load(mt, i, ptr); 185 } 186 187 static noinline void __init check_insert(struct maple_tree *mt, 188 unsigned long index, void *ptr) 189 { 190 int ret = -EINVAL; 191 192 ret = mtree_test_insert(mt, index, ptr); 193 MT_BUG_ON(mt, ret != 0); 194 } 195 196 static noinline void __init check_dup_insert(struct maple_tree *mt, 197 unsigned long index, void *ptr) 198 { 199 int ret = -EINVAL; 200 201 ret = mtree_test_insert(mt, index, ptr); 202 MT_BUG_ON(mt, ret != -EEXIST); 203 } 204 205 206 static noinline void __init check_index_load(struct maple_tree *mt, 207 unsigned long index) 208 { 209 return check_load(mt, index, xa_mk_value(index & LONG_MAX)); 210 } 211 212 static inline __init int not_empty(struct maple_node *node) 213 { 214 int i; 215 216 if (node->parent) 217 return 1; 218 219 for (i = 0; i < ARRAY_SIZE(node->slot); i++) 220 if (node->slot[i]) 221 return 1; 222 223 return 0; 224 } 225 226 227 static noinline void __init check_rev_seq(struct maple_tree *mt, 228 unsigned long max, bool verbose) 229 { 230 unsigned long i = max, j; 231 232 MT_BUG_ON(mt, !mtree_empty(mt)); 233 234 mt_zero_nr_tallocated(); 235 while (i) { 236 MT_BUG_ON(mt, mtree_insert_index(mt, i, GFP_KERNEL)); 237 for (j = i; j <= max; j++) 238 check_index_load(mt, j); 239 240 check_load(mt, i - 1, NULL); 241 mt_set_in_rcu(mt); 242 MT_BUG_ON(mt, !mt_height(mt)); 243 mt_clear_in_rcu(mt); 244 MT_BUG_ON(mt, !mt_height(mt)); 245 i--; 246 } 247 check_load(mt, max + 1, NULL); 248 249 #ifndef __KERNEL__ 250 if (verbose) { 251 rcu_barrier(); 252 mt_dump(mt, mt_dump_dec); 253 pr_info(" %s test of 0-%lu %luK in %d active (%d total)\n", 254 __func__, max, mt_get_alloc_size()/1024, mt_nr_allocated(), 255 mt_nr_tallocated()); 256 } 257 #endif 258 } 259 260 static noinline void __init check_seq(struct maple_tree *mt, unsigned long max, 261 bool verbose) 262 { 263 unsigned long i, j; 264 265 MT_BUG_ON(mt, !mtree_empty(mt)); 266 267 mt_zero_nr_tallocated(); 268 for (i = 0; i <= max; i++) { 269 MT_BUG_ON(mt, mtree_insert_index(mt, i, GFP_KERNEL)); 270 for (j = 0; j <= i; j++) 271 check_index_load(mt, j); 272 273 if (i) 274 MT_BUG_ON(mt, !mt_height(mt)); 275 check_load(mt, i + 1, NULL); 276 } 277 278 #ifndef __KERNEL__ 279 if (verbose) { 280 rcu_barrier(); 281 mt_dump(mt, mt_dump_dec); 282 pr_info(" seq test of 0-%lu %luK in %d active (%d total)\n", 283 max, mt_get_alloc_size()/1024, mt_nr_allocated(), 284 mt_nr_tallocated()); 285 } 286 #endif 287 } 288 289 static noinline void __init check_lb_not_empty(struct maple_tree *mt) 290 { 291 unsigned long i, j; 292 unsigned long huge = 4000UL * 1000 * 1000; 293 294 295 i = huge; 296 while (i > 4096) { 297 check_insert(mt, i, (void *) i); 298 for (j = huge; j >= i; j /= 2) { 299 check_load(mt, j-1, NULL); 300 check_load(mt, j, (void *) j); 301 check_load(mt, j+1, NULL); 302 } 303 i /= 2; 304 } 305 mtree_destroy(mt); 306 } 307 308 static noinline void __init check_lower_bound_split(struct maple_tree *mt) 309 { 310 MT_BUG_ON(mt, !mtree_empty(mt)); 311 check_lb_not_empty(mt); 312 } 313 314 static noinline void __init check_upper_bound_split(struct maple_tree *mt) 315 { 316 unsigned long i, j; 317 unsigned long huge; 318 319 MT_BUG_ON(mt, !mtree_empty(mt)); 320 321 if (MAPLE_32BIT) 322 huge = 2147483647UL; 323 else 324 huge = 4000UL * 1000 * 1000; 325 326 i = 4096; 327 while (i < huge) { 328 check_insert(mt, i, (void *) i); 329 for (j = i; j >= huge; j *= 2) { 330 check_load(mt, j-1, NULL); 331 check_load(mt, j, (void *) j); 332 check_load(mt, j+1, NULL); 333 } 334 i *= 2; 335 } 336 mtree_destroy(mt); 337 } 338 339 static noinline void __init check_mid_split(struct maple_tree *mt) 340 { 341 unsigned long huge = 8000UL * 1000 * 1000; 342 343 check_insert(mt, huge, (void *) huge); 344 check_insert(mt, 0, xa_mk_value(0)); 345 check_lb_not_empty(mt); 346 } 347 348 static noinline void __init check_rev_find(struct maple_tree *mt) 349 { 350 int i, nr_entries = 200; 351 void *val; 352 MA_STATE(mas, mt, 0, 0); 353 354 for (i = 0; i <= nr_entries; i++) 355 mtree_store_range(mt, i*10, i*10 + 5, 356 xa_mk_value(i), GFP_KERNEL); 357 358 rcu_read_lock(); 359 mas_set(&mas, 1000); 360 val = mas_find_rev(&mas, 1000); 361 MT_BUG_ON(mt, val != xa_mk_value(100)); 362 val = mas_find_rev(&mas, 1000); 363 MT_BUG_ON(mt, val != NULL); 364 365 mas_set(&mas, 999); 366 val = mas_find_rev(&mas, 997); 367 MT_BUG_ON(mt, val != NULL); 368 369 mas_set(&mas, 1000); 370 val = mas_find_rev(&mas, 900); 371 MT_BUG_ON(mt, val != xa_mk_value(100)); 372 val = mas_find_rev(&mas, 900); 373 MT_BUG_ON(mt, val != xa_mk_value(99)); 374 375 mas_set(&mas, 20); 376 val = mas_find_rev(&mas, 0); 377 MT_BUG_ON(mt, val != xa_mk_value(2)); 378 val = mas_find_rev(&mas, 0); 379 MT_BUG_ON(mt, val != xa_mk_value(1)); 380 val = mas_find_rev(&mas, 0); 381 MT_BUG_ON(mt, val != xa_mk_value(0)); 382 val = mas_find_rev(&mas, 0); 383 MT_BUG_ON(mt, val != NULL); 384 rcu_read_unlock(); 385 } 386 387 static noinline void __init check_find(struct maple_tree *mt) 388 { 389 unsigned long val = 0; 390 unsigned long count; 391 unsigned long max; 392 unsigned long top; 393 unsigned long last = 0, index = 0; 394 void *entry, *entry2; 395 396 MA_STATE(mas, mt, 0, 0); 397 398 /* Insert 0. */ 399 MT_BUG_ON(mt, mtree_insert_index(mt, val++, GFP_KERNEL)); 400 401 #if defined(CONFIG_64BIT) 402 top = 4398046511104UL; 403 #else 404 top = ULONG_MAX; 405 #endif 406 407 if (MAPLE_32BIT) { 408 count = 15; 409 } else { 410 count = 20; 411 } 412 413 for (int i = 0; i <= count; i++) { 414 if (val != 64) 415 MT_BUG_ON(mt, mtree_insert_index(mt, val, GFP_KERNEL)); 416 else 417 MT_BUG_ON(mt, mtree_insert(mt, val, 418 XA_ZERO_ENTRY, GFP_KERNEL)); 419 420 val <<= 2; 421 } 422 423 val = 0; 424 mas_set(&mas, val); 425 mas_lock(&mas); 426 while ((entry = mas_find(&mas, 268435456)) != NULL) { 427 if (val != 64) 428 MT_BUG_ON(mt, xa_mk_value(val) != entry); 429 else 430 MT_BUG_ON(mt, entry != XA_ZERO_ENTRY); 431 432 val <<= 2; 433 /* For zero check. */ 434 if (!val) 435 val = 1; 436 } 437 mas_unlock(&mas); 438 439 val = 0; 440 mas_set(&mas, val); 441 mas_lock(&mas); 442 mas_for_each(&mas, entry, ULONG_MAX) { 443 if (val != 64) 444 MT_BUG_ON(mt, xa_mk_value(val) != entry); 445 else 446 MT_BUG_ON(mt, entry != XA_ZERO_ENTRY); 447 val <<= 2; 448 /* For zero check. */ 449 if (!val) 450 val = 1; 451 } 452 mas_unlock(&mas); 453 454 /* Test mas_pause */ 455 val = 0; 456 mas_set(&mas, val); 457 mas_lock(&mas); 458 mas_for_each(&mas, entry, ULONG_MAX) { 459 if (val != 64) 460 MT_BUG_ON(mt, xa_mk_value(val) != entry); 461 else 462 MT_BUG_ON(mt, entry != XA_ZERO_ENTRY); 463 val <<= 2; 464 /* For zero check. */ 465 if (!val) 466 val = 1; 467 468 mas_pause(&mas); 469 mas_unlock(&mas); 470 mas_lock(&mas); 471 } 472 mas_unlock(&mas); 473 474 val = 0; 475 max = 300; /* A value big enough to include XA_ZERO_ENTRY at 64. */ 476 mt_for_each(mt, entry, index, max) { 477 MT_BUG_ON(mt, xa_mk_value(val) != entry); 478 val <<= 2; 479 if (val == 64) /* Skip zero entry. */ 480 val <<= 2; 481 /* For zero check. */ 482 if (!val) 483 val = 1; 484 } 485 486 val = 0; 487 max = 0; 488 index = 0; 489 MT_BUG_ON(mt, mtree_insert_index(mt, ULONG_MAX, GFP_KERNEL)); 490 mt_for_each(mt, entry, index, ULONG_MAX) { 491 if (val == top) 492 MT_BUG_ON(mt, entry != xa_mk_value(LONG_MAX)); 493 else 494 MT_BUG_ON(mt, xa_mk_value(val) != entry); 495 496 /* Workaround for 32bit */ 497 if ((val << 2) < val) 498 val = ULONG_MAX; 499 else 500 val <<= 2; 501 502 if (val == 64) /* Skip zero entry. */ 503 val <<= 2; 504 /* For zero check. */ 505 if (!val) 506 val = 1; 507 max++; 508 MT_BUG_ON(mt, max > 25); 509 } 510 mtree_erase_index(mt, ULONG_MAX); 511 512 mas_reset(&mas); 513 index = 17; 514 entry = mt_find(mt, &index, 512); 515 MT_BUG_ON(mt, xa_mk_value(256) != entry); 516 517 mas_reset(&mas); 518 index = 17; 519 entry = mt_find(mt, &index, 20); 520 MT_BUG_ON(mt, entry != NULL); 521 522 523 /* Range check.. */ 524 /* Insert ULONG_MAX */ 525 MT_BUG_ON(mt, mtree_insert_index(mt, ULONG_MAX, GFP_KERNEL)); 526 527 val = 0; 528 mas_set(&mas, 0); 529 mas_lock(&mas); 530 mas_for_each(&mas, entry, ULONG_MAX) { 531 if (val == 64) 532 MT_BUG_ON(mt, entry != XA_ZERO_ENTRY); 533 else if (val == top) 534 MT_BUG_ON(mt, entry != xa_mk_value(LONG_MAX)); 535 else 536 MT_BUG_ON(mt, xa_mk_value(val) != entry); 537 538 /* Workaround for 32bit */ 539 if ((val << 2) < val) 540 val = ULONG_MAX; 541 else 542 val <<= 2; 543 544 /* For zero check. */ 545 if (!val) 546 val = 1; 547 mas_pause(&mas); 548 mas_unlock(&mas); 549 mas_lock(&mas); 550 } 551 mas_unlock(&mas); 552 553 mas_set(&mas, 1048576); 554 mas_lock(&mas); 555 entry = mas_find(&mas, 1048576); 556 mas_unlock(&mas); 557 MT_BUG_ON(mas.tree, entry == NULL); 558 559 /* 560 * Find last value. 561 * 1. get the expected value, leveraging the existence of an end entry 562 * 2. delete end entry 563 * 3. find the last value but searching for ULONG_MAX and then using 564 * prev 565 */ 566 /* First, get the expected result. */ 567 mas_lock(&mas); 568 mas_reset(&mas); 569 mas.index = ULONG_MAX; /* start at max.. */ 570 entry = mas_find(&mas, ULONG_MAX); 571 entry = mas_prev(&mas, 0); 572 index = mas.index; 573 last = mas.last; 574 575 /* Erase the last entry. */ 576 mas_reset(&mas); 577 mas.index = ULONG_MAX; 578 mas.last = ULONG_MAX; 579 mas_erase(&mas); 580 581 /* Get the previous value from MAS_START */ 582 mas_reset(&mas); 583 entry2 = mas_prev(&mas, 0); 584 585 /* Check results. */ 586 MT_BUG_ON(mt, entry != entry2); 587 MT_BUG_ON(mt, index != mas.index); 588 MT_BUG_ON(mt, last != mas.last); 589 590 591 mas.status = ma_none; 592 mas.index = ULONG_MAX; 593 mas.last = ULONG_MAX; 594 entry2 = mas_prev(&mas, 0); 595 MT_BUG_ON(mt, entry != entry2); 596 597 mas_set(&mas, 0); 598 MT_BUG_ON(mt, mas_prev(&mas, 0) != NULL); 599 600 mas_unlock(&mas); 601 mtree_destroy(mt); 602 } 603 604 static noinline void __init check_find_2(struct maple_tree *mt) 605 { 606 unsigned long i, j; 607 void *entry; 608 609 MA_STATE(mas, mt, 0, 0); 610 rcu_read_lock(); 611 mas_for_each(&mas, entry, ULONG_MAX) 612 MT_BUG_ON(mt, true); 613 rcu_read_unlock(); 614 615 for (i = 0; i < 256; i++) { 616 mtree_insert_index(mt, i, GFP_KERNEL); 617 j = 0; 618 mas_set(&mas, 0); 619 rcu_read_lock(); 620 mas_for_each(&mas, entry, ULONG_MAX) { 621 MT_BUG_ON(mt, entry != xa_mk_value(j)); 622 j++; 623 } 624 rcu_read_unlock(); 625 MT_BUG_ON(mt, j != i + 1); 626 } 627 628 for (i = 0; i < 256; i++) { 629 mtree_erase_index(mt, i); 630 j = i + 1; 631 mas_set(&mas, 0); 632 rcu_read_lock(); 633 mas_for_each(&mas, entry, ULONG_MAX) { 634 if (xa_is_zero(entry)) 635 continue; 636 637 MT_BUG_ON(mt, entry != xa_mk_value(j)); 638 j++; 639 } 640 rcu_read_unlock(); 641 MT_BUG_ON(mt, j != 256); 642 } 643 644 /*MT_BUG_ON(mt, !mtree_empty(mt)); */ 645 } 646 647 648 #if defined(CONFIG_64BIT) 649 static noinline void __init check_alloc_rev_range(struct maple_tree *mt) 650 { 651 /* 652 * Generated by: 653 * cat /proc/self/maps | awk '{print $1}'| 654 * awk -F "-" '{printf "0x%s, 0x%s, ", $1, $2}' 655 */ 656 657 static const unsigned long range[] = { 658 /* Inclusive , Exclusive. */ 659 0x565234af2000, 0x565234af4000, 660 0x565234af4000, 0x565234af9000, 661 0x565234af9000, 0x565234afb000, 662 0x565234afc000, 0x565234afd000, 663 0x565234afd000, 0x565234afe000, 664 0x565235def000, 0x565235e10000, 665 0x7f36d4bfd000, 0x7f36d4ee2000, 666 0x7f36d4ee2000, 0x7f36d4f04000, 667 0x7f36d4f04000, 0x7f36d504c000, 668 0x7f36d504c000, 0x7f36d5098000, 669 0x7f36d5098000, 0x7f36d5099000, 670 0x7f36d5099000, 0x7f36d509d000, 671 0x7f36d509d000, 0x7f36d509f000, 672 0x7f36d509f000, 0x7f36d50a5000, 673 0x7f36d50b9000, 0x7f36d50db000, 674 0x7f36d50db000, 0x7f36d50dc000, 675 0x7f36d50dc000, 0x7f36d50fa000, 676 0x7f36d50fa000, 0x7f36d5102000, 677 0x7f36d5102000, 0x7f36d5103000, 678 0x7f36d5103000, 0x7f36d5104000, 679 0x7f36d5104000, 0x7f36d5105000, 680 0x7fff5876b000, 0x7fff5878d000, 681 0x7fff5878e000, 0x7fff58791000, 682 0x7fff58791000, 0x7fff58793000, 683 }; 684 685 static const unsigned long holes[] = { 686 /* 687 * Note: start of hole is INCLUSIVE 688 * end of hole is EXCLUSIVE 689 * (opposite of the above table.) 690 * Start of hole, end of hole, size of hole (+1) 691 */ 692 0x565234afb000, 0x565234afc000, 0x1000, 693 0x565234afe000, 0x565235def000, 0x12F1000, 694 0x565235e10000, 0x7f36d4bfd000, 0x28E49EDED000, 695 }; 696 697 /* 698 * req_range consists of 4 values. 699 * 1. min index 700 * 2. max index 701 * 3. size 702 * 4. number that should be returned. 703 * 5. return value 704 */ 705 static const unsigned long req_range[] = { 706 0x565234af9000, /* Min */ 707 0x7fff58791000, /* Max */ 708 0x1000, /* Size */ 709 0x7fff5878d << 12, /* First rev hole of size 0x1000 */ 710 0, /* Return value success. */ 711 712 0x0, /* Min */ 713 0x565234AF0 << 12, /* Max */ 714 0x3000, /* Size */ 715 0x565234AEE << 12, /* max - 3. */ 716 0, /* Return value success. */ 717 718 0x0, /* Min */ 719 -1, /* Max */ 720 0x1000, /* Size */ 721 562949953421311 << 12,/* First rev hole of size 0x1000 */ 722 0, /* Return value success. */ 723 724 0x0, /* Min */ 725 0x7F36D5109 << 12, /* Max */ 726 0x4000, /* Size */ 727 0x7F36D5106 << 12, /* First rev hole of size 0x4000 */ 728 0, /* Return value success. */ 729 730 /* Ascend test. */ 731 0x0, 732 34148798628 << 12, 733 19 << 12, 734 34148797418 << 12, 735 0x0, 736 737 /* Too big test. */ 738 0x0, 739 18446744073709551615UL, 740 562915594369134UL << 12, 741 0x0, 742 -EBUSY, 743 744 /* Single space test. */ 745 34148798725 << 12, 746 34148798725 << 12, 747 1 << 12, 748 34148798725 << 12, 749 0, 750 }; 751 752 int i, range_count = ARRAY_SIZE(range); 753 int req_range_count = ARRAY_SIZE(req_range); 754 unsigned long min = 0; 755 756 MA_STATE(mas, mt, 0, 0); 757 758 mtree_store_range(mt, MTREE_ALLOC_MAX, ULONG_MAX, XA_ZERO_ENTRY, 759 GFP_KERNEL); 760 #define DEBUG_REV_RANGE 0 761 for (i = 0; i < range_count; i += 2) { 762 /* Inclusive, Inclusive (with the -1) */ 763 764 #if DEBUG_REV_RANGE 765 pr_debug("\t%s: Insert %lu-%lu\n", __func__, range[i] >> 12, 766 (range[i + 1] >> 12) - 1); 767 #endif 768 check_insert_range(mt, range[i] >> 12, (range[i + 1] >> 12) - 1, 769 xa_mk_value(range[i] >> 12), 0); 770 mt_validate(mt); 771 } 772 773 774 mas_lock(&mas); 775 for (i = 0; i < ARRAY_SIZE(holes); i += 3) { 776 #if DEBUG_REV_RANGE 777 pr_debug("Search from %lu-%lu for gap %lu should be at %lu\n", 778 min, holes[i+1]>>12, holes[i+2]>>12, 779 holes[i] >> 12); 780 #endif 781 MT_BUG_ON(mt, mas_empty_area_rev(&mas, min, 782 holes[i+1] >> 12, 783 holes[i+2] >> 12)); 784 #if DEBUG_REV_RANGE 785 pr_debug("Found %lu %lu\n", mas.index, mas.last); 786 pr_debug("gap %lu %lu\n", (holes[i] >> 12), 787 (holes[i+1] >> 12)); 788 #endif 789 MT_BUG_ON(mt, mas.last + 1 != (holes[i+1] >> 12)); 790 MT_BUG_ON(mt, mas.index != (holes[i+1] >> 12) - (holes[i+2] >> 12)); 791 min = holes[i+1] >> 12; 792 mas_reset(&mas); 793 } 794 795 mas_unlock(&mas); 796 for (i = 0; i < req_range_count; i += 5) { 797 #if DEBUG_REV_RANGE 798 pr_debug("\tReverse request %d between %lu-%lu size %lu, should get %lu\n", 799 i, req_range[i] >> 12, 800 (req_range[i + 1] >> 12), 801 req_range[i+2] >> 12, 802 req_range[i+3] >> 12); 803 #endif 804 check_mtree_alloc_rrange(mt, 805 req_range[i] >> 12, /* start */ 806 req_range[i+1] >> 12, /* end */ 807 req_range[i+2] >> 12, /* size */ 808 req_range[i+3] >> 12, /* expected address */ 809 req_range[i+4], /* expected return */ 810 xa_mk_value(req_range[i] >> 12)); /* pointer */ 811 mt_validate(mt); 812 } 813 814 mt_set_non_kernel(1); 815 mtree_erase(mt, 34148798727); /* create a deleted range. */ 816 mtree_erase(mt, 34148798725); 817 check_mtree_alloc_rrange(mt, 0, 34359052173, 210253414, 818 34148798725, 0, mt); 819 820 mtree_destroy(mt); 821 } 822 823 static noinline void __init check_alloc_range(struct maple_tree *mt) 824 { 825 /* 826 * Generated by: 827 * cat /proc/self/maps|awk '{print $1}'| 828 * awk -F "-" '{printf "0x%s, 0x%s, ", $1, $2}' 829 */ 830 831 static const unsigned long range[] = { 832 /* Inclusive , Exclusive. */ 833 0x565234af2000, 0x565234af4000, 834 0x565234af4000, 0x565234af9000, 835 0x565234af9000, 0x565234afb000, 836 0x565234afc000, 0x565234afd000, 837 0x565234afd000, 0x565234afe000, 838 0x565235def000, 0x565235e10000, 839 0x7f36d4bfd000, 0x7f36d4ee2000, 840 0x7f36d4ee2000, 0x7f36d4f04000, 841 0x7f36d4f04000, 0x7f36d504c000, 842 0x7f36d504c000, 0x7f36d5098000, 843 0x7f36d5098000, 0x7f36d5099000, 844 0x7f36d5099000, 0x7f36d509d000, 845 0x7f36d509d000, 0x7f36d509f000, 846 0x7f36d509f000, 0x7f36d50a5000, 847 0x7f36d50b9000, 0x7f36d50db000, 848 0x7f36d50db000, 0x7f36d50dc000, 849 0x7f36d50dc000, 0x7f36d50fa000, 850 0x7f36d50fa000, 0x7f36d5102000, 851 0x7f36d5102000, 0x7f36d5103000, 852 0x7f36d5103000, 0x7f36d5104000, 853 0x7f36d5104000, 0x7f36d5105000, 854 0x7fff5876b000, 0x7fff5878d000, 855 0x7fff5878e000, 0x7fff58791000, 856 0x7fff58791000, 0x7fff58793000, 857 }; 858 static const unsigned long holes[] = { 859 /* Start of hole, end of hole, size of hole (+1) */ 860 0x565234afb000, 0x565234afc000, 0x1000, 861 0x565234afe000, 0x565235def000, 0x12F1000, 862 0x565235e10000, 0x7f36d4bfd000, 0x28E49EDED000, 863 }; 864 865 /* 866 * req_range consists of 4 values. 867 * 1. min index 868 * 2. max index 869 * 3. size 870 * 4. number that should be returned. 871 * 5. return value 872 */ 873 static const unsigned long req_range[] = { 874 0x565234af9000, /* Min */ 875 0x7fff58791000, /* Max */ 876 0x1000, /* Size */ 877 0x565234afb000, /* First hole in our data of size 1000. */ 878 0, /* Return value success. */ 879 880 0x0, /* Min */ 881 0x7fff58791000, /* Max */ 882 0x1F00, /* Size */ 883 0x0, /* First hole in our data of size 2000. */ 884 0, /* Return value success. */ 885 886 /* Test ascend. */ 887 34148797436 << 12, /* Min */ 888 0x7fff587AF000, /* Max */ 889 0x3000, /* Size */ 890 34148798629 << 12, /* Expected location */ 891 0, /* Return value success. */ 892 893 /* Test failing. */ 894 34148798623 << 12, /* Min */ 895 34148798683 << 12, /* Max */ 896 0x15000, /* Size */ 897 0, /* Expected location */ 898 -EBUSY, /* Return value failed. */ 899 900 /* Test filling entire gap. */ 901 34148798623 << 12, /* Min */ 902 0x7fff587AF000, /* Max */ 903 0x10000, /* Size */ 904 34148798632 << 12, /* Expected location */ 905 0, /* Return value success. */ 906 907 /* Test walking off the end of root. */ 908 0, /* Min */ 909 -1, /* Max */ 910 -1, /* Size */ 911 0, /* Expected location */ 912 -EBUSY, /* Return value failure. */ 913 914 /* Test looking for too large a hole across entire range. */ 915 0, /* Min */ 916 -1, /* Max */ 917 4503599618982063UL << 12, /* Size */ 918 34359052178 << 12, /* Expected location */ 919 -EBUSY, /* Return failure. */ 920 921 /* Test a single entry */ 922 34148798648 << 12, /* Min */ 923 34148798648 << 12, /* Max */ 924 4096, /* Size of 1 */ 925 34148798648 << 12, /* Location is the same as min/max */ 926 0, /* Success */ 927 }; 928 int i, range_count = ARRAY_SIZE(range); 929 int req_range_count = ARRAY_SIZE(req_range); 930 unsigned long min = 0x565234af2000; 931 MA_STATE(mas, mt, 0, 0); 932 933 mtree_store_range(mt, MTREE_ALLOC_MAX, ULONG_MAX, XA_ZERO_ENTRY, 934 GFP_KERNEL); 935 for (i = 0; i < range_count; i += 2) { 936 #define DEBUG_ALLOC_RANGE 0 937 #if DEBUG_ALLOC_RANGE 938 pr_debug("\tInsert %lu-%lu\n", range[i] >> 12, 939 (range[i + 1] >> 12) - 1); 940 mt_dump(mt, mt_dump_hex); 941 #endif 942 check_insert_range(mt, range[i] >> 12, (range[i + 1] >> 12) - 1, 943 xa_mk_value(range[i] >> 12), 0); 944 mt_validate(mt); 945 } 946 947 948 949 mas_lock(&mas); 950 for (i = 0; i < ARRAY_SIZE(holes); i += 3) { 951 952 #if DEBUG_ALLOC_RANGE 953 pr_debug("\tGet empty %lu-%lu size %lu (%lx-%lx)\n", min >> 12, 954 holes[i+1] >> 12, holes[i+2] >> 12, 955 min, holes[i+1]); 956 #endif 957 MT_BUG_ON(mt, mas_empty_area(&mas, min >> 12, 958 holes[i+1] >> 12, 959 holes[i+2] >> 12)); 960 MT_BUG_ON(mt, mas.index != holes[i] >> 12); 961 min = holes[i+1]; 962 mas_reset(&mas); 963 } 964 mas_unlock(&mas); 965 for (i = 0; i < req_range_count; i += 5) { 966 #if DEBUG_ALLOC_RANGE 967 pr_debug("\tTest %d: %lu-%lu size %lu expected %lu (%lu-%lu)\n", 968 i/5, req_range[i] >> 12, req_range[i + 1] >> 12, 969 req_range[i + 2] >> 12, req_range[i + 3] >> 12, 970 req_range[i], req_range[i+1]); 971 #endif 972 check_mtree_alloc_range(mt, 973 req_range[i] >> 12, /* start */ 974 req_range[i+1] >> 12, /* end */ 975 req_range[i+2] >> 12, /* size */ 976 req_range[i+3] >> 12, /* expected address */ 977 req_range[i+4], /* expected return */ 978 xa_mk_value(req_range[i] >> 12)); /* pointer */ 979 mt_validate(mt); 980 #if DEBUG_ALLOC_RANGE 981 mt_dump(mt, mt_dump_hex); 982 #endif 983 } 984 985 mtree_destroy(mt); 986 } 987 #endif 988 989 static noinline void __init check_ranges(struct maple_tree *mt) 990 { 991 int i, val, val2; 992 static const unsigned long r[] = { 993 10, 15, 994 20, 25, 995 17, 22, /* Overlaps previous range. */ 996 9, 1000, /* Huge. */ 997 100, 200, 998 45, 168, 999 118, 128, 1000 }; 1001 1002 MT_BUG_ON(mt, !mtree_empty(mt)); 1003 check_insert_range(mt, r[0], r[1], xa_mk_value(r[0]), 0); 1004 check_insert_range(mt, r[2], r[3], xa_mk_value(r[2]), 0); 1005 check_insert_range(mt, r[4], r[5], xa_mk_value(r[4]), -EEXIST); 1006 MT_BUG_ON(mt, !mt_height(mt)); 1007 /* Store */ 1008 check_store_range(mt, r[4], r[5], xa_mk_value(r[4]), 0); 1009 check_store_range(mt, r[6], r[7], xa_mk_value(r[6]), 0); 1010 check_store_range(mt, r[8], r[9], xa_mk_value(r[8]), 0); 1011 MT_BUG_ON(mt, !mt_height(mt)); 1012 mtree_destroy(mt); 1013 MT_BUG_ON(mt, mt_height(mt)); 1014 1015 check_seq(mt, 50, false); 1016 mt_set_non_kernel(4); 1017 check_store_range(mt, 5, 47, xa_mk_value(47), 0); 1018 MT_BUG_ON(mt, !mt_height(mt)); 1019 mtree_destroy(mt); 1020 1021 /* Create tree of 1-100 */ 1022 check_seq(mt, 100, false); 1023 /* Store 45-168 */ 1024 mt_set_non_kernel(10); 1025 check_store_range(mt, r[10], r[11], xa_mk_value(r[10]), 0); 1026 MT_BUG_ON(mt, !mt_height(mt)); 1027 mtree_destroy(mt); 1028 1029 /* Create tree of 1-200 */ 1030 check_seq(mt, 200, false); 1031 /* Store 45-168 */ 1032 check_store_range(mt, r[10], r[11], xa_mk_value(r[10]), 0); 1033 MT_BUG_ON(mt, !mt_height(mt)); 1034 mtree_destroy(mt); 1035 1036 check_seq(mt, 30, false); 1037 check_store_range(mt, 6, 18, xa_mk_value(6), 0); 1038 MT_BUG_ON(mt, !mt_height(mt)); 1039 mtree_destroy(mt); 1040 1041 /* Overwrite across multiple levels. */ 1042 /* Create tree of 1-400 */ 1043 check_seq(mt, 400, false); 1044 mt_set_non_kernel(50); 1045 /* Store 118-128 */ 1046 check_store_range(mt, r[12], r[13], xa_mk_value(r[12]), 0); 1047 mt_set_non_kernel(50); 1048 mtree_test_erase(mt, 140); 1049 mtree_test_erase(mt, 141); 1050 mtree_test_erase(mt, 142); 1051 mtree_test_erase(mt, 143); 1052 mtree_test_erase(mt, 130); 1053 mtree_test_erase(mt, 131); 1054 mtree_test_erase(mt, 132); 1055 mtree_test_erase(mt, 133); 1056 mtree_test_erase(mt, 134); 1057 mtree_test_erase(mt, 135); 1058 check_load(mt, r[12], xa_mk_value(r[12])); 1059 check_load(mt, r[13], xa_mk_value(r[12])); 1060 check_load(mt, r[13] - 1, xa_mk_value(r[12])); 1061 check_load(mt, r[13] + 1, xa_mk_value(r[13] + 1)); 1062 check_load(mt, 135, NULL); 1063 check_load(mt, 140, NULL); 1064 mt_set_non_kernel(0); 1065 MT_BUG_ON(mt, !mt_height(mt)); 1066 mtree_destroy(mt); 1067 1068 1069 1070 /* Overwrite multiple levels at the end of the tree (slot 7) */ 1071 mt_set_non_kernel(50); 1072 check_seq(mt, 400, false); 1073 check_store_range(mt, 353, 361, xa_mk_value(353), 0); 1074 check_store_range(mt, 347, 352, xa_mk_value(347), 0); 1075 1076 check_load(mt, 346, xa_mk_value(346)); 1077 for (i = 347; i <= 352; i++) 1078 check_load(mt, i, xa_mk_value(347)); 1079 for (i = 353; i <= 361; i++) 1080 check_load(mt, i, xa_mk_value(353)); 1081 check_load(mt, 362, xa_mk_value(362)); 1082 mt_set_non_kernel(0); 1083 MT_BUG_ON(mt, !mt_height(mt)); 1084 mtree_destroy(mt); 1085 1086 mt_set_non_kernel(50); 1087 check_seq(mt, 400, false); 1088 check_store_range(mt, 352, 364, NULL, 0); 1089 check_store_range(mt, 351, 363, xa_mk_value(352), 0); 1090 check_load(mt, 350, xa_mk_value(350)); 1091 check_load(mt, 351, xa_mk_value(352)); 1092 for (i = 352; i <= 363; i++) 1093 check_load(mt, i, xa_mk_value(352)); 1094 check_load(mt, 364, NULL); 1095 check_load(mt, 365, xa_mk_value(365)); 1096 mt_set_non_kernel(0); 1097 MT_BUG_ON(mt, !mt_height(mt)); 1098 mtree_destroy(mt); 1099 1100 mt_set_non_kernel(5); 1101 check_seq(mt, 400, false); 1102 check_store_range(mt, 352, 364, NULL, 0); 1103 check_store_range(mt, 351, 364, xa_mk_value(352), 0); 1104 check_load(mt, 350, xa_mk_value(350)); 1105 check_load(mt, 351, xa_mk_value(352)); 1106 for (i = 352; i <= 364; i++) 1107 check_load(mt, i, xa_mk_value(352)); 1108 check_load(mt, 365, xa_mk_value(365)); 1109 mt_set_non_kernel(0); 1110 MT_BUG_ON(mt, !mt_height(mt)); 1111 mtree_destroy(mt); 1112 1113 1114 mt_set_non_kernel(50); 1115 check_seq(mt, 400, false); 1116 check_store_range(mt, 362, 367, xa_mk_value(362), 0); 1117 check_store_range(mt, 353, 361, xa_mk_value(353), 0); 1118 mt_set_non_kernel(0); 1119 mt_validate(mt); 1120 MT_BUG_ON(mt, !mt_height(mt)); 1121 mtree_destroy(mt); 1122 /* 1123 * Interesting cases: 1124 * 1. Overwrite the end of a node and end in the first entry of the next 1125 * node. 1126 * 2. Split a single range 1127 * 3. Overwrite the start of a range 1128 * 4. Overwrite the end of a range 1129 * 5. Overwrite the entire range 1130 * 6. Overwrite a range that causes multiple parent nodes to be 1131 * combined 1132 * 7. Overwrite a range that causes multiple parent nodes and part of 1133 * root to be combined 1134 * 8. Overwrite the whole tree 1135 * 9. Try to overwrite the zero entry of an alloc tree. 1136 * 10. Write a range larger than a nodes current pivot 1137 */ 1138 1139 mt_set_non_kernel(50); 1140 for (i = 0; i <= 500; i++) { 1141 val = i*5; 1142 val2 = (i+1)*5; 1143 check_store_range(mt, val, val2, xa_mk_value(val), 0); 1144 } 1145 check_store_range(mt, 2400, 2400, xa_mk_value(2400), 0); 1146 check_store_range(mt, 2411, 2411, xa_mk_value(2411), 0); 1147 check_store_range(mt, 2412, 2412, xa_mk_value(2412), 0); 1148 check_store_range(mt, 2396, 2400, xa_mk_value(4052020), 0); 1149 check_store_range(mt, 2402, 2402, xa_mk_value(2402), 0); 1150 mtree_destroy(mt); 1151 mt_set_non_kernel(0); 1152 1153 mt_set_non_kernel(50); 1154 for (i = 0; i <= 500; i++) { 1155 val = i*5; 1156 val2 = (i+1)*5; 1157 check_store_range(mt, val, val2, xa_mk_value(val), 0); 1158 } 1159 check_store_range(mt, 2422, 2422, xa_mk_value(2422), 0); 1160 check_store_range(mt, 2424, 2424, xa_mk_value(2424), 0); 1161 check_store_range(mt, 2425, 2425, xa_mk_value(2), 0); 1162 check_store_range(mt, 2460, 2470, NULL, 0); 1163 check_store_range(mt, 2435, 2460, xa_mk_value(2435), 0); 1164 check_store_range(mt, 2461, 2470, xa_mk_value(2461), 0); 1165 mt_set_non_kernel(0); 1166 MT_BUG_ON(mt, !mt_height(mt)); 1167 mtree_destroy(mt); 1168 1169 /* Check in-place modifications */ 1170 mt_init_flags(mt, MT_FLAGS_ALLOC_RANGE); 1171 /* Append to the start of last range */ 1172 mt_set_non_kernel(50); 1173 for (i = 0; i <= 500; i++) { 1174 val = i * 5 + 1; 1175 val2 = val + 4; 1176 check_store_range(mt, val, val2, xa_mk_value(val), 0); 1177 } 1178 1179 /* Append to the last range without touching any boundaries */ 1180 for (i = 0; i < 10; i++) { 1181 val = val2 + 5; 1182 val2 = val + 4; 1183 check_store_range(mt, val, val2, xa_mk_value(val), 0); 1184 } 1185 1186 /* Append to the end of last range */ 1187 val = val2; 1188 for (i = 0; i < 10; i++) { 1189 val += 5; 1190 MT_BUG_ON(mt, mtree_test_store_range(mt, val, ULONG_MAX, 1191 xa_mk_value(val)) != 0); 1192 } 1193 1194 /* Overwriting the range and over a part of the next range */ 1195 for (i = 10; i < 30; i += 2) { 1196 val = i * 5 + 1; 1197 val2 = val + 5; 1198 check_store_range(mt, val, val2, xa_mk_value(val), 0); 1199 } 1200 1201 /* Overwriting a part of the range and over the next range */ 1202 for (i = 50; i < 70; i += 2) { 1203 val2 = i * 5; 1204 val = val2 - 5; 1205 check_store_range(mt, val, val2, xa_mk_value(val), 0); 1206 } 1207 1208 /* 1209 * Expand the range, only partially overwriting the previous and 1210 * next ranges 1211 */ 1212 for (i = 100; i < 130; i += 3) { 1213 val = i * 5 - 5; 1214 val2 = i * 5 + 1; 1215 check_store_range(mt, val, val2, xa_mk_value(val), 0); 1216 } 1217 1218 /* 1219 * Expand the range, only partially overwriting the previous and 1220 * next ranges, in RCU mode 1221 */ 1222 mt_set_in_rcu(mt); 1223 for (i = 150; i < 180; i += 3) { 1224 val = i * 5 - 5; 1225 val2 = i * 5 + 1; 1226 check_store_range(mt, val, val2, xa_mk_value(val), 0); 1227 } 1228 1229 MT_BUG_ON(mt, !mt_height(mt)); 1230 mt_validate(mt); 1231 mt_set_non_kernel(0); 1232 mtree_destroy(mt); 1233 1234 /* Test rebalance gaps */ 1235 mt_init_flags(mt, MT_FLAGS_ALLOC_RANGE); 1236 mt_set_non_kernel(50); 1237 for (i = 0; i <= 50; i++) { 1238 val = i*10; 1239 val2 = (i+1)*10; 1240 check_store_range(mt, val, val2, xa_mk_value(val), 0); 1241 } 1242 check_store_range(mt, 161, 161, xa_mk_value(161), 0); 1243 check_store_range(mt, 162, 162, xa_mk_value(162), 0); 1244 check_store_range(mt, 163, 163, xa_mk_value(163), 0); 1245 check_store_range(mt, 240, 249, NULL, 0); 1246 mtree_erase(mt, 200); 1247 mtree_erase(mt, 210); 1248 mtree_erase(mt, 220); 1249 mtree_erase(mt, 230); 1250 mt_set_non_kernel(0); 1251 MT_BUG_ON(mt, !mt_height(mt)); 1252 mtree_destroy(mt); 1253 1254 mt_init_flags(mt, MT_FLAGS_ALLOC_RANGE); 1255 for (i = 0; i <= 500; i++) { 1256 val = i*10; 1257 val2 = (i+1)*10; 1258 check_store_range(mt, val, val2, xa_mk_value(val), 0); 1259 } 1260 check_store_range(mt, 4600, 4959, xa_mk_value(1), 0); 1261 mt_validate(mt); 1262 MT_BUG_ON(mt, !mt_height(mt)); 1263 mtree_destroy(mt); 1264 1265 mt_init_flags(mt, MT_FLAGS_ALLOC_RANGE); 1266 for (i = 0; i <= 500; i++) { 1267 val = i*10; 1268 val2 = (i+1)*10; 1269 check_store_range(mt, val, val2, xa_mk_value(val), 0); 1270 } 1271 check_store_range(mt, 4811, 4811, xa_mk_value(4811), 0); 1272 check_store_range(mt, 4812, 4812, xa_mk_value(4812), 0); 1273 check_store_range(mt, 4861, 4861, xa_mk_value(4861), 0); 1274 check_store_range(mt, 4862, 4862, xa_mk_value(4862), 0); 1275 check_store_range(mt, 4842, 4849, NULL, 0); 1276 mt_validate(mt); 1277 MT_BUG_ON(mt, !mt_height(mt)); 1278 mtree_destroy(mt); 1279 1280 mt_init_flags(mt, MT_FLAGS_ALLOC_RANGE); 1281 for (i = 0; i <= 1300; i++) { 1282 val = i*10; 1283 val2 = (i+1)*10; 1284 check_store_range(mt, val, val2, xa_mk_value(val), 0); 1285 MT_BUG_ON(mt, mt_height(mt) >= 4); 1286 } 1287 /* Cause a 3 child split all the way up the tree. */ 1288 for (i = 5; i < 215; i += 10) 1289 check_store_range(mt, 11450 + i, 11450 + i + 1, NULL, 0); 1290 for (i = 5; i < 65; i += 10) 1291 check_store_range(mt, 11770 + i, 11770 + i + 1, NULL, 0); 1292 1293 MT_BUG_ON(mt, mt_height(mt) >= 4); 1294 for (i = 5; i < 45; i += 10) 1295 check_store_range(mt, 11700 + i, 11700 + i + 1, NULL, 0); 1296 if (!MAPLE_32BIT) 1297 MT_BUG_ON(mt, mt_height(mt) < 4); 1298 mtree_destroy(mt); 1299 1300 1301 mt_init_flags(mt, MT_FLAGS_ALLOC_RANGE); 1302 for (i = 0; i <= 1200; i++) { 1303 val = i*10; 1304 val2 = (i+1)*10; 1305 check_store_range(mt, val, val2, xa_mk_value(val), 0); 1306 MT_BUG_ON(mt, mt_height(mt) >= 4); 1307 } 1308 /* Fill parents and leaves before split. */ 1309 for (i = 5; i < 455; i += 10) 1310 check_store_range(mt, 7800 + i, 7800 + i + 1, NULL, 0); 1311 1312 for (i = 1; i < 16; i++) 1313 check_store_range(mt, 8185 + i, 8185 + i + 1, 1314 xa_mk_value(8185+i), 0); 1315 MT_BUG_ON(mt, mt_height(mt) >= 4); 1316 /* triple split across multiple levels. */ 1317 check_store_range(mt, 8184, 8184, xa_mk_value(8184), 0); 1318 if (!MAPLE_32BIT) 1319 MT_BUG_ON(mt, mt_height(mt) != 4); 1320 } 1321 1322 static noinline void __init check_next_entry(struct maple_tree *mt) 1323 { 1324 void *entry = NULL; 1325 unsigned long limit = 30, i = 0; 1326 MA_STATE(mas, mt, i, i); 1327 1328 MT_BUG_ON(mt, !mtree_empty(mt)); 1329 1330 check_seq(mt, limit, false); 1331 rcu_read_lock(); 1332 1333 /* Check the first one and get ma_state in the correct state. */ 1334 MT_BUG_ON(mt, mas_walk(&mas) != xa_mk_value(i++)); 1335 for ( ; i <= limit + 1; i++) { 1336 entry = mas_next(&mas, limit); 1337 if (i > limit) 1338 MT_BUG_ON(mt, entry != NULL); 1339 else 1340 MT_BUG_ON(mt, xa_mk_value(i) != entry); 1341 } 1342 rcu_read_unlock(); 1343 mtree_destroy(mt); 1344 } 1345 1346 static noinline void __init check_prev_entry(struct maple_tree *mt) 1347 { 1348 unsigned long index = 16; 1349 void *value; 1350 int i; 1351 1352 MA_STATE(mas, mt, index, index); 1353 1354 MT_BUG_ON(mt, !mtree_empty(mt)); 1355 check_seq(mt, 30, false); 1356 1357 rcu_read_lock(); 1358 value = mas_find(&mas, ULONG_MAX); 1359 MT_BUG_ON(mt, value != xa_mk_value(index)); 1360 value = mas_prev(&mas, 0); 1361 MT_BUG_ON(mt, value != xa_mk_value(index - 1)); 1362 rcu_read_unlock(); 1363 mtree_destroy(mt); 1364 1365 /* Check limits on prev */ 1366 mt_init_flags(mt, MT_FLAGS_ALLOC_RANGE); 1367 mas_lock(&mas); 1368 for (i = 0; i <= index; i++) { 1369 mas_set_range(&mas, i*10, i*10+5); 1370 mas_store_gfp(&mas, xa_mk_value(i), GFP_KERNEL); 1371 } 1372 1373 mas_set(&mas, 20); 1374 value = mas_walk(&mas); 1375 MT_BUG_ON(mt, value != xa_mk_value(2)); 1376 1377 value = mas_prev(&mas, 19); 1378 MT_BUG_ON(mt, value != NULL); 1379 1380 mas_set(&mas, 80); 1381 value = mas_walk(&mas); 1382 MT_BUG_ON(mt, value != xa_mk_value(8)); 1383 1384 value = mas_prev(&mas, 76); 1385 MT_BUG_ON(mt, value != NULL); 1386 1387 mas_unlock(&mas); 1388 } 1389 1390 static noinline void __init check_store_null(struct maple_tree *mt) 1391 { 1392 MA_STATE(mas, mt, 0, ULONG_MAX); 1393 1394 /* 1395 * Store NULL at range [0, ULONG_MAX] to an empty tree should result 1396 * in an empty tree 1397 */ 1398 mt_init_flags(mt, MT_FLAGS_ALLOC_RANGE); 1399 mas_lock(&mas); 1400 mas_store_gfp(&mas, NULL, GFP_KERNEL); 1401 MT_BUG_ON(mt, !mtree_empty(mt)); 1402 mas_unlock(&mas); 1403 mtree_destroy(mt); 1404 1405 /* 1406 * Store NULL at any range to an empty tree should result in an empty 1407 * tree 1408 */ 1409 mt_init_flags(mt, MT_FLAGS_ALLOC_RANGE); 1410 mas_lock(&mas); 1411 mas_set_range(&mas, 3, 10); 1412 mas_store_gfp(&mas, NULL, GFP_KERNEL); 1413 MT_BUG_ON(mt, !mtree_empty(mt)); 1414 mas_unlock(&mas); 1415 mtree_destroy(mt); 1416 1417 /* 1418 * Store NULL at range [0, ULONG_MAX] to a single entry tree should 1419 * result in an empty tree 1420 */ 1421 mt_init_flags(mt, MT_FLAGS_ALLOC_RANGE); 1422 mas_lock(&mas); 1423 mas_set(&mas, 0); 1424 mas_store_gfp(&mas, &mas, GFP_KERNEL); 1425 mas_set_range(&mas, 0, ULONG_MAX); 1426 mas_store_gfp(&mas, NULL, GFP_KERNEL); 1427 MT_BUG_ON(mt, !mtree_empty(mt)); 1428 mas_unlock(&mas); 1429 mtree_destroy(mt); 1430 1431 /* 1432 * Store NULL at range [0, n] to a single entry tree should 1433 * result in an empty tree 1434 */ 1435 mt_init_flags(mt, MT_FLAGS_ALLOC_RANGE); 1436 mas_lock(&mas); 1437 mas_set(&mas, 0); 1438 mas_store_gfp(&mas, &mas, GFP_KERNEL); 1439 mas_set_range(&mas, 0, 5); 1440 mas_store_gfp(&mas, NULL, GFP_KERNEL); 1441 MT_BUG_ON(mt, !mtree_empty(mt)); 1442 mas_unlock(&mas); 1443 mtree_destroy(mt); 1444 1445 /* 1446 * Store NULL at range [m, n] where m > 0 to a single entry tree 1447 * should still be a single entry tree 1448 */ 1449 mt_init_flags(mt, MT_FLAGS_ALLOC_RANGE); 1450 mas_lock(&mas); 1451 mas_set(&mas, 0); 1452 mas_store_gfp(&mas, &mas, GFP_KERNEL); 1453 mas_set_range(&mas, 2, 5); 1454 mas_store_gfp(&mas, NULL, GFP_KERNEL); 1455 MT_BUG_ON(mt, mtree_empty(mt)); 1456 // MT_BUG_ON(mt, xa_is_node(mas_root(&mas))); 1457 mas_unlock(&mas); 1458 mtree_destroy(mt); 1459 1460 /* 1461 * Store NULL at range [0, ULONG_MAX] to a tree with node should 1462 * result in an empty tree 1463 */ 1464 mt_init_flags(mt, MT_FLAGS_ALLOC_RANGE); 1465 mas_lock(&mas); 1466 mas_set_range(&mas, 1, 3); 1467 mas_store_gfp(&mas, &mas, GFP_KERNEL); 1468 // MT_BUG_ON(mt, !xa_is_node(mas_root(&mas))); 1469 mas_set_range(&mas, 0, ULONG_MAX); 1470 mas_store_gfp(&mas, NULL, GFP_KERNEL); 1471 MT_BUG_ON(mt, !mtree_empty(mt)); 1472 mas_unlock(&mas); 1473 mtree_destroy(mt); 1474 } 1475 1476 static noinline void __init check_root_expand(struct maple_tree *mt) 1477 { 1478 MA_STATE(mas, mt, 0, 0); 1479 void *ptr; 1480 1481 1482 mas_lock(&mas); 1483 mas_set(&mas, 3); 1484 ptr = mas_walk(&mas); 1485 MT_BUG_ON(mt, mas.index != 0); 1486 MT_BUG_ON(mt, ptr != NULL); 1487 MT_BUG_ON(mt, mas.index != 0); 1488 MT_BUG_ON(mt, mas.last != ULONG_MAX); 1489 1490 ptr = &check_prev_entry; 1491 mas_set(&mas, 1); 1492 mas_store_gfp(&mas, ptr, GFP_KERNEL); 1493 1494 mas_set(&mas, 0); 1495 ptr = mas_walk(&mas); 1496 MT_BUG_ON(mt, ptr != NULL); 1497 1498 mas_set(&mas, 1); 1499 ptr = mas_walk(&mas); 1500 MT_BUG_ON(mt, ptr != &check_prev_entry); 1501 1502 mas_set(&mas, 2); 1503 ptr = mas_walk(&mas); 1504 MT_BUG_ON(mt, ptr != NULL); 1505 mas_unlock(&mas); 1506 mtree_destroy(mt); 1507 1508 1509 mt_init_flags(mt, 0); 1510 mas_lock(&mas); 1511 1512 mas_set(&mas, 0); 1513 ptr = &check_prev_entry; 1514 mas_store_gfp(&mas, ptr, GFP_KERNEL); 1515 1516 mas_set(&mas, 5); 1517 ptr = mas_walk(&mas); 1518 MT_BUG_ON(mt, ptr != NULL); 1519 MT_BUG_ON(mt, mas.index != 1); 1520 MT_BUG_ON(mt, mas.last != ULONG_MAX); 1521 1522 mas_set_range(&mas, 0, 100); 1523 ptr = mas_walk(&mas); 1524 MT_BUG_ON(mt, ptr != &check_prev_entry); 1525 MT_BUG_ON(mt, mas.last != 0); 1526 mas_unlock(&mas); 1527 mtree_destroy(mt); 1528 1529 mt_init_flags(mt, 0); 1530 mas_lock(&mas); 1531 1532 mas_set(&mas, 0); 1533 ptr = (void *)((unsigned long) check_prev_entry | 1UL); 1534 mas_store_gfp(&mas, ptr, GFP_KERNEL); 1535 ptr = mas_next(&mas, ULONG_MAX); 1536 MT_BUG_ON(mt, ptr != NULL); 1537 MT_BUG_ON(mt, (mas.index != 1) && (mas.last != ULONG_MAX)); 1538 1539 mas_set(&mas, 1); 1540 ptr = mas_prev(&mas, 0); 1541 MT_BUG_ON(mt, (mas.index != 0) && (mas.last != 0)); 1542 MT_BUG_ON(mt, ptr != (void *)((unsigned long) check_prev_entry | 1UL)); 1543 1544 mas_unlock(&mas); 1545 1546 mtree_destroy(mt); 1547 1548 mt_init_flags(mt, 0); 1549 mas_lock(&mas); 1550 mas_set(&mas, 0); 1551 ptr = (void *)((unsigned long) check_prev_entry | 2UL); 1552 mas_store_gfp(&mas, ptr, GFP_KERNEL); 1553 ptr = mas_next(&mas, ULONG_MAX); 1554 MT_BUG_ON(mt, ptr != NULL); 1555 MT_BUG_ON(mt, (mas.index != ULONG_MAX) && (mas.last != ULONG_MAX)); 1556 1557 mas_set(&mas, 1); 1558 ptr = mas_prev(&mas, 0); 1559 MT_BUG_ON(mt, (mas.index != 0) && (mas.last != 0)); 1560 MT_BUG_ON(mt, ptr != (void *)((unsigned long) check_prev_entry | 2UL)); 1561 1562 1563 mas_unlock(&mas); 1564 } 1565 1566 static noinline void __init check_deficient_node(struct maple_tree *mt) 1567 { 1568 MA_STATE(mas, mt, 0, 0); 1569 int count; 1570 1571 mas_lock(&mas); 1572 for (count = 0; count < 10; count++) { 1573 mas_set(&mas, count); 1574 mas_store_gfp(&mas, xa_mk_value(count), GFP_KERNEL); 1575 } 1576 1577 for (count = 20; count < 39; count++) { 1578 mas_set(&mas, count); 1579 mas_store_gfp(&mas, xa_mk_value(count), GFP_KERNEL); 1580 } 1581 1582 for (count = 10; count < 12; count++) { 1583 mas_set(&mas, count); 1584 mas_store_gfp(&mas, xa_mk_value(count), GFP_KERNEL); 1585 } 1586 mas_unlock(&mas); 1587 mt_validate(mt); 1588 } 1589 1590 static noinline void __init check_gap_combining(struct maple_tree *mt) 1591 { 1592 struct maple_enode *mn1, *mn2; 1593 void *entry; 1594 unsigned long singletons = 100; 1595 static const unsigned long *seq100; 1596 static const unsigned long seq100_64[] = { 1597 /* 0-5 */ 1598 74, 75, 76, 1599 50, 100, 2, 1600 1601 /* 6-12 */ 1602 44, 45, 46, 43, 1603 20, 50, 3, 1604 1605 /* 13-20*/ 1606 80, 81, 82, 1607 76, 2, 79, 85, 4, 1608 }; 1609 1610 static const unsigned long seq100_32[] = { 1611 /* 0-5 */ 1612 61, 62, 63, 1613 50, 100, 2, 1614 1615 /* 6-12 */ 1616 31, 32, 33, 30, 1617 20, 50, 3, 1618 1619 /* 13-20*/ 1620 80, 81, 82, 1621 76, 2, 79, 85, 4, 1622 }; 1623 1624 static const unsigned long seq2000[] = { 1625 1152, 1151, 1626 1100, 1200, 2, 1627 }; 1628 static const unsigned long seq400[] = { 1629 286, 318, 1630 256, 260, 266, 270, 275, 280, 290, 398, 1631 286, 310, 1632 }; 1633 1634 unsigned long index; 1635 1636 MA_STATE(mas, mt, 0, 0); 1637 1638 if (MAPLE_32BIT) 1639 seq100 = seq100_32; 1640 else 1641 seq100 = seq100_64; 1642 1643 index = seq100[0]; 1644 mas_set(&mas, index); 1645 MT_BUG_ON(mt, !mtree_empty(mt)); 1646 check_seq(mt, singletons, false); /* create 100 singletons. */ 1647 1648 mt_set_non_kernel(1); 1649 mtree_test_erase(mt, seq100[2]); 1650 check_load(mt, seq100[2], NULL); 1651 mtree_test_erase(mt, seq100[1]); 1652 check_load(mt, seq100[1], NULL); 1653 1654 rcu_read_lock(); 1655 entry = mas_find(&mas, ULONG_MAX); 1656 MT_BUG_ON(mt, entry != xa_mk_value(index)); 1657 mn1 = mas.node; 1658 mas_next(&mas, ULONG_MAX); 1659 entry = mas_next(&mas, ULONG_MAX); 1660 MT_BUG_ON(mt, entry != xa_mk_value(index + 4)); 1661 mn2 = mas.node; 1662 MT_BUG_ON(mt, mn1 == mn2); /* test the test. */ 1663 1664 /* 1665 * At this point, there is a gap of 2 at index + 1 between seq100[3] and 1666 * seq100[4]. Search for the gap. 1667 */ 1668 mt_set_non_kernel(1); 1669 mas_reset(&mas); 1670 MT_BUG_ON(mt, mas_empty_area_rev(&mas, seq100[3], seq100[4], 1671 seq100[5])); 1672 MT_BUG_ON(mt, mas.index != index + 1); 1673 rcu_read_unlock(); 1674 1675 mtree_test_erase(mt, seq100[6]); 1676 check_load(mt, seq100[6], NULL); 1677 mtree_test_erase(mt, seq100[7]); 1678 check_load(mt, seq100[7], NULL); 1679 mtree_test_erase(mt, seq100[8]); 1680 index = seq100[9]; 1681 1682 rcu_read_lock(); 1683 mas.index = index; 1684 mas.last = index; 1685 mas_reset(&mas); 1686 entry = mas_find(&mas, ULONG_MAX); 1687 MT_BUG_ON(mt, entry != xa_mk_value(index)); 1688 mn1 = mas.node; 1689 entry = mas_next(&mas, ULONG_MAX); 1690 MT_BUG_ON(mt, entry != xa_mk_value(index + 4)); 1691 mas_next(&mas, ULONG_MAX); /* go to the next entry. */ 1692 mn2 = mas.node; 1693 MT_BUG_ON(mt, mn1 == mn2); /* test the next entry is in the next node. */ 1694 1695 /* 1696 * At this point, there is a gap of 3 at seq100[6]. Find it by 1697 * searching 20 - 50 for size 3. 1698 */ 1699 mas_reset(&mas); 1700 MT_BUG_ON(mt, mas_empty_area_rev(&mas, seq100[10], seq100[11], 1701 seq100[12])); 1702 MT_BUG_ON(mt, mas.index != seq100[6]); 1703 rcu_read_unlock(); 1704 1705 mt_set_non_kernel(1); 1706 mtree_store(mt, seq100[13], NULL, GFP_KERNEL); 1707 check_load(mt, seq100[13], NULL); 1708 check_load(mt, seq100[14], xa_mk_value(seq100[14])); 1709 mtree_store(mt, seq100[14], NULL, GFP_KERNEL); 1710 check_load(mt, seq100[13], NULL); 1711 check_load(mt, seq100[14], NULL); 1712 1713 mas_reset(&mas); 1714 rcu_read_lock(); 1715 MT_BUG_ON(mt, mas_empty_area_rev(&mas, seq100[16], seq100[15], 1716 seq100[17])); 1717 MT_BUG_ON(mt, mas.index != seq100[13]); 1718 mt_validate(mt); 1719 rcu_read_unlock(); 1720 1721 /* 1722 * *DEPRECATED: no retries anymore* Test retry entry in the start of a 1723 * gap. 1724 */ 1725 mt_set_non_kernel(2); 1726 mtree_test_store_range(mt, seq100[18], seq100[14], NULL); 1727 mtree_test_erase(mt, seq100[15]); 1728 mas_reset(&mas); 1729 rcu_read_lock(); 1730 MT_BUG_ON(mt, mas_empty_area_rev(&mas, seq100[16], seq100[19], 1731 seq100[20])); 1732 rcu_read_unlock(); 1733 MT_BUG_ON(mt, mas.index != seq100[18]); 1734 mt_validate(mt); 1735 mtree_destroy(mt); 1736 1737 /* seq 2000 tests are for multi-level tree gaps */ 1738 mt_init_flags(mt, MT_FLAGS_ALLOC_RANGE); 1739 check_seq(mt, 2000, false); 1740 mt_set_non_kernel(1); 1741 mtree_test_erase(mt, seq2000[0]); 1742 mtree_test_erase(mt, seq2000[1]); 1743 1744 mt_set_non_kernel(2); 1745 mas_reset(&mas); 1746 rcu_read_lock(); 1747 MT_BUG_ON(mt, mas_empty_area_rev(&mas, seq2000[2], seq2000[3], 1748 seq2000[4])); 1749 MT_BUG_ON(mt, mas.index != seq2000[1]); 1750 rcu_read_unlock(); 1751 mt_validate(mt); 1752 mtree_destroy(mt); 1753 1754 /* seq 400 tests rebalancing over two levels. */ 1755 mt_set_non_kernel(99); 1756 mt_init_flags(mt, MT_FLAGS_ALLOC_RANGE); 1757 check_seq(mt, 400, false); 1758 mtree_test_store_range(mt, seq400[0], seq400[1], NULL); 1759 mt_set_non_kernel(0); 1760 mtree_destroy(mt); 1761 1762 mt_init_flags(mt, MT_FLAGS_ALLOC_RANGE); 1763 check_seq(mt, 400, false); 1764 mt_set_non_kernel(50); 1765 mtree_test_store_range(mt, seq400[2], seq400[9], 1766 xa_mk_value(seq400[2])); 1767 mtree_test_store_range(mt, seq400[3], seq400[9], 1768 xa_mk_value(seq400[3])); 1769 mtree_test_store_range(mt, seq400[4], seq400[9], 1770 xa_mk_value(seq400[4])); 1771 mtree_test_store_range(mt, seq400[5], seq400[9], 1772 xa_mk_value(seq400[5])); 1773 mtree_test_store_range(mt, seq400[0], seq400[9], 1774 xa_mk_value(seq400[0])); 1775 mtree_test_store_range(mt, seq400[6], seq400[9], 1776 xa_mk_value(seq400[6])); 1777 mtree_test_store_range(mt, seq400[7], seq400[9], 1778 xa_mk_value(seq400[7])); 1779 mtree_test_store_range(mt, seq400[8], seq400[9], 1780 xa_mk_value(seq400[8])); 1781 mtree_test_store_range(mt, seq400[10], seq400[11], 1782 xa_mk_value(seq400[10])); 1783 mt_validate(mt); 1784 mt_set_non_kernel(0); 1785 mtree_destroy(mt); 1786 } 1787 static noinline void __init check_node_overwrite(struct maple_tree *mt) 1788 { 1789 int i, max = 4000; 1790 1791 for (i = 0; i < max; i++) 1792 mtree_test_store_range(mt, i*100, i*100 + 50, xa_mk_value(i*100)); 1793 1794 mtree_test_store_range(mt, 319951, 367950, NULL); 1795 /*mt_dump(mt, mt_dump_dec); */ 1796 mt_validate(mt); 1797 } 1798 1799 #if defined(BENCH_SLOT_STORE) 1800 static noinline void __init bench_slot_store(struct maple_tree *mt) 1801 { 1802 int i, brk = 105, max = 1040, brk_start = 100, count = 20000000; 1803 1804 for (i = 0; i < max; i += 10) 1805 mtree_store_range(mt, i, i + 5, xa_mk_value(i), GFP_KERNEL); 1806 1807 for (i = 0; i < count; i++) { 1808 mtree_store_range(mt, brk, brk, NULL, GFP_KERNEL); 1809 mtree_store_range(mt, brk_start, brk, xa_mk_value(brk), 1810 GFP_KERNEL); 1811 } 1812 } 1813 #endif 1814 1815 #if defined(BENCH_NODE_STORE) 1816 static noinline void __init bench_node_store(struct maple_tree *mt) 1817 { 1818 int i, overwrite = 76, max = 240, count = 20000000; 1819 1820 for (i = 0; i < max; i += 10) 1821 mtree_store_range(mt, i, i + 5, xa_mk_value(i), GFP_KERNEL); 1822 1823 for (i = 0; i < count; i++) { 1824 mtree_store_range(mt, overwrite, overwrite + 15, 1825 xa_mk_value(overwrite), GFP_KERNEL); 1826 1827 overwrite += 5; 1828 if (overwrite >= 135) 1829 overwrite = 76; 1830 } 1831 } 1832 #endif 1833 1834 #if defined(BENCH_AWALK) 1835 static noinline void __init bench_awalk(struct maple_tree *mt) 1836 { 1837 int i, max = 2500, count = 50000000; 1838 MA_STATE(mas, mt, 1470, 1470); 1839 1840 for (i = 0; i < max; i += 10) 1841 mtree_store_range(mt, i, i + 5, xa_mk_value(i), GFP_KERNEL); 1842 1843 mtree_store_range(mt, 1470, 1475, NULL, GFP_KERNEL); 1844 1845 for (i = 0; i < count; i++) { 1846 mas_empty_area_rev(&mas, 0, 2000, 10); 1847 mas_reset(&mas); 1848 } 1849 } 1850 #endif 1851 #if defined(BENCH_WALK) 1852 static noinline void __init bench_walk(struct maple_tree *mt) 1853 { 1854 int i, max = 2500, count = 550000000; 1855 MA_STATE(mas, mt, 1470, 1470); 1856 1857 for (i = 0; i < max; i += 10) 1858 mtree_store_range(mt, i, i + 5, xa_mk_value(i), GFP_KERNEL); 1859 1860 for (i = 0; i < count; i++) { 1861 mas_walk(&mas); 1862 mas_reset(&mas); 1863 } 1864 1865 } 1866 #endif 1867 1868 #if defined(BENCH_LOAD) 1869 static noinline void __init bench_load(struct maple_tree *mt) 1870 { 1871 int i, max = 2500, count = 550000000; 1872 1873 for (i = 0; i < max; i += 10) 1874 mtree_store_range(mt, i, i + 5, xa_mk_value(i), GFP_KERNEL); 1875 1876 for (i = 0; i < count; i++) 1877 mtree_load(mt, 1470); 1878 } 1879 #endif 1880 1881 #if defined(BENCH_MT_FOR_EACH) 1882 static noinline void __init bench_mt_for_each(struct maple_tree *mt) 1883 { 1884 int i, count = 1000000; 1885 unsigned long max = 2500, index = 0; 1886 void *entry; 1887 1888 for (i = 0; i < max; i += 5) 1889 mtree_store_range(mt, i, i + 4, xa_mk_value(i), GFP_KERNEL); 1890 1891 for (i = 0; i < count; i++) { 1892 unsigned long j = 0; 1893 1894 mt_for_each(mt, entry, index, max) { 1895 MT_BUG_ON(mt, entry != xa_mk_value(j)); 1896 j += 5; 1897 } 1898 1899 index = 0; 1900 } 1901 1902 } 1903 #endif 1904 1905 #if defined(BENCH_MAS_FOR_EACH) 1906 static noinline void __init bench_mas_for_each(struct maple_tree *mt) 1907 { 1908 int i, count = 1000000; 1909 unsigned long max = 2500; 1910 void *entry; 1911 MA_STATE(mas, mt, 0, 0); 1912 1913 for (i = 0; i < max; i += 5) { 1914 int gap = 4; 1915 1916 if (i % 30 == 0) 1917 gap = 3; 1918 mtree_store_range(mt, i, i + gap, xa_mk_value(i), GFP_KERNEL); 1919 } 1920 1921 rcu_read_lock(); 1922 for (i = 0; i < count; i++) { 1923 unsigned long j = 0; 1924 1925 mas_for_each(&mas, entry, max) { 1926 MT_BUG_ON(mt, entry != xa_mk_value(j)); 1927 j += 5; 1928 } 1929 mas_set(&mas, 0); 1930 } 1931 rcu_read_unlock(); 1932 1933 } 1934 #endif 1935 #if defined(BENCH_MAS_PREV) 1936 static noinline void __init bench_mas_prev(struct maple_tree *mt) 1937 { 1938 int i, count = 1000000; 1939 unsigned long max = 2500; 1940 void *entry; 1941 MA_STATE(mas, mt, 0, 0); 1942 1943 for (i = 0; i < max; i += 5) { 1944 int gap = 4; 1945 1946 if (i % 30 == 0) 1947 gap = 3; 1948 mtree_store_range(mt, i, i + gap, xa_mk_value(i), GFP_KERNEL); 1949 } 1950 1951 rcu_read_lock(); 1952 for (i = 0; i < count; i++) { 1953 unsigned long j = 2495; 1954 1955 mas_set(&mas, ULONG_MAX); 1956 while ((entry = mas_prev(&mas, 0)) != NULL) { 1957 MT_BUG_ON(mt, entry != xa_mk_value(j)); 1958 j -= 5; 1959 } 1960 } 1961 rcu_read_unlock(); 1962 1963 } 1964 #endif 1965 /* check_forking - simulate the kernel forking sequence with the tree. */ 1966 static noinline void __init check_forking(void) 1967 { 1968 struct maple_tree mt, newmt; 1969 int i, nr_entries = 134, ret; 1970 void *val; 1971 MA_STATE(mas, &mt, 0, 0); 1972 MA_STATE(newmas, &newmt, 0, 0); 1973 struct rw_semaphore mt_lock, newmt_lock; 1974 1975 init_rwsem(&mt_lock); 1976 init_rwsem(&newmt_lock); 1977 1978 mt_init_flags(&mt, MT_FLAGS_ALLOC_RANGE | MT_FLAGS_LOCK_EXTERN); 1979 mt_set_external_lock(&mt, &mt_lock); 1980 1981 mt_init_flags(&newmt, MT_FLAGS_ALLOC_RANGE | MT_FLAGS_LOCK_EXTERN); 1982 mt_set_external_lock(&newmt, &newmt_lock); 1983 1984 down_write(&mt_lock); 1985 for (i = 0; i <= nr_entries; i++) { 1986 mas_set_range(&mas, i*10, i*10 + 5); 1987 mas_store_gfp(&mas, xa_mk_value(i), GFP_KERNEL); 1988 } 1989 1990 down_write_nested(&newmt_lock, SINGLE_DEPTH_NESTING); 1991 ret = __mt_dup(&mt, &newmt, GFP_KERNEL); 1992 if (ret) { 1993 pr_err("OOM!"); 1994 BUG_ON(1); 1995 } 1996 1997 mas_set(&newmas, 0); 1998 mas_for_each(&newmas, val, ULONG_MAX) 1999 mas_store(&newmas, val); 2000 2001 mas_destroy(&newmas); 2002 mas_destroy(&mas); 2003 mt_validate(&newmt); 2004 __mt_destroy(&newmt); 2005 __mt_destroy(&mt); 2006 up_write(&newmt_lock); 2007 up_write(&mt_lock); 2008 } 2009 2010 static noinline void __init check_iteration(struct maple_tree *mt) 2011 { 2012 int i, nr_entries = 125; 2013 void *val; 2014 MA_STATE(mas, mt, 0, 0); 2015 2016 for (i = 0; i <= nr_entries; i++) 2017 mtree_store_range(mt, i * 10, i * 10 + 9, 2018 xa_mk_value(i), GFP_KERNEL); 2019 2020 mt_set_non_kernel(99999); 2021 2022 i = 0; 2023 mas_lock(&mas); 2024 mas_for_each(&mas, val, 925) { 2025 MT_BUG_ON(mt, mas.index != i * 10); 2026 MT_BUG_ON(mt, mas.last != i * 10 + 9); 2027 /* Overwrite end of entry 92 */ 2028 if (i == 92) { 2029 mas.index = 925; 2030 mas.last = 929; 2031 mas_store(&mas, val); 2032 } 2033 i++; 2034 } 2035 /* Ensure mas_find() gets the next value */ 2036 val = mas_find(&mas, ULONG_MAX); 2037 MT_BUG_ON(mt, val != xa_mk_value(i)); 2038 2039 mas_set(&mas, 0); 2040 i = 0; 2041 mas_for_each(&mas, val, 785) { 2042 MT_BUG_ON(mt, mas.index != i * 10); 2043 MT_BUG_ON(mt, mas.last != i * 10 + 9); 2044 /* Overwrite start of entry 78 */ 2045 if (i == 78) { 2046 mas.index = 780; 2047 mas.last = 785; 2048 mas_store(&mas, val); 2049 } else { 2050 i++; 2051 } 2052 } 2053 val = mas_find(&mas, ULONG_MAX); 2054 MT_BUG_ON(mt, val != xa_mk_value(i)); 2055 2056 mas_set(&mas, 0); 2057 i = 0; 2058 mas_for_each(&mas, val, 765) { 2059 MT_BUG_ON(mt, mas.index != i * 10); 2060 MT_BUG_ON(mt, mas.last != i * 10 + 9); 2061 /* Overwrite end of entry 76 and advance to the end */ 2062 if (i == 76) { 2063 mas.index = 760; 2064 mas.last = 765; 2065 mas_store(&mas, val); 2066 } 2067 i++; 2068 } 2069 /* Make sure the next find returns the one after 765, 766-769 */ 2070 val = mas_find(&mas, ULONG_MAX); 2071 MT_BUG_ON(mt, val != xa_mk_value(76)); 2072 mas_unlock(&mas); 2073 mas_destroy(&mas); 2074 mt_set_non_kernel(0); 2075 } 2076 2077 static noinline void __init check_mas_store_gfp(struct maple_tree *mt) 2078 { 2079 2080 struct maple_tree newmt; 2081 int i, nr_entries = 135; 2082 void *val; 2083 MA_STATE(mas, mt, 0, 0); 2084 MA_STATE(newmas, mt, 0, 0); 2085 2086 for (i = 0; i <= nr_entries; i++) 2087 mtree_store_range(mt, i*10, i*10 + 5, 2088 xa_mk_value(i), GFP_KERNEL); 2089 2090 mt_set_non_kernel(99999); 2091 mt_init_flags(&newmt, MT_FLAGS_ALLOC_RANGE); 2092 newmas.tree = &newmt; 2093 rcu_read_lock(); 2094 mas_lock(&newmas); 2095 mas_reset(&newmas); 2096 mas_set(&mas, 0); 2097 mas_for_each(&mas, val, ULONG_MAX) { 2098 newmas.index = mas.index; 2099 newmas.last = mas.last; 2100 mas_store_gfp(&newmas, val, GFP_KERNEL); 2101 } 2102 mas_unlock(&newmas); 2103 rcu_read_unlock(); 2104 mt_validate(&newmt); 2105 mt_set_non_kernel(0); 2106 mtree_destroy(&newmt); 2107 } 2108 2109 #if defined(BENCH_FORK) 2110 static noinline void __init bench_forking(void) 2111 { 2112 struct maple_tree mt, newmt; 2113 int i, nr_entries = 134, nr_fork = 80000, ret; 2114 void *val; 2115 MA_STATE(mas, &mt, 0, 0); 2116 MA_STATE(newmas, &newmt, 0, 0); 2117 struct rw_semaphore mt_lock, newmt_lock; 2118 2119 init_rwsem(&mt_lock); 2120 init_rwsem(&newmt_lock); 2121 2122 mt_init_flags(&mt, MT_FLAGS_ALLOC_RANGE | MT_FLAGS_LOCK_EXTERN); 2123 mt_set_external_lock(&mt, &mt_lock); 2124 2125 down_write(&mt_lock); 2126 for (i = 0; i <= nr_entries; i++) { 2127 mas_set_range(&mas, i*10, i*10 + 5); 2128 mas_store_gfp(&mas, xa_mk_value(i), GFP_KERNEL); 2129 } 2130 2131 for (i = 0; i < nr_fork; i++) { 2132 mt_init_flags(&newmt, 2133 MT_FLAGS_ALLOC_RANGE | MT_FLAGS_LOCK_EXTERN); 2134 mt_set_external_lock(&newmt, &newmt_lock); 2135 2136 down_write_nested(&newmt_lock, SINGLE_DEPTH_NESTING); 2137 ret = __mt_dup(&mt, &newmt, GFP_KERNEL); 2138 if (ret) { 2139 pr_err("OOM!"); 2140 BUG_ON(1); 2141 } 2142 2143 mas_set(&newmas, 0); 2144 mas_for_each(&newmas, val, ULONG_MAX) 2145 mas_store(&newmas, val); 2146 2147 mas_destroy(&newmas); 2148 mt_validate(&newmt); 2149 __mt_destroy(&newmt); 2150 up_write(&newmt_lock); 2151 } 2152 mas_destroy(&mas); 2153 __mt_destroy(&mt); 2154 up_write(&mt_lock); 2155 } 2156 #endif 2157 2158 static noinline void __init next_prev_test(struct maple_tree *mt) 2159 { 2160 int i, nr_entries; 2161 void *val; 2162 MA_STATE(mas, mt, 0, 0); 2163 struct maple_enode *mn; 2164 static const unsigned long *level2; 2165 static const unsigned long level2_64[] = { 707, 1000, 710, 715, 720, 2166 725}; 2167 static const unsigned long level2_32[] = { 1747, 2000, 1750, 1755, 2168 1760, 1765}; 2169 unsigned long last_index; 2170 2171 if (MAPLE_32BIT) { 2172 nr_entries = 500; 2173 level2 = level2_32; 2174 last_index = 0x138e; 2175 } else { 2176 nr_entries = 200; 2177 level2 = level2_64; 2178 last_index = 0x7d6; 2179 } 2180 2181 for (i = 0; i <= nr_entries; i++) 2182 mtree_store_range(mt, i*10, i*10 + 5, 2183 xa_mk_value(i), GFP_KERNEL); 2184 2185 mas_lock(&mas); 2186 for (i = 0; i <= nr_entries / 2; i++) { 2187 mas_next(&mas, 1000); 2188 if (mas_is_none(&mas)) 2189 break; 2190 2191 } 2192 mas_reset(&mas); 2193 mas_set(&mas, 0); 2194 i = 0; 2195 mas_for_each(&mas, val, 1000) { 2196 i++; 2197 } 2198 2199 mas_reset(&mas); 2200 mas_set(&mas, 0); 2201 i = 0; 2202 mas_for_each(&mas, val, 1000) { 2203 mas_pause(&mas); 2204 i++; 2205 } 2206 2207 /* 2208 * 680 - 685 = 0x61a00001930c 2209 * 686 - 689 = NULL; 2210 * 690 - 695 = 0x61a00001930c 2211 * Check simple next/prev 2212 */ 2213 mas_set(&mas, 686); 2214 val = mas_walk(&mas); 2215 MT_BUG_ON(mt, val != NULL); 2216 2217 val = mas_next(&mas, 1000); 2218 MT_BUG_ON(mt, val != xa_mk_value(690 / 10)); 2219 MT_BUG_ON(mt, mas.index != 690); 2220 MT_BUG_ON(mt, mas.last != 695); 2221 2222 val = mas_prev(&mas, 0); 2223 MT_BUG_ON(mt, val != xa_mk_value(680 / 10)); 2224 MT_BUG_ON(mt, mas.index != 680); 2225 MT_BUG_ON(mt, mas.last != 685); 2226 2227 val = mas_next(&mas, 1000); 2228 MT_BUG_ON(mt, val != xa_mk_value(690 / 10)); 2229 MT_BUG_ON(mt, mas.index != 690); 2230 MT_BUG_ON(mt, mas.last != 695); 2231 2232 val = mas_next(&mas, 1000); 2233 MT_BUG_ON(mt, val != xa_mk_value(700 / 10)); 2234 MT_BUG_ON(mt, mas.index != 700); 2235 MT_BUG_ON(mt, mas.last != 705); 2236 2237 /* Check across node boundaries of the tree */ 2238 mas_set(&mas, 70); 2239 val = mas_walk(&mas); 2240 MT_BUG_ON(mt, val != xa_mk_value(70 / 10)); 2241 MT_BUG_ON(mt, mas.index != 70); 2242 MT_BUG_ON(mt, mas.last != 75); 2243 2244 val = mas_next(&mas, 1000); 2245 MT_BUG_ON(mt, val != xa_mk_value(80 / 10)); 2246 MT_BUG_ON(mt, mas.index != 80); 2247 MT_BUG_ON(mt, mas.last != 85); 2248 2249 val = mas_prev(&mas, 70); 2250 MT_BUG_ON(mt, val != xa_mk_value(70 / 10)); 2251 MT_BUG_ON(mt, mas.index != 70); 2252 MT_BUG_ON(mt, mas.last != 75); 2253 2254 /* Check across two levels of the tree */ 2255 mas_reset(&mas); 2256 mas_set(&mas, level2[0]); 2257 val = mas_walk(&mas); 2258 MT_BUG_ON(mt, val != NULL); 2259 val = mas_next(&mas, level2[1]); 2260 MT_BUG_ON(mt, val != xa_mk_value(level2[2] / 10)); 2261 MT_BUG_ON(mt, mas.index != level2[2]); 2262 MT_BUG_ON(mt, mas.last != level2[3]); 2263 mn = mas.node; 2264 2265 val = mas_next(&mas, level2[1]); 2266 MT_BUG_ON(mt, val != xa_mk_value(level2[4] / 10)); 2267 MT_BUG_ON(mt, mas.index != level2[4]); 2268 MT_BUG_ON(mt, mas.last != level2[5]); 2269 MT_BUG_ON(mt, mn == mas.node); 2270 2271 val = mas_prev(&mas, 0); 2272 MT_BUG_ON(mt, val != xa_mk_value(level2[2] / 10)); 2273 MT_BUG_ON(mt, mas.index != level2[2]); 2274 MT_BUG_ON(mt, mas.last != level2[3]); 2275 2276 /* Check running off the end and back on */ 2277 mas_set(&mas, nr_entries * 10); 2278 val = mas_walk(&mas); 2279 MT_BUG_ON(mt, val != xa_mk_value(nr_entries)); 2280 MT_BUG_ON(mt, mas.index != (nr_entries * 10)); 2281 MT_BUG_ON(mt, mas.last != (nr_entries * 10 + 5)); 2282 2283 val = mas_next(&mas, ULONG_MAX); 2284 MT_BUG_ON(mt, val != NULL); 2285 MT_BUG_ON(mt, mas.index != last_index); 2286 MT_BUG_ON(mt, mas.last != ULONG_MAX); 2287 2288 val = mas_prev(&mas, 0); 2289 MT_BUG_ON(mt, val != xa_mk_value(nr_entries)); 2290 MT_BUG_ON(mt, mas.index != (nr_entries * 10)); 2291 MT_BUG_ON(mt, mas.last != (nr_entries * 10 + 5)); 2292 2293 /* Check running off the start and back on */ 2294 mas_reset(&mas); 2295 mas_set(&mas, 10); 2296 val = mas_walk(&mas); 2297 MT_BUG_ON(mt, val != xa_mk_value(1)); 2298 MT_BUG_ON(mt, mas.index != 10); 2299 MT_BUG_ON(mt, mas.last != 15); 2300 2301 val = mas_prev(&mas, 0); 2302 MT_BUG_ON(mt, val != xa_mk_value(0)); 2303 MT_BUG_ON(mt, mas.index != 0); 2304 MT_BUG_ON(mt, mas.last != 5); 2305 2306 val = mas_prev(&mas, 0); 2307 MT_BUG_ON(mt, val != NULL); 2308 MT_BUG_ON(mt, mas.index != 0); 2309 MT_BUG_ON(mt, mas.last != 5); 2310 MT_BUG_ON(mt, !mas_is_underflow(&mas)); 2311 2312 mas.index = 0; 2313 mas.last = 5; 2314 mas_store(&mas, NULL); 2315 mas_reset(&mas); 2316 mas_set(&mas, 10); 2317 mas_walk(&mas); 2318 2319 val = mas_prev(&mas, 0); 2320 MT_BUG_ON(mt, val != NULL); 2321 MT_BUG_ON(mt, mas.index != 0); 2322 MT_BUG_ON(mt, mas.last != 9); 2323 mas_unlock(&mas); 2324 2325 mtree_destroy(mt); 2326 2327 mt_init(mt); 2328 mtree_store_range(mt, 0, 0, xa_mk_value(0), GFP_KERNEL); 2329 mtree_store_range(mt, 5, 5, xa_mk_value(5), GFP_KERNEL); 2330 rcu_read_lock(); 2331 mas_set(&mas, 5); 2332 val = mas_prev(&mas, 4); 2333 MT_BUG_ON(mt, val != NULL); 2334 rcu_read_unlock(); 2335 } 2336 2337 2338 2339 /* Test spanning writes that require balancing right sibling or right cousin */ 2340 static noinline void __init check_spanning_relatives(struct maple_tree *mt) 2341 { 2342 2343 unsigned long i, nr_entries = 1000; 2344 2345 for (i = 0; i <= nr_entries; i++) 2346 mtree_store_range(mt, i*10, i*10 + 5, 2347 xa_mk_value(i), GFP_KERNEL); 2348 2349 2350 mtree_store_range(mt, 9365, 9955, NULL, GFP_KERNEL); 2351 } 2352 2353 static noinline void __init check_fuzzer(struct maple_tree *mt) 2354 { 2355 /* 2356 * 1. Causes a spanning rebalance of a single root node. 2357 * Fixed by setting the correct limit in mast_cp_to_nodes() when the 2358 * entire right side is consumed. 2359 */ 2360 mtree_test_insert(mt, 88, (void *)0xb1); 2361 mtree_test_insert(mt, 84, (void *)0xa9); 2362 mtree_test_insert(mt, 2, (void *)0x5); 2363 mtree_test_insert(mt, 4, (void *)0x9); 2364 mtree_test_insert(mt, 14, (void *)0x1d); 2365 mtree_test_insert(mt, 7, (void *)0xf); 2366 mtree_test_insert(mt, 12, (void *)0x19); 2367 mtree_test_insert(mt, 18, (void *)0x25); 2368 mtree_test_store_range(mt, 8, 18, (void *)0x11); 2369 mtree_destroy(mt); 2370 2371 2372 /* 2373 * 2. Cause a spanning rebalance of two nodes in root. 2374 * Fixed by setting mast->r->max correctly. 2375 */ 2376 mt_init_flags(mt, 0); 2377 mtree_test_store(mt, 87, (void *)0xaf); 2378 mtree_test_store(mt, 0, (void *)0x1); 2379 mtree_test_load(mt, 4); 2380 mtree_test_insert(mt, 4, (void *)0x9); 2381 mtree_test_store(mt, 8, (void *)0x11); 2382 mtree_test_store(mt, 44, (void *)0x59); 2383 mtree_test_store(mt, 68, (void *)0x89); 2384 mtree_test_store(mt, 2, (void *)0x5); 2385 mtree_test_insert(mt, 43, (void *)0x57); 2386 mtree_test_insert(mt, 24, (void *)0x31); 2387 mtree_test_insert(mt, 844, (void *)0x699); 2388 mtree_test_store(mt, 84, (void *)0xa9); 2389 mtree_test_store(mt, 4, (void *)0x9); 2390 mtree_test_erase(mt, 4); 2391 mtree_test_load(mt, 5); 2392 mtree_test_erase(mt, 0); 2393 mtree_destroy(mt); 2394 2395 /* 2396 * 3. Cause a node overflow on copy 2397 * Fixed by using the correct check for node size in mas_wr_modify() 2398 * Also discovered issue with metadata setting. 2399 */ 2400 mt_init_flags(mt, 0); 2401 mtree_test_store_range(mt, 0, ULONG_MAX, (void *)0x1); 2402 mtree_test_store(mt, 4, (void *)0x9); 2403 mtree_test_erase(mt, 5); 2404 mtree_test_erase(mt, 0); 2405 mtree_test_erase(mt, 4); 2406 mtree_test_store(mt, 5, (void *)0xb); 2407 mtree_test_erase(mt, 5); 2408 mtree_test_store(mt, 5, (void *)0xb); 2409 mtree_test_erase(mt, 5); 2410 mtree_test_erase(mt, 4); 2411 mtree_test_store(mt, 4, (void *)0x9); 2412 mtree_test_store(mt, 444, (void *)0x379); 2413 mtree_test_store(mt, 0, (void *)0x1); 2414 mtree_test_load(mt, 0); 2415 mtree_test_store(mt, 5, (void *)0xb); 2416 mtree_test_erase(mt, 0); 2417 mtree_destroy(mt); 2418 2419 /* 2420 * 4. spanning store failure due to writing incorrect pivot value at 2421 * last slot. 2422 * Fixed by setting mast->r->max correctly in mast_cp_to_nodes() 2423 * 2424 */ 2425 mt_init_flags(mt, 0); 2426 mtree_test_insert(mt, 261, (void *)0x20b); 2427 mtree_test_store(mt, 516, (void *)0x409); 2428 mtree_test_store(mt, 6, (void *)0xd); 2429 mtree_test_insert(mt, 5, (void *)0xb); 2430 mtree_test_insert(mt, 1256, (void *)0x9d1); 2431 mtree_test_store(mt, 4, (void *)0x9); 2432 mtree_test_erase(mt, 1); 2433 mtree_test_store(mt, 56, (void *)0x71); 2434 mtree_test_insert(mt, 1, (void *)0x3); 2435 mtree_test_store(mt, 24, (void *)0x31); 2436 mtree_test_erase(mt, 1); 2437 mtree_test_insert(mt, 2263, (void *)0x11af); 2438 mtree_test_insert(mt, 446, (void *)0x37d); 2439 mtree_test_store_range(mt, 6, 45, (void *)0xd); 2440 mtree_test_store_range(mt, 3, 446, (void *)0x7); 2441 mtree_destroy(mt); 2442 2443 /* 2444 * 5. mas_wr_extend_null() may overflow slots. 2445 * Fix by checking against wr_mas->node_end. 2446 */ 2447 mt_init_flags(mt, 0); 2448 mtree_test_store(mt, 48, (void *)0x61); 2449 mtree_test_store(mt, 3, (void *)0x7); 2450 mtree_test_load(mt, 0); 2451 mtree_test_store(mt, 88, (void *)0xb1); 2452 mtree_test_store(mt, 81, (void *)0xa3); 2453 mtree_test_insert(mt, 0, (void *)0x1); 2454 mtree_test_insert(mt, 8, (void *)0x11); 2455 mtree_test_insert(mt, 4, (void *)0x9); 2456 mtree_test_insert(mt, 2480, (void *)0x1361); 2457 mtree_test_insert(mt, ULONG_MAX, 2458 (void *)0xffffffffffffffff); 2459 mtree_test_erase(mt, ULONG_MAX); 2460 mtree_destroy(mt); 2461 2462 /* 2463 * 6. When reusing a node with an implied pivot and the node is 2464 * shrinking, old data would be left in the implied slot 2465 * Fixed by checking the last pivot for the mas->max and clear 2466 * accordingly. This only affected the left-most node as that node is 2467 * the only one allowed to end in NULL. 2468 */ 2469 mt_init_flags(mt, 0); 2470 mtree_test_erase(mt, 3); 2471 mtree_test_insert(mt, 22, (void *)0x2d); 2472 mtree_test_insert(mt, 15, (void *)0x1f); 2473 mtree_test_load(mt, 2); 2474 mtree_test_insert(mt, 1, (void *)0x3); 2475 mtree_test_insert(mt, 1, (void *)0x3); 2476 mtree_test_insert(mt, 5, (void *)0xb); 2477 mtree_test_erase(mt, 1); 2478 mtree_test_insert(mt, 1, (void *)0x3); 2479 mtree_test_insert(mt, 4, (void *)0x9); 2480 mtree_test_insert(mt, 1, (void *)0x3); 2481 mtree_test_erase(mt, 1); 2482 mtree_test_insert(mt, 2, (void *)0x5); 2483 mtree_test_insert(mt, 1, (void *)0x3); 2484 mtree_test_erase(mt, 3); 2485 mtree_test_insert(mt, 22, (void *)0x2d); 2486 mtree_test_insert(mt, 15, (void *)0x1f); 2487 mtree_test_insert(mt, 2, (void *)0x5); 2488 mtree_test_insert(mt, 1, (void *)0x3); 2489 mtree_test_insert(mt, 8, (void *)0x11); 2490 mtree_test_load(mt, 2); 2491 mtree_test_insert(mt, 1, (void *)0x3); 2492 mtree_test_insert(mt, 1, (void *)0x3); 2493 mtree_test_store(mt, 1, (void *)0x3); 2494 mtree_test_insert(mt, 5, (void *)0xb); 2495 mtree_test_erase(mt, 1); 2496 mtree_test_insert(mt, 1, (void *)0x3); 2497 mtree_test_insert(mt, 4, (void *)0x9); 2498 mtree_test_insert(mt, 1, (void *)0x3); 2499 mtree_test_erase(mt, 1); 2500 mtree_test_insert(mt, 2, (void *)0x5); 2501 mtree_test_insert(mt, 1, (void *)0x3); 2502 mtree_test_erase(mt, 3); 2503 mtree_test_insert(mt, 22, (void *)0x2d); 2504 mtree_test_insert(mt, 15, (void *)0x1f); 2505 mtree_test_insert(mt, 2, (void *)0x5); 2506 mtree_test_insert(mt, 1, (void *)0x3); 2507 mtree_test_insert(mt, 8, (void *)0x11); 2508 mtree_test_insert(mt, 12, (void *)0x19); 2509 mtree_test_erase(mt, 1); 2510 mtree_test_store_range(mt, 4, 62, (void *)0x9); 2511 mtree_test_erase(mt, 62); 2512 mtree_test_store_range(mt, 1, 0, (void *)0x3); 2513 mtree_test_insert(mt, 11, (void *)0x17); 2514 mtree_test_insert(mt, 3, (void *)0x7); 2515 mtree_test_insert(mt, 3, (void *)0x7); 2516 mtree_test_store(mt, 62, (void *)0x7d); 2517 mtree_test_erase(mt, 62); 2518 mtree_test_store_range(mt, 1, 15, (void *)0x3); 2519 mtree_test_erase(mt, 1); 2520 mtree_test_insert(mt, 22, (void *)0x2d); 2521 mtree_test_insert(mt, 12, (void *)0x19); 2522 mtree_test_erase(mt, 1); 2523 mtree_test_insert(mt, 3, (void *)0x7); 2524 mtree_test_store(mt, 62, (void *)0x7d); 2525 mtree_test_erase(mt, 62); 2526 mtree_test_insert(mt, 122, (void *)0xf5); 2527 mtree_test_store(mt, 3, (void *)0x7); 2528 mtree_test_insert(mt, 0, (void *)0x1); 2529 mtree_test_store_range(mt, 0, 1, (void *)0x1); 2530 mtree_test_insert(mt, 85, (void *)0xab); 2531 mtree_test_insert(mt, 72, (void *)0x91); 2532 mtree_test_insert(mt, 81, (void *)0xa3); 2533 mtree_test_insert(mt, 726, (void *)0x5ad); 2534 mtree_test_insert(mt, 0, (void *)0x1); 2535 mtree_test_insert(mt, 1, (void *)0x3); 2536 mtree_test_store(mt, 51, (void *)0x67); 2537 mtree_test_insert(mt, 611, (void *)0x4c7); 2538 mtree_test_insert(mt, 485, (void *)0x3cb); 2539 mtree_test_insert(mt, 1, (void *)0x3); 2540 mtree_test_erase(mt, 1); 2541 mtree_test_insert(mt, 0, (void *)0x1); 2542 mtree_test_insert(mt, 1, (void *)0x3); 2543 mtree_test_insert_range(mt, 26, 1, (void *)0x35); 2544 mtree_test_load(mt, 1); 2545 mtree_test_store_range(mt, 1, 22, (void *)0x3); 2546 mtree_test_insert(mt, 1, (void *)0x3); 2547 mtree_test_erase(mt, 1); 2548 mtree_test_load(mt, 53); 2549 mtree_test_load(mt, 1); 2550 mtree_test_store_range(mt, 1, 1, (void *)0x3); 2551 mtree_test_insert(mt, 222, (void *)0x1bd); 2552 mtree_test_insert(mt, 485, (void *)0x3cb); 2553 mtree_test_insert(mt, 1, (void *)0x3); 2554 mtree_test_erase(mt, 1); 2555 mtree_test_load(mt, 0); 2556 mtree_test_insert(mt, 21, (void *)0x2b); 2557 mtree_test_insert(mt, 3, (void *)0x7); 2558 mtree_test_store(mt, 621, (void *)0x4db); 2559 mtree_test_insert(mt, 0, (void *)0x1); 2560 mtree_test_erase(mt, 5); 2561 mtree_test_insert(mt, 1, (void *)0x3); 2562 mtree_test_store(mt, 62, (void *)0x7d); 2563 mtree_test_erase(mt, 62); 2564 mtree_test_store_range(mt, 1, 0, (void *)0x3); 2565 mtree_test_insert(mt, 22, (void *)0x2d); 2566 mtree_test_insert(mt, 12, (void *)0x19); 2567 mtree_test_erase(mt, 1); 2568 mtree_test_insert(mt, 1, (void *)0x3); 2569 mtree_test_store_range(mt, 4, 62, (void *)0x9); 2570 mtree_test_erase(mt, 62); 2571 mtree_test_erase(mt, 1); 2572 mtree_test_load(mt, 1); 2573 mtree_test_store_range(mt, 1, 22, (void *)0x3); 2574 mtree_test_insert(mt, 1, (void *)0x3); 2575 mtree_test_erase(mt, 1); 2576 mtree_test_load(mt, 53); 2577 mtree_test_load(mt, 1); 2578 mtree_test_store_range(mt, 1, 1, (void *)0x3); 2579 mtree_test_insert(mt, 222, (void *)0x1bd); 2580 mtree_test_insert(mt, 485, (void *)0x3cb); 2581 mtree_test_insert(mt, 1, (void *)0x3); 2582 mtree_test_erase(mt, 1); 2583 mtree_test_insert(mt, 1, (void *)0x3); 2584 mtree_test_load(mt, 0); 2585 mtree_test_load(mt, 0); 2586 mtree_destroy(mt); 2587 2588 /* 2589 * 7. Previous fix was incomplete, fix mas_resuse_node() clearing of old 2590 * data by overwriting it first - that way metadata is of no concern. 2591 */ 2592 mt_init_flags(mt, 0); 2593 mtree_test_load(mt, 1); 2594 mtree_test_insert(mt, 102, (void *)0xcd); 2595 mtree_test_erase(mt, 2); 2596 mtree_test_erase(mt, 0); 2597 mtree_test_load(mt, 0); 2598 mtree_test_insert(mt, 4, (void *)0x9); 2599 mtree_test_insert(mt, 2, (void *)0x5); 2600 mtree_test_insert(mt, 110, (void *)0xdd); 2601 mtree_test_insert(mt, 1, (void *)0x3); 2602 mtree_test_insert_range(mt, 5, 0, (void *)0xb); 2603 mtree_test_erase(mt, 2); 2604 mtree_test_store(mt, 0, (void *)0x1); 2605 mtree_test_store(mt, 112, (void *)0xe1); 2606 mtree_test_insert(mt, 21, (void *)0x2b); 2607 mtree_test_store(mt, 1, (void *)0x3); 2608 mtree_test_insert_range(mt, 110, 2, (void *)0xdd); 2609 mtree_test_store(mt, 2, (void *)0x5); 2610 mtree_test_load(mt, 22); 2611 mtree_test_erase(mt, 2); 2612 mtree_test_store(mt, 210, (void *)0x1a5); 2613 mtree_test_store_range(mt, 0, 2, (void *)0x1); 2614 mtree_test_store(mt, 2, (void *)0x5); 2615 mtree_test_erase(mt, 2); 2616 mtree_test_erase(mt, 22); 2617 mtree_test_erase(mt, 1); 2618 mtree_test_erase(mt, 2); 2619 mtree_test_store(mt, 0, (void *)0x1); 2620 mtree_test_load(mt, 112); 2621 mtree_test_insert(mt, 2, (void *)0x5); 2622 mtree_test_erase(mt, 2); 2623 mtree_test_store(mt, 1, (void *)0x3); 2624 mtree_test_insert_range(mt, 1, 2, (void *)0x3); 2625 mtree_test_erase(mt, 0); 2626 mtree_test_erase(mt, 2); 2627 mtree_test_store(mt, 2, (void *)0x5); 2628 mtree_test_erase(mt, 0); 2629 mtree_test_erase(mt, 2); 2630 mtree_test_store(mt, 0, (void *)0x1); 2631 mtree_test_store(mt, 0, (void *)0x1); 2632 mtree_test_erase(mt, 2); 2633 mtree_test_store(mt, 2, (void *)0x5); 2634 mtree_test_erase(mt, 2); 2635 mtree_test_insert(mt, 2, (void *)0x5); 2636 mtree_test_insert_range(mt, 1, 2, (void *)0x3); 2637 mtree_test_erase(mt, 0); 2638 mtree_test_erase(mt, 2); 2639 mtree_test_store(mt, 0, (void *)0x1); 2640 mtree_test_load(mt, 112); 2641 mtree_test_store_range(mt, 110, 12, (void *)0xdd); 2642 mtree_test_store(mt, 2, (void *)0x5); 2643 mtree_test_load(mt, 110); 2644 mtree_test_insert_range(mt, 4, 71, (void *)0x9); 2645 mtree_test_load(mt, 2); 2646 mtree_test_store(mt, 2, (void *)0x5); 2647 mtree_test_insert_range(mt, 11, 22, (void *)0x17); 2648 mtree_test_erase(mt, 12); 2649 mtree_test_store(mt, 2, (void *)0x5); 2650 mtree_test_load(mt, 22); 2651 mtree_destroy(mt); 2652 2653 2654 /* 2655 * 8. When rebalancing or spanning_rebalance(), the max of the new node 2656 * may be set incorrectly to the final pivot and not the right max. 2657 * Fix by setting the left max to orig right max if the entire node is 2658 * consumed. 2659 */ 2660 mt_init_flags(mt, 0); 2661 mtree_test_store(mt, 6, (void *)0xd); 2662 mtree_test_store(mt, 67, (void *)0x87); 2663 mtree_test_insert(mt, 15, (void *)0x1f); 2664 mtree_test_insert(mt, 6716, (void *)0x3479); 2665 mtree_test_store(mt, 61, (void *)0x7b); 2666 mtree_test_insert(mt, 13, (void *)0x1b); 2667 mtree_test_store(mt, 8, (void *)0x11); 2668 mtree_test_insert(mt, 1, (void *)0x3); 2669 mtree_test_load(mt, 0); 2670 mtree_test_erase(mt, 67167); 2671 mtree_test_insert_range(mt, 6, 7167, (void *)0xd); 2672 mtree_test_insert(mt, 6, (void *)0xd); 2673 mtree_test_erase(mt, 67); 2674 mtree_test_insert(mt, 1, (void *)0x3); 2675 mtree_test_erase(mt, 667167); 2676 mtree_test_insert(mt, 6, (void *)0xd); 2677 mtree_test_store(mt, 67, (void *)0x87); 2678 mtree_test_insert(mt, 5, (void *)0xb); 2679 mtree_test_erase(mt, 1); 2680 mtree_test_insert(mt, 6, (void *)0xd); 2681 mtree_test_erase(mt, 67); 2682 mtree_test_insert(mt, 15, (void *)0x1f); 2683 mtree_test_insert(mt, 67167, (void *)0x20cbf); 2684 mtree_test_insert(mt, 1, (void *)0x3); 2685 mtree_test_load(mt, 7); 2686 mtree_test_insert(mt, 16, (void *)0x21); 2687 mtree_test_insert(mt, 36, (void *)0x49); 2688 mtree_test_store(mt, 67, (void *)0x87); 2689 mtree_test_store(mt, 6, (void *)0xd); 2690 mtree_test_insert(mt, 367, (void *)0x2df); 2691 mtree_test_insert(mt, 115, (void *)0xe7); 2692 mtree_test_store(mt, 0, (void *)0x1); 2693 mtree_test_store_range(mt, 1, 3, (void *)0x3); 2694 mtree_test_store(mt, 1, (void *)0x3); 2695 mtree_test_erase(mt, 67167); 2696 mtree_test_insert_range(mt, 6, 47, (void *)0xd); 2697 mtree_test_store(mt, 1, (void *)0x3); 2698 mtree_test_insert_range(mt, 1, 67, (void *)0x3); 2699 mtree_test_load(mt, 67); 2700 mtree_test_insert(mt, 1, (void *)0x3); 2701 mtree_test_erase(mt, 67167); 2702 mtree_destroy(mt); 2703 2704 /* 2705 * 9. spanning store to the end of data caused an invalid metadata 2706 * length which resulted in a crash eventually. 2707 * Fix by checking if there is a value in pivot before incrementing the 2708 * metadata end in mab_mas_cp(). To ensure this doesn't happen again, 2709 * abstract the two locations this happens into a function called 2710 * mas_leaf_set_meta(). 2711 */ 2712 mt_init_flags(mt, 0); 2713 mtree_test_insert(mt, 21, (void *)0x2b); 2714 mtree_test_insert(mt, 12, (void *)0x19); 2715 mtree_test_insert(mt, 6, (void *)0xd); 2716 mtree_test_insert(mt, 8, (void *)0x11); 2717 mtree_test_insert(mt, 2, (void *)0x5); 2718 mtree_test_insert(mt, 91, (void *)0xb7); 2719 mtree_test_insert(mt, 18, (void *)0x25); 2720 mtree_test_insert(mt, 81, (void *)0xa3); 2721 mtree_test_store_range(mt, 0, 128, (void *)0x1); 2722 mtree_test_store(mt, 1, (void *)0x3); 2723 mtree_test_erase(mt, 8); 2724 mtree_test_insert(mt, 11, (void *)0x17); 2725 mtree_test_insert(mt, 8, (void *)0x11); 2726 mtree_test_insert(mt, 21, (void *)0x2b); 2727 mtree_test_insert(mt, 2, (void *)0x5); 2728 mtree_test_insert(mt, ULONG_MAX - 10, (void *)0xffffffffffffffeb); 2729 mtree_test_erase(mt, ULONG_MAX - 10); 2730 mtree_test_store_range(mt, 0, 281, (void *)0x1); 2731 mtree_test_erase(mt, 2); 2732 mtree_test_insert(mt, 1211, (void *)0x977); 2733 mtree_test_insert(mt, 111, (void *)0xdf); 2734 mtree_test_insert(mt, 13, (void *)0x1b); 2735 mtree_test_insert(mt, 211, (void *)0x1a7); 2736 mtree_test_insert(mt, 11, (void *)0x17); 2737 mtree_test_insert(mt, 5, (void *)0xb); 2738 mtree_test_insert(mt, 1218, (void *)0x985); 2739 mtree_test_insert(mt, 61, (void *)0x7b); 2740 mtree_test_store(mt, 1, (void *)0x3); 2741 mtree_test_insert(mt, 121, (void *)0xf3); 2742 mtree_test_insert(mt, 8, (void *)0x11); 2743 mtree_test_insert(mt, 21, (void *)0x2b); 2744 mtree_test_insert(mt, 2, (void *)0x5); 2745 mtree_test_insert(mt, ULONG_MAX - 10, (void *)0xffffffffffffffeb); 2746 mtree_test_erase(mt, ULONG_MAX - 10); 2747 } 2748 2749 /* duplicate the tree with a specific gap */ 2750 static noinline void __init check_dup_gaps(struct maple_tree *mt, 2751 unsigned long nr_entries, bool zero_start, 2752 unsigned long gap) 2753 { 2754 unsigned long i = 0; 2755 struct maple_tree newmt; 2756 int ret; 2757 void *tmp; 2758 MA_STATE(mas, mt, 0, 0); 2759 MA_STATE(newmas, &newmt, 0, 0); 2760 struct rw_semaphore newmt_lock; 2761 2762 init_rwsem(&newmt_lock); 2763 mt_set_external_lock(&newmt, &newmt_lock); 2764 2765 if (!zero_start) 2766 i = 1; 2767 2768 mt_zero_nr_tallocated(); 2769 for (; i <= nr_entries; i++) 2770 mtree_store_range(mt, i*10, (i+1)*10 - gap, 2771 xa_mk_value(i), GFP_KERNEL); 2772 2773 mt_init_flags(&newmt, MT_FLAGS_ALLOC_RANGE | MT_FLAGS_LOCK_EXTERN); 2774 mt_set_non_kernel(99999); 2775 down_write(&newmt_lock); 2776 ret = mas_expected_entries(&newmas, nr_entries); 2777 mt_set_non_kernel(0); 2778 MT_BUG_ON(mt, ret != 0); 2779 2780 rcu_read_lock(); 2781 mas_for_each(&mas, tmp, ULONG_MAX) { 2782 newmas.index = mas.index; 2783 newmas.last = mas.last; 2784 mas_store(&newmas, tmp); 2785 } 2786 rcu_read_unlock(); 2787 mas_destroy(&newmas); 2788 2789 __mt_destroy(&newmt); 2790 up_write(&newmt_lock); 2791 } 2792 2793 /* Duplicate many sizes of trees. Mainly to test expected entry values */ 2794 static noinline void __init check_dup(struct maple_tree *mt) 2795 { 2796 int i; 2797 int big_start = 100010; 2798 2799 /* Check with a value at zero */ 2800 for (i = 10; i < 1000; i++) { 2801 mt_init_flags(mt, MT_FLAGS_ALLOC_RANGE); 2802 check_dup_gaps(mt, i, true, 5); 2803 mtree_destroy(mt); 2804 rcu_barrier(); 2805 } 2806 2807 cond_resched(); 2808 mt_cache_shrink(); 2809 /* Check with a value at zero, no gap */ 2810 for (i = 1000; i < 2000; i++) { 2811 mt_init_flags(mt, MT_FLAGS_ALLOC_RANGE); 2812 check_dup_gaps(mt, i, true, 0); 2813 mtree_destroy(mt); 2814 rcu_barrier(); 2815 } 2816 2817 cond_resched(); 2818 mt_cache_shrink(); 2819 /* Check with a value at zero and unreasonably large */ 2820 for (i = big_start; i < big_start + 10; i++) { 2821 mt_init_flags(mt, MT_FLAGS_ALLOC_RANGE); 2822 check_dup_gaps(mt, i, true, 5); 2823 mtree_destroy(mt); 2824 rcu_barrier(); 2825 } 2826 2827 cond_resched(); 2828 mt_cache_shrink(); 2829 /* Small to medium size not starting at zero*/ 2830 for (i = 200; i < 1000; i++) { 2831 mt_init_flags(mt, MT_FLAGS_ALLOC_RANGE); 2832 check_dup_gaps(mt, i, false, 5); 2833 mtree_destroy(mt); 2834 rcu_barrier(); 2835 } 2836 2837 cond_resched(); 2838 mt_cache_shrink(); 2839 /* Unreasonably large not starting at zero*/ 2840 for (i = big_start; i < big_start + 10; i++) { 2841 mt_init_flags(mt, MT_FLAGS_ALLOC_RANGE); 2842 check_dup_gaps(mt, i, false, 5); 2843 mtree_destroy(mt); 2844 rcu_barrier(); 2845 cond_resched(); 2846 mt_cache_shrink(); 2847 } 2848 2849 /* Check non-allocation tree not starting at zero */ 2850 for (i = 1500; i < 3000; i++) { 2851 mt_init_flags(mt, 0); 2852 check_dup_gaps(mt, i, false, 5); 2853 mtree_destroy(mt); 2854 rcu_barrier(); 2855 cond_resched(); 2856 if (i % 2 == 0) 2857 mt_cache_shrink(); 2858 } 2859 2860 mt_cache_shrink(); 2861 /* Check non-allocation tree starting at zero */ 2862 for (i = 200; i < 1000; i++) { 2863 mt_init_flags(mt, 0); 2864 check_dup_gaps(mt, i, true, 5); 2865 mtree_destroy(mt); 2866 rcu_barrier(); 2867 cond_resched(); 2868 } 2869 2870 mt_cache_shrink(); 2871 /* Unreasonably large */ 2872 for (i = big_start + 5; i < big_start + 10; i++) { 2873 mt_init_flags(mt, 0); 2874 check_dup_gaps(mt, i, true, 5); 2875 mtree_destroy(mt); 2876 rcu_barrier(); 2877 mt_cache_shrink(); 2878 cond_resched(); 2879 } 2880 } 2881 2882 static noinline void __init check_bnode_min_spanning(struct maple_tree *mt) 2883 { 2884 int i = 50; 2885 MA_STATE(mas, mt, 0, 0); 2886 2887 mt_set_non_kernel(9999); 2888 mas_lock(&mas); 2889 do { 2890 mas_set_range(&mas, i*10, i*10+9); 2891 mas_store(&mas, check_bnode_min_spanning); 2892 } while (i--); 2893 2894 mas_set_range(&mas, 240, 509); 2895 mas_store(&mas, NULL); 2896 mas_unlock(&mas); 2897 mas_destroy(&mas); 2898 mt_set_non_kernel(0); 2899 } 2900 2901 static noinline void __init check_empty_area_window(struct maple_tree *mt) 2902 { 2903 unsigned long i, nr_entries = 20; 2904 MA_STATE(mas, mt, 0, 0); 2905 2906 for (i = 1; i <= nr_entries; i++) 2907 mtree_store_range(mt, i*10, i*10 + 9, 2908 xa_mk_value(i), GFP_KERNEL); 2909 2910 /* Create another hole besides the one at 0 */ 2911 mtree_store_range(mt, 160, 169, NULL, GFP_KERNEL); 2912 2913 /* Check lower bounds that don't fit */ 2914 rcu_read_lock(); 2915 MT_BUG_ON(mt, mas_empty_area_rev(&mas, 5, 90, 10) != -EBUSY); 2916 2917 mas_reset(&mas); 2918 MT_BUG_ON(mt, mas_empty_area_rev(&mas, 6, 90, 5) != -EBUSY); 2919 2920 /* Check lower bound that does fit */ 2921 mas_reset(&mas); 2922 MT_BUG_ON(mt, mas_empty_area_rev(&mas, 5, 90, 5) != 0); 2923 MT_BUG_ON(mt, mas.index != 5); 2924 MT_BUG_ON(mt, mas.last != 9); 2925 rcu_read_unlock(); 2926 2927 /* Check one gap that doesn't fit and one that does */ 2928 rcu_read_lock(); 2929 mas_reset(&mas); 2930 MT_BUG_ON(mt, mas_empty_area_rev(&mas, 5, 217, 9) != 0); 2931 MT_BUG_ON(mt, mas.index != 161); 2932 MT_BUG_ON(mt, mas.last != 169); 2933 2934 /* Check one gap that does fit above the min */ 2935 mas_reset(&mas); 2936 MT_BUG_ON(mt, mas_empty_area_rev(&mas, 100, 218, 3) != 0); 2937 MT_BUG_ON(mt, mas.index != 216); 2938 MT_BUG_ON(mt, mas.last != 218); 2939 2940 /* Check size that doesn't fit any gap */ 2941 mas_reset(&mas); 2942 MT_BUG_ON(mt, mas_empty_area_rev(&mas, 100, 218, 16) != -EBUSY); 2943 2944 /* 2945 * Check size that doesn't fit the lower end of the window but 2946 * does fit the gap 2947 */ 2948 mas_reset(&mas); 2949 MT_BUG_ON(mt, mas_empty_area_rev(&mas, 167, 200, 4) != -EBUSY); 2950 2951 /* 2952 * Check size that doesn't fit the upper end of the window but 2953 * does fit the gap 2954 */ 2955 mas_reset(&mas); 2956 MT_BUG_ON(mt, mas_empty_area_rev(&mas, 100, 162, 4) != -EBUSY); 2957 2958 /* Check mas_empty_area forward */ 2959 mas_reset(&mas); 2960 MT_BUG_ON(mt, mas_empty_area(&mas, 0, 100, 9) != 0); 2961 MT_BUG_ON(mt, mas.index != 0); 2962 MT_BUG_ON(mt, mas.last != 8); 2963 2964 mas_reset(&mas); 2965 MT_BUG_ON(mt, mas_empty_area(&mas, 0, 100, 4) != 0); 2966 MT_BUG_ON(mt, mas.index != 0); 2967 MT_BUG_ON(mt, mas.last != 3); 2968 2969 mas_reset(&mas); 2970 MT_BUG_ON(mt, mas_empty_area(&mas, 0, 100, 11) != -EBUSY); 2971 2972 mas_reset(&mas); 2973 MT_BUG_ON(mt, mas_empty_area(&mas, 5, 100, 6) != -EBUSY); 2974 2975 mas_reset(&mas); 2976 MT_BUG_ON(mt, mas_empty_area(&mas, 0, 8, 10) != -EINVAL); 2977 2978 mas_reset(&mas); 2979 mas_empty_area(&mas, 100, 165, 3); 2980 2981 mas_reset(&mas); 2982 MT_BUG_ON(mt, mas_empty_area(&mas, 100, 163, 6) != -EBUSY); 2983 rcu_read_unlock(); 2984 } 2985 2986 static noinline void __init check_empty_area_fill(struct maple_tree *mt) 2987 { 2988 const unsigned long max = 0x25D78000; 2989 unsigned long size; 2990 int loop, shift; 2991 MA_STATE(mas, mt, 0, 0); 2992 2993 mt_set_non_kernel(99999); 2994 for (shift = 12; shift <= 16; shift++) { 2995 loop = 5000; 2996 size = 1 << shift; 2997 while (loop--) { 2998 mas_set(&mas, 0); 2999 mas_lock(&mas); 3000 MT_BUG_ON(mt, mas_empty_area(&mas, 0, max, size) != 0); 3001 MT_BUG_ON(mt, mas.last != mas.index + size - 1); 3002 mas_store_gfp(&mas, (void *)size, GFP_KERNEL); 3003 mas_unlock(&mas); 3004 mas_reset(&mas); 3005 } 3006 } 3007 3008 /* No space left. */ 3009 size = 0x1000; 3010 rcu_read_lock(); 3011 MT_BUG_ON(mt, mas_empty_area(&mas, 0, max, size) != -EBUSY); 3012 rcu_read_unlock(); 3013 3014 /* Fill a depth 3 node to the maximum */ 3015 for (unsigned long i = 629440511; i <= 629440800; i += 6) 3016 mtree_store_range(mt, i, i + 5, (void *)i, GFP_KERNEL); 3017 /* Make space in the second-last depth 4 node */ 3018 mtree_erase(mt, 631668735); 3019 /* Make space in the last depth 4 node */ 3020 mtree_erase(mt, 629506047); 3021 mas_reset(&mas); 3022 /* Search from just after the gap in the second-last depth 4 */ 3023 rcu_read_lock(); 3024 MT_BUG_ON(mt, mas_empty_area(&mas, 629506048, 690000000, 0x5000) != 0); 3025 rcu_read_unlock(); 3026 mt_set_non_kernel(0); 3027 } 3028 3029 /* 3030 * Check MAS_START, MAS_PAUSE, active (implied), and MAS_NONE transitions. 3031 * 3032 * The table below shows the single entry tree (0-0 pointer) and normal tree 3033 * with nodes. 3034 * 3035 * Function ENTRY Start Result index & last 3036 * ┬ ┬ ┬ ┬ ┬ 3037 * │ │ │ │ └─ the final range 3038 * │ │ │ └─ The node value after execution 3039 * │ │ └─ The node value before execution 3040 * │ └─ If the entry exists or does not exists (DNE) 3041 * └─ The function name 3042 * 3043 * Function ENTRY Start Result index & last 3044 * mas_next() 3045 * - after last 3046 * Single entry tree at 0-0 3047 * ------------------------ 3048 * DNE MAS_START MAS_NONE 1 - oo 3049 * DNE MAS_PAUSE MAS_NONE 1 - oo 3050 * DNE MAS_ROOT MAS_NONE 1 - oo 3051 * when index = 0 3052 * DNE MAS_NONE MAS_ROOT 0 3053 * when index > 0 3054 * DNE MAS_NONE MAS_NONE 1 - oo 3055 * 3056 * Normal tree 3057 * ----------- 3058 * exists MAS_START active range 3059 * DNE MAS_START active set to last range 3060 * exists MAS_PAUSE active range 3061 * DNE MAS_PAUSE active set to last range 3062 * exists MAS_NONE active range 3063 * exists active active range 3064 * DNE active active set to last range 3065 * ERANGE active MAS_OVERFLOW last range 3066 * 3067 * Function ENTRY Start Result index & last 3068 * mas_prev() 3069 * - before index 3070 * Single entry tree at 0-0 3071 * ------------------------ 3072 * if index > 0 3073 * exists MAS_START MAS_ROOT 0 3074 * exists MAS_PAUSE MAS_ROOT 0 3075 * exists MAS_NONE MAS_ROOT 0 3076 * 3077 * if index == 0 3078 * DNE MAS_START MAS_NONE 0 3079 * DNE MAS_PAUSE MAS_NONE 0 3080 * DNE MAS_NONE MAS_NONE 0 3081 * DNE MAS_ROOT MAS_NONE 0 3082 * 3083 * Normal tree 3084 * ----------- 3085 * exists MAS_START active range 3086 * DNE MAS_START active set to min 3087 * exists MAS_PAUSE active range 3088 * DNE MAS_PAUSE active set to min 3089 * exists MAS_NONE active range 3090 * DNE MAS_NONE MAS_NONE set to min 3091 * any MAS_ROOT MAS_NONE 0 3092 * exists active active range 3093 * DNE active active last range 3094 * ERANGE active MAS_UNDERFLOW last range 3095 * 3096 * Function ENTRY Start Result index & last 3097 * mas_find() 3098 * - at index or next 3099 * Single entry tree at 0-0 3100 * ------------------------ 3101 * if index > 0 3102 * DNE MAS_START MAS_NONE 0 3103 * DNE MAS_PAUSE MAS_NONE 0 3104 * DNE MAS_ROOT MAS_NONE 0 3105 * DNE MAS_NONE MAS_NONE 1 3106 * if index == 0 3107 * exists MAS_START MAS_ROOT 0 3108 * exists MAS_PAUSE MAS_ROOT 0 3109 * exists MAS_NONE MAS_ROOT 0 3110 * 3111 * Normal tree 3112 * ----------- 3113 * exists MAS_START active range 3114 * DNE MAS_START active set to max 3115 * exists MAS_PAUSE active range 3116 * DNE MAS_PAUSE active set to max 3117 * exists MAS_NONE active range (start at last) 3118 * exists active active range 3119 * DNE active active last range (max < last) 3120 * 3121 * Function ENTRY Start Result index & last 3122 * mas_find_rev() 3123 * - at index or before 3124 * Single entry tree at 0-0 3125 * ------------------------ 3126 * if index > 0 3127 * exists MAS_START MAS_ROOT 0 3128 * exists MAS_PAUSE MAS_ROOT 0 3129 * exists MAS_NONE MAS_ROOT 0 3130 * if index == 0 3131 * DNE MAS_START MAS_NONE 0 3132 * DNE MAS_PAUSE MAS_NONE 0 3133 * DNE MAS_NONE MAS_NONE 0 3134 * DNE MAS_ROOT MAS_NONE 0 3135 * 3136 * Normal tree 3137 * ----------- 3138 * exists MAS_START active range 3139 * DNE MAS_START active set to min 3140 * exists MAS_PAUSE active range 3141 * DNE MAS_PAUSE active set to min 3142 * exists MAS_NONE active range (start at index) 3143 * exists active active range 3144 * DNE active active last range (min > index) 3145 * 3146 * Function ENTRY Start Result index & last 3147 * mas_walk() 3148 * - Look up index 3149 * Single entry tree at 0-0 3150 * ------------------------ 3151 * if index > 0 3152 * DNE MAS_START MAS_ROOT 1 - oo 3153 * DNE MAS_PAUSE MAS_ROOT 1 - oo 3154 * DNE MAS_NONE MAS_ROOT 1 - oo 3155 * DNE MAS_ROOT MAS_ROOT 1 - oo 3156 * if index == 0 3157 * exists MAS_START MAS_ROOT 0 3158 * exists MAS_PAUSE MAS_ROOT 0 3159 * exists MAS_NONE MAS_ROOT 0 3160 * exists MAS_ROOT MAS_ROOT 0 3161 * 3162 * Normal tree 3163 * ----------- 3164 * exists MAS_START active range 3165 * DNE MAS_START active range of NULL 3166 * exists MAS_PAUSE active range 3167 * DNE MAS_PAUSE active range of NULL 3168 * exists MAS_NONE active range 3169 * DNE MAS_NONE active range of NULL 3170 * exists active active range 3171 * DNE active active range of NULL 3172 */ 3173 3174 static noinline void __init check_state_handling(struct maple_tree *mt) 3175 { 3176 MA_STATE(mas, mt, 0, 0); 3177 void *entry, *ptr = (void *) 0x1234500; 3178 void *ptr2 = &ptr; 3179 void *ptr3 = &ptr2; 3180 3181 /* Check MAS_ROOT First */ 3182 mtree_store_range(mt, 0, 0, ptr, GFP_KERNEL); 3183 3184 mas_lock(&mas); 3185 /* prev: Start -> underflow*/ 3186 entry = mas_prev(&mas, 0); 3187 MT_BUG_ON(mt, entry != NULL); 3188 MT_BUG_ON(mt, mas.status != ma_underflow); 3189 3190 /* prev: Start -> root */ 3191 mas_set(&mas, 10); 3192 entry = mas_prev(&mas, 0); 3193 MT_BUG_ON(mt, entry != ptr); 3194 MT_BUG_ON(mt, mas.index != 0); 3195 MT_BUG_ON(mt, mas.last != 0); 3196 MT_BUG_ON(mt, mas.status != ma_root); 3197 3198 /* prev: pause -> root */ 3199 mas_set(&mas, 10); 3200 mas_pause(&mas); 3201 entry = mas_prev(&mas, 0); 3202 MT_BUG_ON(mt, entry != ptr); 3203 MT_BUG_ON(mt, mas.index != 0); 3204 MT_BUG_ON(mt, mas.last != 0); 3205 MT_BUG_ON(mt, mas.status != ma_root); 3206 3207 /* next: start -> none */ 3208 mas_set(&mas, 0); 3209 entry = mas_next(&mas, ULONG_MAX); 3210 MT_BUG_ON(mt, mas.index != 1); 3211 MT_BUG_ON(mt, mas.last != ULONG_MAX); 3212 MT_BUG_ON(mt, entry != NULL); 3213 MT_BUG_ON(mt, mas.status != ma_none); 3214 3215 /* next: start -> none*/ 3216 mas_set(&mas, 10); 3217 entry = mas_next(&mas, ULONG_MAX); 3218 MT_BUG_ON(mt, mas.index != 1); 3219 MT_BUG_ON(mt, mas.last != ULONG_MAX); 3220 MT_BUG_ON(mt, entry != NULL); 3221 MT_BUG_ON(mt, mas.status != ma_none); 3222 3223 /* find: start -> root */ 3224 mas_set(&mas, 0); 3225 entry = mas_find(&mas, ULONG_MAX); 3226 MT_BUG_ON(mt, entry != ptr); 3227 MT_BUG_ON(mt, mas.index != 0); 3228 MT_BUG_ON(mt, mas.last != 0); 3229 MT_BUG_ON(mt, mas.status != ma_root); 3230 3231 /* find: root -> none */ 3232 entry = mas_find(&mas, ULONG_MAX); 3233 MT_BUG_ON(mt, entry != NULL); 3234 MT_BUG_ON(mt, mas.index != 1); 3235 MT_BUG_ON(mt, mas.last != ULONG_MAX); 3236 MT_BUG_ON(mt, mas.status != ma_none); 3237 3238 /* find: none -> none */ 3239 entry = mas_find(&mas, ULONG_MAX); 3240 MT_BUG_ON(mt, entry != NULL); 3241 MT_BUG_ON(mt, mas.index != 1); 3242 MT_BUG_ON(mt, mas.last != ULONG_MAX); 3243 MT_BUG_ON(mt, mas.status != ma_none); 3244 3245 /* find: start -> none */ 3246 mas_set(&mas, 10); 3247 entry = mas_find(&mas, ULONG_MAX); 3248 MT_BUG_ON(mt, entry != NULL); 3249 MT_BUG_ON(mt, mas.index != 1); 3250 MT_BUG_ON(mt, mas.last != ULONG_MAX); 3251 MT_BUG_ON(mt, mas.status != ma_none); 3252 3253 /* find_rev: none -> root */ 3254 entry = mas_find_rev(&mas, 0); 3255 MT_BUG_ON(mt, entry != ptr); 3256 MT_BUG_ON(mt, mas.index != 0); 3257 MT_BUG_ON(mt, mas.last != 0); 3258 MT_BUG_ON(mt, mas.status != ma_root); 3259 3260 /* find_rev: start -> root */ 3261 mas_set(&mas, 0); 3262 entry = mas_find_rev(&mas, 0); 3263 MT_BUG_ON(mt, entry != ptr); 3264 MT_BUG_ON(mt, mas.index != 0); 3265 MT_BUG_ON(mt, mas.last != 0); 3266 MT_BUG_ON(mt, mas.status != ma_root); 3267 3268 /* find_rev: root -> none */ 3269 entry = mas_find_rev(&mas, 0); 3270 MT_BUG_ON(mt, entry != NULL); 3271 MT_BUG_ON(mt, mas.index != 0); 3272 MT_BUG_ON(mt, mas.last != 0); 3273 MT_BUG_ON(mt, mas.status != ma_none); 3274 3275 /* find_rev: none -> none */ 3276 entry = mas_find_rev(&mas, 0); 3277 MT_BUG_ON(mt, entry != NULL); 3278 MT_BUG_ON(mt, mas.index != 0); 3279 MT_BUG_ON(mt, mas.last != 0); 3280 MT_BUG_ON(mt, mas.status != ma_none); 3281 3282 /* find_rev: start -> root */ 3283 mas_set(&mas, 10); 3284 entry = mas_find_rev(&mas, 0); 3285 MT_BUG_ON(mt, entry != ptr); 3286 MT_BUG_ON(mt, mas.index != 0); 3287 MT_BUG_ON(mt, mas.last != 0); 3288 MT_BUG_ON(mt, mas.status != ma_root); 3289 3290 /* walk: start -> none */ 3291 mas_set(&mas, 10); 3292 entry = mas_walk(&mas); 3293 MT_BUG_ON(mt, entry != NULL); 3294 MT_BUG_ON(mt, mas.index != 1); 3295 MT_BUG_ON(mt, mas.last != ULONG_MAX); 3296 MT_BUG_ON(mt, mas.status != ma_none); 3297 3298 /* walk: pause -> none*/ 3299 mas_set(&mas, 10); 3300 mas_pause(&mas); 3301 entry = mas_walk(&mas); 3302 MT_BUG_ON(mt, entry != NULL); 3303 MT_BUG_ON(mt, mas.index != 1); 3304 MT_BUG_ON(mt, mas.last != ULONG_MAX); 3305 MT_BUG_ON(mt, mas.status != ma_none); 3306 3307 /* walk: none -> none */ 3308 mas.index = mas.last = 10; 3309 entry = mas_walk(&mas); 3310 MT_BUG_ON(mt, entry != NULL); 3311 MT_BUG_ON(mt, mas.index != 1); 3312 MT_BUG_ON(mt, mas.last != ULONG_MAX); 3313 MT_BUG_ON(mt, mas.status != ma_none); 3314 3315 /* walk: none -> none */ 3316 entry = mas_walk(&mas); 3317 MT_BUG_ON(mt, entry != NULL); 3318 MT_BUG_ON(mt, mas.index != 1); 3319 MT_BUG_ON(mt, mas.last != ULONG_MAX); 3320 MT_BUG_ON(mt, mas.status != ma_none); 3321 3322 /* walk: start -> root */ 3323 mas_set(&mas, 0); 3324 entry = mas_walk(&mas); 3325 MT_BUG_ON(mt, entry != ptr); 3326 MT_BUG_ON(mt, mas.index != 0); 3327 MT_BUG_ON(mt, mas.last != 0); 3328 MT_BUG_ON(mt, mas.status != ma_root); 3329 3330 /* walk: pause -> root */ 3331 mas_set(&mas, 0); 3332 mas_pause(&mas); 3333 entry = mas_walk(&mas); 3334 MT_BUG_ON(mt, entry != ptr); 3335 MT_BUG_ON(mt, mas.index != 0); 3336 MT_BUG_ON(mt, mas.last != 0); 3337 MT_BUG_ON(mt, mas.status != ma_root); 3338 3339 /* walk: none -> root */ 3340 mas.status = ma_none; 3341 entry = mas_walk(&mas); 3342 MT_BUG_ON(mt, entry != ptr); 3343 MT_BUG_ON(mt, mas.index != 0); 3344 MT_BUG_ON(mt, mas.last != 0); 3345 MT_BUG_ON(mt, mas.status != ma_root); 3346 3347 /* walk: root -> root */ 3348 entry = mas_walk(&mas); 3349 MT_BUG_ON(mt, entry != ptr); 3350 MT_BUG_ON(mt, mas.index != 0); 3351 MT_BUG_ON(mt, mas.last != 0); 3352 MT_BUG_ON(mt, mas.status != ma_root); 3353 3354 /* walk: root -> none */ 3355 mas_set(&mas, 10); 3356 entry = mas_walk(&mas); 3357 MT_BUG_ON(mt, entry != NULL); 3358 MT_BUG_ON(mt, mas.index != 1); 3359 MT_BUG_ON(mt, mas.last != ULONG_MAX); 3360 MT_BUG_ON(mt, mas.status != ma_none); 3361 3362 /* walk: none -> root */ 3363 mas.index = mas.last = 0; 3364 entry = mas_walk(&mas); 3365 MT_BUG_ON(mt, entry != ptr); 3366 MT_BUG_ON(mt, mas.index != 0); 3367 MT_BUG_ON(mt, mas.last != 0); 3368 MT_BUG_ON(mt, mas.status != ma_root); 3369 3370 mas_unlock(&mas); 3371 3372 /* Check when there is an actual node */ 3373 mtree_store_range(mt, 0, 0, NULL, GFP_KERNEL); 3374 mtree_store_range(mt, 0x1000, 0x1500, ptr, GFP_KERNEL); 3375 mtree_store_range(mt, 0x2000, 0x2500, ptr2, GFP_KERNEL); 3376 mtree_store_range(mt, 0x3000, 0x3500, ptr3, GFP_KERNEL); 3377 3378 mas_lock(&mas); 3379 3380 /* next: start ->active */ 3381 mas_set(&mas, 0); 3382 entry = mas_next(&mas, ULONG_MAX); 3383 MT_BUG_ON(mt, entry != ptr); 3384 MT_BUG_ON(mt, mas.index != 0x1000); 3385 MT_BUG_ON(mt, mas.last != 0x1500); 3386 MT_BUG_ON(mt, !mas_is_active(&mas)); 3387 3388 /* next: pause ->active */ 3389 mas_set(&mas, 0); 3390 mas_pause(&mas); 3391 entry = mas_next(&mas, ULONG_MAX); 3392 MT_BUG_ON(mt, entry != ptr); 3393 MT_BUG_ON(mt, mas.index != 0x1000); 3394 MT_BUG_ON(mt, mas.last != 0x1500); 3395 MT_BUG_ON(mt, !mas_is_active(&mas)); 3396 3397 /* next: none ->active */ 3398 mas.index = mas.last = 0; 3399 mas.offset = 0; 3400 mas.status = ma_none; 3401 entry = mas_next(&mas, ULONG_MAX); 3402 MT_BUG_ON(mt, entry != ptr); 3403 MT_BUG_ON(mt, mas.index != 0x1000); 3404 MT_BUG_ON(mt, mas.last != 0x1500); 3405 MT_BUG_ON(mt, !mas_is_active(&mas)); 3406 3407 /* next:active ->active (spanning limit) */ 3408 entry = mas_next(&mas, 0x2100); 3409 MT_BUG_ON(mt, entry != ptr2); 3410 MT_BUG_ON(mt, mas.index != 0x2000); 3411 MT_BUG_ON(mt, mas.last != 0x2500); 3412 MT_BUG_ON(mt, !mas_is_active(&mas)); 3413 3414 /* next:active -> overflow (limit reached) beyond data */ 3415 entry = mas_next(&mas, 0x2999); 3416 MT_BUG_ON(mt, entry != NULL); 3417 MT_BUG_ON(mt, mas.index != 0x2501); 3418 MT_BUG_ON(mt, mas.last != 0x2fff); 3419 MT_BUG_ON(mt, !mas_is_overflow(&mas)); 3420 3421 /* next:overflow -> active (limit changed) */ 3422 entry = mas_next(&mas, ULONG_MAX); 3423 MT_BUG_ON(mt, entry != ptr3); 3424 MT_BUG_ON(mt, mas.index != 0x3000); 3425 MT_BUG_ON(mt, mas.last != 0x3500); 3426 MT_BUG_ON(mt, !mas_is_active(&mas)); 3427 3428 /* next:active -> overflow (limit reached) */ 3429 entry = mas_next(&mas, ULONG_MAX); 3430 MT_BUG_ON(mt, entry != NULL); 3431 MT_BUG_ON(mt, mas.index != 0x3501); 3432 MT_BUG_ON(mt, mas.last != ULONG_MAX); 3433 MT_BUG_ON(mt, !mas_is_overflow(&mas)); 3434 3435 /* next:overflow -> overflow */ 3436 entry = mas_next(&mas, ULONG_MAX); 3437 MT_BUG_ON(mt, entry != NULL); 3438 MT_BUG_ON(mt, mas.index != 0x3501); 3439 MT_BUG_ON(mt, mas.last != ULONG_MAX); 3440 MT_BUG_ON(mt, !mas_is_overflow(&mas)); 3441 3442 /* prev:overflow -> active */ 3443 entry = mas_prev(&mas, 0); 3444 MT_BUG_ON(mt, entry != ptr3); 3445 MT_BUG_ON(mt, mas.index != 0x3000); 3446 MT_BUG_ON(mt, mas.last != 0x3500); 3447 MT_BUG_ON(mt, !mas_is_active(&mas)); 3448 3449 /* next: none -> active, skip value at location */ 3450 mas_set(&mas, 0); 3451 entry = mas_next(&mas, ULONG_MAX); 3452 mas.status = ma_none; 3453 mas.offset = 0; 3454 entry = mas_next(&mas, ULONG_MAX); 3455 MT_BUG_ON(mt, entry != ptr2); 3456 MT_BUG_ON(mt, mas.index != 0x2000); 3457 MT_BUG_ON(mt, mas.last != 0x2500); 3458 MT_BUG_ON(mt, !mas_is_active(&mas)); 3459 3460 /* prev:active ->active */ 3461 entry = mas_prev(&mas, 0); 3462 MT_BUG_ON(mt, entry != ptr); 3463 MT_BUG_ON(mt, mas.index != 0x1000); 3464 MT_BUG_ON(mt, mas.last != 0x1500); 3465 MT_BUG_ON(mt, !mas_is_active(&mas)); 3466 3467 /* prev:active -> underflow (span limit) */ 3468 mas_next(&mas, ULONG_MAX); 3469 entry = mas_prev(&mas, 0x1200); 3470 MT_BUG_ON(mt, entry != ptr); 3471 MT_BUG_ON(mt, mas.index != 0x1000); 3472 MT_BUG_ON(mt, mas.last != 0x1500); 3473 MT_BUG_ON(mt, !mas_is_active(&mas)); /* spanning limit */ 3474 entry = mas_prev(&mas, 0x1200); /* underflow */ 3475 MT_BUG_ON(mt, entry != NULL); 3476 MT_BUG_ON(mt, mas.index != 0x1000); 3477 MT_BUG_ON(mt, mas.last != 0x1500); 3478 MT_BUG_ON(mt, !mas_is_underflow(&mas)); 3479 3480 /* prev:underflow -> underflow (lower limit) spanning end range */ 3481 entry = mas_prev(&mas, 0x0100); 3482 MT_BUG_ON(mt, entry != NULL); 3483 MT_BUG_ON(mt, mas.index != 0); 3484 MT_BUG_ON(mt, mas.last != 0x0FFF); 3485 MT_BUG_ON(mt, !mas_is_underflow(&mas)); 3486 3487 /* prev:underflow -> underflow */ 3488 entry = mas_prev(&mas, 0); 3489 MT_BUG_ON(mt, entry != NULL); 3490 MT_BUG_ON(mt, mas.index != 0); 3491 MT_BUG_ON(mt, mas.last != 0x0FFF); 3492 MT_BUG_ON(mt, !mas_is_underflow(&mas)); 3493 3494 /* prev:underflow -> underflow */ 3495 entry = mas_prev(&mas, 0); 3496 MT_BUG_ON(mt, entry != NULL); 3497 MT_BUG_ON(mt, mas.index != 0); 3498 MT_BUG_ON(mt, mas.last != 0x0FFF); 3499 MT_BUG_ON(mt, !mas_is_underflow(&mas)); 3500 3501 /* next:underflow -> active */ 3502 entry = mas_next(&mas, ULONG_MAX); 3503 MT_BUG_ON(mt, entry != ptr); 3504 MT_BUG_ON(mt, mas.index != 0x1000); 3505 MT_BUG_ON(mt, mas.last != 0x1500); 3506 MT_BUG_ON(mt, !mas_is_active(&mas)); 3507 3508 /* prev:first value -> underflow */ 3509 entry = mas_prev(&mas, 0x1000); 3510 MT_BUG_ON(mt, entry != NULL); 3511 MT_BUG_ON(mt, mas.index != 0x1000); 3512 MT_BUG_ON(mt, mas.last != 0x1500); 3513 MT_BUG_ON(mt, !mas_is_underflow(&mas)); 3514 3515 /* find:underflow -> first value */ 3516 entry = mas_find(&mas, ULONG_MAX); 3517 MT_BUG_ON(mt, entry != ptr); 3518 MT_BUG_ON(mt, mas.index != 0x1000); 3519 MT_BUG_ON(mt, mas.last != 0x1500); 3520 MT_BUG_ON(mt, !mas_is_active(&mas)); 3521 3522 /* prev: pause ->active */ 3523 mas_set(&mas, 0x3600); 3524 entry = mas_prev(&mas, 0); 3525 MT_BUG_ON(mt, entry != ptr3); 3526 mas_pause(&mas); 3527 entry = mas_prev(&mas, 0); 3528 MT_BUG_ON(mt, entry != ptr2); 3529 MT_BUG_ON(mt, mas.index != 0x2000); 3530 MT_BUG_ON(mt, mas.last != 0x2500); 3531 MT_BUG_ON(mt, !mas_is_active(&mas)); 3532 3533 /* prev:active -> underflow spanning min */ 3534 entry = mas_prev(&mas, 0x1600); 3535 MT_BUG_ON(mt, entry != NULL); 3536 MT_BUG_ON(mt, mas.index != 0x1501); 3537 MT_BUG_ON(mt, mas.last != 0x1FFF); 3538 MT_BUG_ON(mt, !mas_is_underflow(&mas)); 3539 3540 /* prev: active ->active, continue */ 3541 entry = mas_prev(&mas, 0); 3542 MT_BUG_ON(mt, entry != ptr); 3543 MT_BUG_ON(mt, mas.index != 0x1000); 3544 MT_BUG_ON(mt, mas.last != 0x1500); 3545 MT_BUG_ON(mt, !mas_is_active(&mas)); 3546 3547 /* find: start ->active */ 3548 mas_set(&mas, 0); 3549 entry = mas_find(&mas, ULONG_MAX); 3550 MT_BUG_ON(mt, entry != ptr); 3551 MT_BUG_ON(mt, mas.index != 0x1000); 3552 MT_BUG_ON(mt, mas.last != 0x1500); 3553 MT_BUG_ON(mt, !mas_is_active(&mas)); 3554 3555 /* find: pause ->active */ 3556 mas_set(&mas, 0); 3557 mas_pause(&mas); 3558 entry = mas_find(&mas, ULONG_MAX); 3559 MT_BUG_ON(mt, entry != ptr); 3560 MT_BUG_ON(mt, mas.index != 0x1000); 3561 MT_BUG_ON(mt, mas.last != 0x1500); 3562 MT_BUG_ON(mt, !mas_is_active(&mas)); 3563 3564 /* find: start ->active on value */; 3565 mas_set(&mas, 1200); 3566 entry = mas_find(&mas, ULONG_MAX); 3567 MT_BUG_ON(mt, entry != ptr); 3568 MT_BUG_ON(mt, mas.index != 0x1000); 3569 MT_BUG_ON(mt, mas.last != 0x1500); 3570 MT_BUG_ON(mt, !mas_is_active(&mas)); 3571 3572 /* find:active ->active */ 3573 entry = mas_find(&mas, ULONG_MAX); 3574 MT_BUG_ON(mt, entry != ptr2); 3575 MT_BUG_ON(mt, mas.index != 0x2000); 3576 MT_BUG_ON(mt, mas.last != 0x2500); 3577 MT_BUG_ON(mt, !mas_is_active(&mas)); 3578 3579 3580 /* find:active -> active (NULL)*/ 3581 entry = mas_find(&mas, 0x2700); 3582 MT_BUG_ON(mt, entry != NULL); 3583 MT_BUG_ON(mt, mas.index != 0x2501); 3584 MT_BUG_ON(mt, mas.last != 0x2FFF); 3585 MAS_BUG_ON(&mas, !mas_is_active(&mas)); 3586 3587 /* find: overflow ->active */ 3588 entry = mas_find(&mas, 0x5000); 3589 MT_BUG_ON(mt, entry != ptr3); 3590 MT_BUG_ON(mt, mas.index != 0x3000); 3591 MT_BUG_ON(mt, mas.last != 0x3500); 3592 MT_BUG_ON(mt, !mas_is_active(&mas)); 3593 3594 /* find:active -> active (NULL) end*/ 3595 entry = mas_find(&mas, ULONG_MAX); 3596 MT_BUG_ON(mt, entry != NULL); 3597 MT_BUG_ON(mt, mas.index != 0x3501); 3598 MT_BUG_ON(mt, mas.last != ULONG_MAX); 3599 MAS_BUG_ON(&mas, !mas_is_active(&mas)); 3600 3601 /* find_rev: active (END) ->active */ 3602 entry = mas_find_rev(&mas, 0); 3603 MT_BUG_ON(mt, entry != ptr3); 3604 MT_BUG_ON(mt, mas.index != 0x3000); 3605 MT_BUG_ON(mt, mas.last != 0x3500); 3606 MT_BUG_ON(mt, !mas_is_active(&mas)); 3607 3608 /* find_rev:active ->active */ 3609 entry = mas_find_rev(&mas, 0); 3610 MT_BUG_ON(mt, entry != ptr2); 3611 MT_BUG_ON(mt, mas.index != 0x2000); 3612 MT_BUG_ON(mt, mas.last != 0x2500); 3613 MT_BUG_ON(mt, !mas_is_active(&mas)); 3614 3615 /* find_rev: pause ->active */ 3616 mas_pause(&mas); 3617 entry = mas_find_rev(&mas, 0); 3618 MT_BUG_ON(mt, entry != ptr); 3619 MT_BUG_ON(mt, mas.index != 0x1000); 3620 MT_BUG_ON(mt, mas.last != 0x1500); 3621 MT_BUG_ON(mt, !mas_is_active(&mas)); 3622 3623 /* find_rev:active -> underflow */ 3624 entry = mas_find_rev(&mas, 0); 3625 MT_BUG_ON(mt, entry != NULL); 3626 MT_BUG_ON(mt, mas.index != 0); 3627 MT_BUG_ON(mt, mas.last != 0x0FFF); 3628 MT_BUG_ON(mt, !mas_is_underflow(&mas)); 3629 3630 /* find_rev: start ->active */ 3631 mas_set(&mas, 0x1200); 3632 entry = mas_find_rev(&mas, 0); 3633 MT_BUG_ON(mt, entry != ptr); 3634 MT_BUG_ON(mt, mas.index != 0x1000); 3635 MT_BUG_ON(mt, mas.last != 0x1500); 3636 MT_BUG_ON(mt, !mas_is_active(&mas)); 3637 3638 /* mas_walk start ->active */ 3639 mas_set(&mas, 0x1200); 3640 entry = mas_walk(&mas); 3641 MT_BUG_ON(mt, entry != ptr); 3642 MT_BUG_ON(mt, mas.index != 0x1000); 3643 MT_BUG_ON(mt, mas.last != 0x1500); 3644 MT_BUG_ON(mt, !mas_is_active(&mas)); 3645 3646 /* mas_walk start ->active */ 3647 mas_set(&mas, 0x1600); 3648 entry = mas_walk(&mas); 3649 MT_BUG_ON(mt, entry != NULL); 3650 MT_BUG_ON(mt, mas.index != 0x1501); 3651 MT_BUG_ON(mt, mas.last != 0x1fff); 3652 MT_BUG_ON(mt, !mas_is_active(&mas)); 3653 3654 /* mas_walk pause ->active */ 3655 mas_set(&mas, 0x1200); 3656 mas_pause(&mas); 3657 entry = mas_walk(&mas); 3658 MT_BUG_ON(mt, entry != ptr); 3659 MT_BUG_ON(mt, mas.index != 0x1000); 3660 MT_BUG_ON(mt, mas.last != 0x1500); 3661 MT_BUG_ON(mt, !mas_is_active(&mas)); 3662 3663 /* mas_walk pause -> active */ 3664 mas_set(&mas, 0x1600); 3665 mas_pause(&mas); 3666 entry = mas_walk(&mas); 3667 MT_BUG_ON(mt, entry != NULL); 3668 MT_BUG_ON(mt, mas.index != 0x1501); 3669 MT_BUG_ON(mt, mas.last != 0x1fff); 3670 MT_BUG_ON(mt, !mas_is_active(&mas)); 3671 3672 /* mas_walk none -> active */ 3673 mas_set(&mas, 0x1200); 3674 mas.status = ma_none; 3675 entry = mas_walk(&mas); 3676 MT_BUG_ON(mt, entry != ptr); 3677 MT_BUG_ON(mt, mas.index != 0x1000); 3678 MT_BUG_ON(mt, mas.last != 0x1500); 3679 MT_BUG_ON(mt, !mas_is_active(&mas)); 3680 3681 /* mas_walk none -> active */ 3682 mas_set(&mas, 0x1600); 3683 mas.status = ma_none; 3684 entry = mas_walk(&mas); 3685 MT_BUG_ON(mt, entry != NULL); 3686 MT_BUG_ON(mt, mas.index != 0x1501); 3687 MT_BUG_ON(mt, mas.last != 0x1fff); 3688 MT_BUG_ON(mt, !mas_is_active(&mas)); 3689 3690 /* mas_walk active -> active */ 3691 mas.index = 0x1200; 3692 mas.last = 0x1200; 3693 mas.offset = 0; 3694 entry = mas_walk(&mas); 3695 MT_BUG_ON(mt, entry != ptr); 3696 MT_BUG_ON(mt, mas.index != 0x1000); 3697 MT_BUG_ON(mt, mas.last != 0x1500); 3698 MT_BUG_ON(mt, !mas_is_active(&mas)); 3699 3700 /* mas_walk active -> active */ 3701 mas.index = 0x1600; 3702 mas.last = 0x1600; 3703 entry = mas_walk(&mas); 3704 MT_BUG_ON(mt, entry != NULL); 3705 MT_BUG_ON(mt, mas.index != 0x1501); 3706 MT_BUG_ON(mt, mas.last != 0x1fff); 3707 MT_BUG_ON(mt, !mas_is_active(&mas)); 3708 3709 mas_unlock(&mas); 3710 } 3711 3712 static noinline void __init alloc_cyclic_testing(struct maple_tree *mt) 3713 { 3714 unsigned long location; 3715 unsigned long next; 3716 int ret = 0; 3717 MA_STATE(mas, mt, 0, 0); 3718 3719 next = 0; 3720 mtree_lock(mt); 3721 for (int i = 0; i < 100; i++) { 3722 mas_alloc_cyclic(&mas, &location, mt, 2, ULONG_MAX, &next, GFP_KERNEL); 3723 MAS_BUG_ON(&mas, i != location - 2); 3724 MAS_BUG_ON(&mas, mas.index != location); 3725 MAS_BUG_ON(&mas, mas.last != location); 3726 MAS_BUG_ON(&mas, i != next - 3); 3727 } 3728 3729 mtree_unlock(mt); 3730 mtree_destroy(mt); 3731 next = 0; 3732 mt_init_flags(mt, MT_FLAGS_ALLOC_RANGE); 3733 for (int i = 0; i < 100; i++) { 3734 mtree_alloc_cyclic(mt, &location, mt, 2, ULONG_MAX, &next, GFP_KERNEL); 3735 MT_BUG_ON(mt, i != location - 2); 3736 MT_BUG_ON(mt, i != next - 3); 3737 MT_BUG_ON(mt, mtree_load(mt, location) != mt); 3738 } 3739 3740 mtree_destroy(mt); 3741 3742 /* 3743 * Issue with reverse search was discovered 3744 * https://lore.kernel.org/all/20241216060600.287B4C4CED0@smtp.kernel.org/ 3745 * Exhausting the allocation area and forcing the search to wrap needs a 3746 * mas_reset() in mas_alloc_cyclic(). 3747 */ 3748 next = 0; 3749 mt_init_flags(mt, MT_FLAGS_ALLOC_RANGE); 3750 for (int i = 0; i < 1023; i++) { 3751 mtree_alloc_cyclic(mt, &location, mt, 2, 1024, &next, GFP_KERNEL); 3752 MT_BUG_ON(mt, i != location - 2); 3753 MT_BUG_ON(mt, i != next - 3); 3754 MT_BUG_ON(mt, mtree_load(mt, location) != mt); 3755 } 3756 mtree_erase(mt, 123); 3757 MT_BUG_ON(mt, mtree_load(mt, 123) != NULL); 3758 mtree_alloc_cyclic(mt, &location, mt, 2, 1024, &next, GFP_KERNEL); 3759 MT_BUG_ON(mt, 123 != location); 3760 MT_BUG_ON(mt, 124 != next); 3761 MT_BUG_ON(mt, mtree_load(mt, location) != mt); 3762 mtree_erase(mt, 100); 3763 mtree_alloc_cyclic(mt, &location, mt, 2, 1024, &next, GFP_KERNEL); 3764 MT_BUG_ON(mt, 100 != location); 3765 MT_BUG_ON(mt, 101 != next); 3766 MT_BUG_ON(mt, mtree_load(mt, location) != mt); 3767 mtree_destroy(mt); 3768 3769 /* Overflow test */ 3770 next = ULONG_MAX - 1; 3771 ret = mtree_alloc_cyclic(mt, &location, mt, 2, ULONG_MAX, &next, GFP_KERNEL); 3772 MT_BUG_ON(mt, ret != 0); 3773 ret = mtree_alloc_cyclic(mt, &location, mt, 2, ULONG_MAX, &next, GFP_KERNEL); 3774 MT_BUG_ON(mt, ret != 0); 3775 ret = mtree_alloc_cyclic(mt, &location, mt, 2, ULONG_MAX, &next, GFP_KERNEL); 3776 MT_BUG_ON(mt, ret != 1); 3777 } 3778 3779 static DEFINE_MTREE(tree); 3780 static int __init maple_tree_seed(void) 3781 { 3782 unsigned long set[] = { 5015, 5014, 5017, 25, 1000, 3783 1001, 1002, 1003, 1005, 0, 3784 5003, 5002}; 3785 void *ptr = &set; 3786 3787 pr_info("\nTEST STARTING\n\n"); 3788 3789 #if defined(BENCH_SLOT_STORE) 3790 #define BENCH 3791 mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE); 3792 bench_slot_store(&tree); 3793 mtree_destroy(&tree); 3794 goto skip; 3795 #endif 3796 #if defined(BENCH_NODE_STORE) 3797 #define BENCH 3798 mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE); 3799 bench_node_store(&tree); 3800 mtree_destroy(&tree); 3801 goto skip; 3802 #endif 3803 #if defined(BENCH_AWALK) 3804 #define BENCH 3805 mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE); 3806 bench_awalk(&tree); 3807 mtree_destroy(&tree); 3808 goto skip; 3809 #endif 3810 #if defined(BENCH_WALK) 3811 #define BENCH 3812 mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE); 3813 bench_walk(&tree); 3814 mtree_destroy(&tree); 3815 goto skip; 3816 #endif 3817 #if defined(BENCH_LOAD) 3818 #define BENCH 3819 mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE); 3820 bench_load(&tree); 3821 mtree_destroy(&tree); 3822 goto skip; 3823 #endif 3824 #if defined(BENCH_FORK) 3825 #define BENCH 3826 bench_forking(); 3827 goto skip; 3828 #endif 3829 #if defined(BENCH_MT_FOR_EACH) 3830 #define BENCH 3831 mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE); 3832 bench_mt_for_each(&tree); 3833 mtree_destroy(&tree); 3834 goto skip; 3835 #endif 3836 #if defined(BENCH_MAS_FOR_EACH) 3837 #define BENCH 3838 mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE); 3839 bench_mas_for_each(&tree); 3840 mtree_destroy(&tree); 3841 goto skip; 3842 #endif 3843 #if defined(BENCH_MAS_PREV) 3844 #define BENCH 3845 mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE); 3846 bench_mas_prev(&tree); 3847 mtree_destroy(&tree); 3848 goto skip; 3849 #endif 3850 3851 mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE); 3852 check_deficient_node(&tree); 3853 mtree_destroy(&tree); 3854 3855 mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE); 3856 check_store_null(&tree); 3857 mtree_destroy(&tree); 3858 3859 mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE); 3860 check_root_expand(&tree); 3861 mtree_destroy(&tree); 3862 3863 mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE); 3864 check_iteration(&tree); 3865 mtree_destroy(&tree); 3866 3867 check_forking(); 3868 3869 mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE); 3870 check_mas_store_gfp(&tree); 3871 mtree_destroy(&tree); 3872 3873 /* Test ranges (store and insert) */ 3874 mt_init_flags(&tree, 0); 3875 check_ranges(&tree); 3876 mtree_destroy(&tree); 3877 3878 #if defined(CONFIG_64BIT) 3879 /* These tests have ranges outside of 4GB */ 3880 mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE); 3881 check_alloc_range(&tree); 3882 mtree_destroy(&tree); 3883 3884 mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE); 3885 check_alloc_rev_range(&tree); 3886 mtree_destroy(&tree); 3887 #endif 3888 3889 mt_init_flags(&tree, 0); 3890 3891 check_load(&tree, set[0], NULL); /* See if 5015 -> NULL */ 3892 3893 check_insert(&tree, set[9], &tree); /* Insert 0 */ 3894 check_load(&tree, set[9], &tree); /* See if 0 -> &tree */ 3895 check_load(&tree, set[0], NULL); /* See if 5015 -> NULL */ 3896 3897 check_insert(&tree, set[10], ptr); /* Insert 5003 */ 3898 check_load(&tree, set[9], &tree); /* See if 0 -> &tree */ 3899 check_load(&tree, set[11], NULL); /* See if 5002 -> NULL */ 3900 check_load(&tree, set[10], ptr); /* See if 5003 -> ptr */ 3901 3902 /* Clear out the tree */ 3903 mtree_destroy(&tree); 3904 3905 /* Try to insert, insert a dup, and load back what was inserted. */ 3906 mt_init_flags(&tree, 0); 3907 check_insert(&tree, set[0], &tree); /* Insert 5015 */ 3908 check_dup_insert(&tree, set[0], &tree); /* Insert 5015 again */ 3909 check_load(&tree, set[0], &tree); /* See if 5015 -> &tree */ 3910 3911 /* 3912 * Second set of tests try to load a value that doesn't exist, inserts 3913 * a second value, then loads the value again 3914 */ 3915 check_load(&tree, set[1], NULL); /* See if 5014 -> NULL */ 3916 check_insert(&tree, set[1], ptr); /* insert 5014 -> ptr */ 3917 check_load(&tree, set[1], ptr); /* See if 5014 -> ptr */ 3918 check_load(&tree, set[0], &tree); /* See if 5015 -> &tree */ 3919 /* 3920 * Tree currently contains: 3921 * p[0]: 14 -> (nil) p[1]: 15 -> ptr p[2]: 16 -> &tree p[3]: 0 -> (nil) 3922 */ 3923 check_insert(&tree, set[6], ptr); /* insert 1002 -> ptr */ 3924 check_insert(&tree, set[7], &tree); /* insert 1003 -> &tree */ 3925 3926 check_load(&tree, set[0], &tree); /* See if 5015 -> &tree */ 3927 check_load(&tree, set[1], ptr); /* See if 5014 -> ptr */ 3928 check_load(&tree, set[6], ptr); /* See if 1002 -> ptr */ 3929 check_load(&tree, set[7], &tree); /* 1003 = &tree ? */ 3930 3931 /* Clear out tree */ 3932 mtree_destroy(&tree); 3933 3934 mt_init_flags(&tree, 0); 3935 /* Test inserting into a NULL hole. */ 3936 check_insert(&tree, set[5], ptr); /* insert 1001 -> ptr */ 3937 check_insert(&tree, set[7], &tree); /* insert 1003 -> &tree */ 3938 check_insert(&tree, set[6], ptr); /* insert 1002 -> ptr */ 3939 check_load(&tree, set[5], ptr); /* See if 1001 -> ptr */ 3940 check_load(&tree, set[6], ptr); /* See if 1002 -> ptr */ 3941 check_load(&tree, set[7], &tree); /* See if 1003 -> &tree */ 3942 3943 /* Clear out the tree */ 3944 mtree_destroy(&tree); 3945 3946 mt_init_flags(&tree, 0); 3947 /* 3948 * set[] = {5015, 5014, 5017, 25, 1000, 3949 * 1001, 1002, 1003, 1005, 0, 3950 * 5003, 5002}; 3951 */ 3952 3953 check_insert(&tree, set[0], ptr); /* 5015 */ 3954 check_insert(&tree, set[1], &tree); /* 5014 */ 3955 check_insert(&tree, set[2], ptr); /* 5017 */ 3956 check_insert(&tree, set[3], &tree); /* 25 */ 3957 check_load(&tree, set[0], ptr); 3958 check_load(&tree, set[1], &tree); 3959 check_load(&tree, set[2], ptr); 3960 check_load(&tree, set[3], &tree); 3961 check_insert(&tree, set[4], ptr); /* 1000 < Should split. */ 3962 check_load(&tree, set[0], ptr); 3963 check_load(&tree, set[1], &tree); 3964 check_load(&tree, set[2], ptr); 3965 check_load(&tree, set[3], &tree); /*25 */ 3966 check_load(&tree, set[4], ptr); 3967 check_insert(&tree, set[5], &tree); /* 1001 */ 3968 check_load(&tree, set[0], ptr); 3969 check_load(&tree, set[1], &tree); 3970 check_load(&tree, set[2], ptr); 3971 check_load(&tree, set[3], &tree); 3972 check_load(&tree, set[4], ptr); 3973 check_load(&tree, set[5], &tree); 3974 check_insert(&tree, set[6], ptr); 3975 check_load(&tree, set[0], ptr); 3976 check_load(&tree, set[1], &tree); 3977 check_load(&tree, set[2], ptr); 3978 check_load(&tree, set[3], &tree); 3979 check_load(&tree, set[4], ptr); 3980 check_load(&tree, set[5], &tree); 3981 check_load(&tree, set[6], ptr); 3982 check_insert(&tree, set[7], &tree); 3983 check_load(&tree, set[0], ptr); 3984 check_insert(&tree, set[8], ptr); 3985 3986 check_insert(&tree, set[9], &tree); 3987 3988 check_load(&tree, set[0], ptr); 3989 check_load(&tree, set[1], &tree); 3990 check_load(&tree, set[2], ptr); 3991 check_load(&tree, set[3], &tree); 3992 check_load(&tree, set[4], ptr); 3993 check_load(&tree, set[5], &tree); 3994 check_load(&tree, set[6], ptr); 3995 check_load(&tree, set[9], &tree); 3996 mtree_destroy(&tree); 3997 3998 mt_init_flags(&tree, 0); 3999 check_seq(&tree, 16, false); 4000 mtree_destroy(&tree); 4001 4002 mt_init_flags(&tree, 0); 4003 check_seq(&tree, 1000, true); 4004 mtree_destroy(&tree); 4005 4006 mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE); 4007 check_rev_seq(&tree, 1000, true); 4008 mtree_destroy(&tree); 4009 4010 check_lower_bound_split(&tree); 4011 check_upper_bound_split(&tree); 4012 check_mid_split(&tree); 4013 4014 mt_init_flags(&tree, 0); 4015 check_next_entry(&tree); 4016 check_find(&tree); 4017 check_find_2(&tree); 4018 mtree_destroy(&tree); 4019 4020 mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE); 4021 check_prev_entry(&tree); 4022 mtree_destroy(&tree); 4023 4024 mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE); 4025 check_gap_combining(&tree); 4026 mtree_destroy(&tree); 4027 4028 mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE); 4029 check_node_overwrite(&tree); 4030 mtree_destroy(&tree); 4031 4032 mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE); 4033 next_prev_test(&tree); 4034 mtree_destroy(&tree); 4035 4036 mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE); 4037 check_spanning_relatives(&tree); 4038 mtree_destroy(&tree); 4039 4040 mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE); 4041 check_rev_find(&tree); 4042 mtree_destroy(&tree); 4043 4044 mt_init_flags(&tree, 0); 4045 check_fuzzer(&tree); 4046 mtree_destroy(&tree); 4047 4048 mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE); 4049 check_dup(&tree); 4050 mtree_destroy(&tree); 4051 4052 mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE); 4053 check_bnode_min_spanning(&tree); 4054 mtree_destroy(&tree); 4055 4056 mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE); 4057 check_empty_area_window(&tree); 4058 mtree_destroy(&tree); 4059 4060 mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE); 4061 check_empty_area_fill(&tree); 4062 mtree_destroy(&tree); 4063 4064 mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE); 4065 check_state_handling(&tree); 4066 mtree_destroy(&tree); 4067 4068 mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE); 4069 alloc_cyclic_testing(&tree); 4070 mtree_destroy(&tree); 4071 4072 4073 #if defined(BENCH) 4074 skip: 4075 #endif 4076 rcu_barrier(); 4077 pr_info("maple_tree: %u of %u tests passed\n", 4078 atomic_read(&maple_tree_tests_passed), 4079 atomic_read(&maple_tree_tests_run)); 4080 if (atomic_read(&maple_tree_tests_run) == 4081 atomic_read(&maple_tree_tests_passed)) 4082 return 0; 4083 4084 return -EINVAL; 4085 } 4086 4087 static void __exit maple_tree_harvest(void) 4088 { 4089 4090 } 4091 4092 module_init(maple_tree_seed); 4093 module_exit(maple_tree_harvest); 4094 MODULE_AUTHOR("Liam R. Howlett <Liam.Howlett@Oracle.com>"); 4095 MODULE_DESCRIPTION("maple tree API test module"); 4096 MODULE_LICENSE("GPL"); 4097