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