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