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

source code of linux/lib/test_maple_tree.c