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