~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/lib/test_maple_tree.c

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

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

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php