xref: /openbmc/linux/lib/test_maple_tree.c (revision 25879d7b)
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_iteration(struct maple_tree *mt)
1713 {
1714 	int i, nr_entries = 125;
1715 	void *val;
1716 	MA_STATE(mas, mt, 0, 0);
1717 
1718 	for (i = 0; i <= nr_entries; i++)
1719 		mtree_store_range(mt, i * 10, i * 10 + 9,
1720 				  xa_mk_value(i), GFP_KERNEL);
1721 
1722 	mt_set_non_kernel(99999);
1723 
1724 	i = 0;
1725 	mas_lock(&mas);
1726 	mas_for_each(&mas, val, 925) {
1727 		MT_BUG_ON(mt, mas.index != i * 10);
1728 		MT_BUG_ON(mt, mas.last != i * 10 + 9);
1729 		/* Overwrite end of entry 92 */
1730 		if (i == 92) {
1731 			mas.index = 925;
1732 			mas.last = 929;
1733 			mas_store(&mas, val);
1734 		}
1735 		i++;
1736 	}
1737 	/* Ensure mas_find() gets the next value */
1738 	val = mas_find(&mas, ULONG_MAX);
1739 	MT_BUG_ON(mt, val != xa_mk_value(i));
1740 
1741 	mas_set(&mas, 0);
1742 	i = 0;
1743 	mas_for_each(&mas, val, 785) {
1744 		MT_BUG_ON(mt, mas.index != i * 10);
1745 		MT_BUG_ON(mt, mas.last != i * 10 + 9);
1746 		/* Overwrite start of entry 78 */
1747 		if (i == 78) {
1748 			mas.index = 780;
1749 			mas.last = 785;
1750 			mas_store(&mas, val);
1751 		} else {
1752 			i++;
1753 		}
1754 	}
1755 	val = mas_find(&mas, ULONG_MAX);
1756 	MT_BUG_ON(mt, val != xa_mk_value(i));
1757 
1758 	mas_set(&mas, 0);
1759 	i = 0;
1760 	mas_for_each(&mas, val, 765) {
1761 		MT_BUG_ON(mt, mas.index != i * 10);
1762 		MT_BUG_ON(mt, mas.last != i * 10 + 9);
1763 		/* Overwrite end of entry 76 and advance to the end */
1764 		if (i == 76) {
1765 			mas.index = 760;
1766 			mas.last = 765;
1767 			mas_store(&mas, val);
1768 			mas_next(&mas, ULONG_MAX);
1769 		}
1770 		i++;
1771 	}
1772 	/* Make sure the next find returns the one after 765, 766-769 */
1773 	val = mas_find(&mas, ULONG_MAX);
1774 	MT_BUG_ON(mt, val != xa_mk_value(76));
1775 	mas_unlock(&mas);
1776 	mas_destroy(&mas);
1777 	mt_set_non_kernel(0);
1778 }
1779 
1780 static noinline void check_mas_store_gfp(struct maple_tree *mt)
1781 {
1782 
1783 	struct maple_tree newmt;
1784 	int i, nr_entries = 135;
1785 	void *val;
1786 	MA_STATE(mas, mt, 0, 0);
1787 	MA_STATE(newmas, mt, 0, 0);
1788 
1789 	for (i = 0; i <= nr_entries; i++)
1790 		mtree_store_range(mt, i*10, i*10 + 5,
1791 				  xa_mk_value(i), GFP_KERNEL);
1792 
1793 	mt_set_non_kernel(99999);
1794 	mt_init_flags(&newmt, MT_FLAGS_ALLOC_RANGE);
1795 	newmas.tree = &newmt;
1796 	rcu_read_lock();
1797 	mas_lock(&newmas);
1798 	mas_reset(&newmas);
1799 	mas_set(&mas, 0);
1800 	mas_for_each(&mas, val, ULONG_MAX) {
1801 		newmas.index = mas.index;
1802 		newmas.last = mas.last;
1803 		mas_store_gfp(&newmas, val, GFP_KERNEL);
1804 	}
1805 	mas_unlock(&newmas);
1806 	rcu_read_unlock();
1807 	mt_validate(&newmt);
1808 	mt_set_non_kernel(0);
1809 	mtree_destroy(&newmt);
1810 }
1811 
1812 #if defined(BENCH_FORK)
1813 static noinline void bench_forking(struct maple_tree *mt)
1814 {
1815 
1816 	struct maple_tree newmt;
1817 	int i, nr_entries = 134, nr_fork = 80000;
1818 	void *val;
1819 	MA_STATE(mas, mt, 0, 0);
1820 	MA_STATE(newmas, mt, 0, 0);
1821 
1822 	for (i = 0; i <= nr_entries; i++)
1823 		mtree_store_range(mt, i*10, i*10 + 5,
1824 				  xa_mk_value(i), GFP_KERNEL);
1825 
1826 	for (i = 0; i < nr_fork; i++) {
1827 		mt_set_non_kernel(99999);
1828 		mt_init_flags(&newmt, MT_FLAGS_ALLOC_RANGE);
1829 		newmas.tree = &newmt;
1830 		mas_reset(&newmas);
1831 		mas_reset(&mas);
1832 		mas.index = 0;
1833 		mas.last = 0;
1834 		rcu_read_lock();
1835 		mas_lock(&newmas);
1836 		if (mas_expected_entries(&newmas, nr_entries)) {
1837 			printk("OOM!");
1838 			BUG_ON(1);
1839 		}
1840 		mas_for_each(&mas, val, ULONG_MAX) {
1841 			newmas.index = mas.index;
1842 			newmas.last = mas.last;
1843 			mas_store(&newmas, val);
1844 		}
1845 		mas_destroy(&newmas);
1846 		mas_unlock(&newmas);
1847 		rcu_read_unlock();
1848 		mt_validate(&newmt);
1849 		mt_set_non_kernel(0);
1850 		mtree_destroy(&newmt);
1851 	}
1852 }
1853 #endif
1854 
1855 static noinline void next_prev_test(struct maple_tree *mt)
1856 {
1857 	int i, nr_entries;
1858 	void *val;
1859 	MA_STATE(mas, mt, 0, 0);
1860 	struct maple_enode *mn;
1861 	unsigned long *level2;
1862 	unsigned long level2_64[] = {707, 1000, 710, 715, 720, 725};
1863 	unsigned long level2_32[] = {1747, 2000, 1750, 1755, 1760, 1765};
1864 
1865 	if (MAPLE_32BIT) {
1866 		nr_entries = 500;
1867 		level2 = level2_32;
1868 	} else {
1869 		nr_entries = 200;
1870 		level2 = level2_64;
1871 	}
1872 
1873 	for (i = 0; i <= nr_entries; i++)
1874 		mtree_store_range(mt, i*10, i*10 + 5,
1875 				  xa_mk_value(i), GFP_KERNEL);
1876 
1877 	mas_lock(&mas);
1878 	for (i = 0; i <= nr_entries / 2; i++) {
1879 		mas_next(&mas, 1000);
1880 		if (mas_is_none(&mas))
1881 			break;
1882 
1883 	}
1884 	mas_reset(&mas);
1885 	mas_set(&mas, 0);
1886 	i = 0;
1887 	mas_for_each(&mas, val, 1000) {
1888 		i++;
1889 	}
1890 
1891 	mas_reset(&mas);
1892 	mas_set(&mas, 0);
1893 	i = 0;
1894 	mas_for_each(&mas, val, 1000) {
1895 		mas_pause(&mas);
1896 		i++;
1897 	}
1898 
1899 	/*
1900 	 * 680 - 685 = 0x61a00001930c
1901 	 * 686 - 689 = NULL;
1902 	 * 690 - 695 = 0x61a00001930c
1903 	 * Check simple next/prev
1904 	 */
1905 	mas_set(&mas, 686);
1906 	val = mas_walk(&mas);
1907 	MT_BUG_ON(mt, val != NULL);
1908 
1909 	val = mas_next(&mas, 1000);
1910 	MT_BUG_ON(mt, val != xa_mk_value(690 / 10));
1911 	MT_BUG_ON(mt, mas.index != 690);
1912 	MT_BUG_ON(mt, mas.last != 695);
1913 
1914 	val = mas_prev(&mas, 0);
1915 	MT_BUG_ON(mt, val != xa_mk_value(680 / 10));
1916 	MT_BUG_ON(mt, mas.index != 680);
1917 	MT_BUG_ON(mt, mas.last != 685);
1918 
1919 	val = mas_next(&mas, 1000);
1920 	MT_BUG_ON(mt, val != xa_mk_value(690 / 10));
1921 	MT_BUG_ON(mt, mas.index != 690);
1922 	MT_BUG_ON(mt, mas.last != 695);
1923 
1924 	val = mas_next(&mas, 1000);
1925 	MT_BUG_ON(mt, val != xa_mk_value(700 / 10));
1926 	MT_BUG_ON(mt, mas.index != 700);
1927 	MT_BUG_ON(mt, mas.last != 705);
1928 
1929 	/* Check across node boundaries of the tree */
1930 	mas_set(&mas, 70);
1931 	val = mas_walk(&mas);
1932 	MT_BUG_ON(mt, val != xa_mk_value(70 / 10));
1933 	MT_BUG_ON(mt, mas.index != 70);
1934 	MT_BUG_ON(mt, mas.last != 75);
1935 
1936 	val = mas_next(&mas, 1000);
1937 	MT_BUG_ON(mt, val != xa_mk_value(80 / 10));
1938 	MT_BUG_ON(mt, mas.index != 80);
1939 	MT_BUG_ON(mt, mas.last != 85);
1940 
1941 	val = mas_prev(&mas, 70);
1942 	MT_BUG_ON(mt, val != xa_mk_value(70 / 10));
1943 	MT_BUG_ON(mt, mas.index != 70);
1944 	MT_BUG_ON(mt, mas.last != 75);
1945 
1946 	/* Check across two levels of the tree */
1947 	mas_reset(&mas);
1948 	mas_set(&mas, level2[0]);
1949 	val = mas_walk(&mas);
1950 	MT_BUG_ON(mt, val != NULL);
1951 	val = mas_next(&mas, level2[1]);
1952 	MT_BUG_ON(mt, val != xa_mk_value(level2[2] / 10));
1953 	MT_BUG_ON(mt, mas.index != level2[2]);
1954 	MT_BUG_ON(mt, mas.last != level2[3]);
1955 	mn = mas.node;
1956 
1957 	val = mas_next(&mas, level2[1]);
1958 	MT_BUG_ON(mt, val != xa_mk_value(level2[4] / 10));
1959 	MT_BUG_ON(mt, mas.index != level2[4]);
1960 	MT_BUG_ON(mt, mas.last != level2[5]);
1961 	MT_BUG_ON(mt, mn == mas.node);
1962 
1963 	val = mas_prev(&mas, 0);
1964 	MT_BUG_ON(mt, val != xa_mk_value(level2[2] / 10));
1965 	MT_BUG_ON(mt, mas.index != level2[2]);
1966 	MT_BUG_ON(mt, mas.last != level2[3]);
1967 
1968 	/* Check running off the end and back on */
1969 	mas_set(&mas, nr_entries * 10);
1970 	val = mas_walk(&mas);
1971 	MT_BUG_ON(mt, val != xa_mk_value(nr_entries));
1972 	MT_BUG_ON(mt, mas.index != (nr_entries * 10));
1973 	MT_BUG_ON(mt, mas.last != (nr_entries * 10 + 5));
1974 
1975 	val = mas_next(&mas, ULONG_MAX);
1976 	MT_BUG_ON(mt, val != NULL);
1977 	MT_BUG_ON(mt, mas.index != ULONG_MAX);
1978 	MT_BUG_ON(mt, mas.last != ULONG_MAX);
1979 
1980 	val = mas_prev(&mas, 0);
1981 	MT_BUG_ON(mt, val != xa_mk_value(nr_entries));
1982 	MT_BUG_ON(mt, mas.index != (nr_entries * 10));
1983 	MT_BUG_ON(mt, mas.last != (nr_entries * 10 + 5));
1984 
1985 	/* Check running off the start and back on */
1986 	mas_reset(&mas);
1987 	mas_set(&mas, 10);
1988 	val = mas_walk(&mas);
1989 	MT_BUG_ON(mt, val != xa_mk_value(1));
1990 	MT_BUG_ON(mt, mas.index != 10);
1991 	MT_BUG_ON(mt, mas.last != 15);
1992 
1993 	val = mas_prev(&mas, 0);
1994 	MT_BUG_ON(mt, val != xa_mk_value(0));
1995 	MT_BUG_ON(mt, mas.index != 0);
1996 	MT_BUG_ON(mt, mas.last != 5);
1997 
1998 	val = mas_prev(&mas, 0);
1999 	MT_BUG_ON(mt, val != NULL);
2000 	MT_BUG_ON(mt, mas.index != 0);
2001 	MT_BUG_ON(mt, mas.last != 0);
2002 
2003 	mas.index = 0;
2004 	mas.last = 5;
2005 	mas_store(&mas, NULL);
2006 	mas_reset(&mas);
2007 	mas_set(&mas, 10);
2008 	mas_walk(&mas);
2009 
2010 	val = mas_prev(&mas, 0);
2011 	MT_BUG_ON(mt, val != NULL);
2012 	MT_BUG_ON(mt, mas.index != 0);
2013 	MT_BUG_ON(mt, mas.last != 0);
2014 	mas_unlock(&mas);
2015 
2016 	mtree_destroy(mt);
2017 
2018 	mt_init(mt);
2019 	mtree_store_range(mt, 0, 0, xa_mk_value(0), GFP_KERNEL);
2020 	mtree_store_range(mt, 5, 5, xa_mk_value(5), GFP_KERNEL);
2021 	rcu_read_lock();
2022 	mas_set(&mas, 5);
2023 	val = mas_prev(&mas, 4);
2024 	MT_BUG_ON(mt, val != NULL);
2025 	rcu_read_unlock();
2026 }
2027 
2028 
2029 
2030 /* Test spanning writes that require balancing right sibling or right cousin */
2031 static noinline void check_spanning_relatives(struct maple_tree *mt)
2032 {
2033 
2034 	unsigned long i, nr_entries = 1000;
2035 
2036 	for (i = 0; i <= nr_entries; i++)
2037 		mtree_store_range(mt, i*10, i*10 + 5,
2038 				  xa_mk_value(i), GFP_KERNEL);
2039 
2040 
2041 	mtree_store_range(mt, 9365, 9955, NULL, GFP_KERNEL);
2042 }
2043 
2044 static noinline void check_fuzzer(struct maple_tree *mt)
2045 {
2046 	/*
2047 	 * 1. Causes a spanning rebalance of a single root node.
2048 	 * Fixed by setting the correct limit in mast_cp_to_nodes() when the
2049 	 * entire right side is consumed.
2050 	 */
2051 	mtree_test_insert(mt, 88, (void *)0xb1);
2052 	mtree_test_insert(mt, 84, (void *)0xa9);
2053 	mtree_test_insert(mt, 2,  (void *)0x5);
2054 	mtree_test_insert(mt, 4,  (void *)0x9);
2055 	mtree_test_insert(mt, 14, (void *)0x1d);
2056 	mtree_test_insert(mt, 7,  (void *)0xf);
2057 	mtree_test_insert(mt, 12, (void *)0x19);
2058 	mtree_test_insert(mt, 18, (void *)0x25);
2059 	mtree_test_store_range(mt, 8, 18, (void *)0x11);
2060 	mtree_destroy(mt);
2061 
2062 
2063 	/*
2064 	 * 2. Cause a spanning rebalance of two nodes in root.
2065 	 * Fixed by setting mast->r->max correctly.
2066 	 */
2067 	mt_init_flags(mt, 0);
2068 	mtree_test_store(mt, 87, (void *)0xaf);
2069 	mtree_test_store(mt, 0, (void *)0x1);
2070 	mtree_test_load(mt, 4);
2071 	mtree_test_insert(mt, 4, (void *)0x9);
2072 	mtree_test_store(mt, 8, (void *)0x11);
2073 	mtree_test_store(mt, 44, (void *)0x59);
2074 	mtree_test_store(mt, 68, (void *)0x89);
2075 	mtree_test_store(mt, 2, (void *)0x5);
2076 	mtree_test_insert(mt, 43, (void *)0x57);
2077 	mtree_test_insert(mt, 24, (void *)0x31);
2078 	mtree_test_insert(mt, 844, (void *)0x699);
2079 	mtree_test_store(mt, 84, (void *)0xa9);
2080 	mtree_test_store(mt, 4, (void *)0x9);
2081 	mtree_test_erase(mt, 4);
2082 	mtree_test_load(mt, 5);
2083 	mtree_test_erase(mt, 0);
2084 	mtree_destroy(mt);
2085 
2086 	/*
2087 	 * 3. Cause a node overflow on copy
2088 	 * Fixed by using the correct check for node size in mas_wr_modify()
2089 	 * Also discovered issue with metadata setting.
2090 	 */
2091 	mt_init_flags(mt, 0);
2092 	mtree_test_store_range(mt, 0, ULONG_MAX, (void *)0x1);
2093 	mtree_test_store(mt, 4, (void *)0x9);
2094 	mtree_test_erase(mt, 5);
2095 	mtree_test_erase(mt, 0);
2096 	mtree_test_erase(mt, 4);
2097 	mtree_test_store(mt, 5, (void *)0xb);
2098 	mtree_test_erase(mt, 5);
2099 	mtree_test_store(mt, 5, (void *)0xb);
2100 	mtree_test_erase(mt, 5);
2101 	mtree_test_erase(mt, 4);
2102 	mtree_test_store(mt, 4, (void *)0x9);
2103 	mtree_test_store(mt, 444, (void *)0x379);
2104 	mtree_test_store(mt, 0, (void *)0x1);
2105 	mtree_test_load(mt, 0);
2106 	mtree_test_store(mt, 5, (void *)0xb);
2107 	mtree_test_erase(mt, 0);
2108 	mtree_destroy(mt);
2109 
2110 	/*
2111 	 * 4. spanning store failure due to writing incorrect pivot value at
2112 	 * last slot.
2113 	 * Fixed by setting mast->r->max correctly in mast_cp_to_nodes()
2114 	 *
2115 	 */
2116 	mt_init_flags(mt, 0);
2117 	mtree_test_insert(mt, 261, (void *)0x20b);
2118 	mtree_test_store(mt, 516, (void *)0x409);
2119 	mtree_test_store(mt, 6, (void *)0xd);
2120 	mtree_test_insert(mt, 5, (void *)0xb);
2121 	mtree_test_insert(mt, 1256, (void *)0x9d1);
2122 	mtree_test_store(mt, 4, (void *)0x9);
2123 	mtree_test_erase(mt, 1);
2124 	mtree_test_store(mt, 56, (void *)0x71);
2125 	mtree_test_insert(mt, 1, (void *)0x3);
2126 	mtree_test_store(mt, 24, (void *)0x31);
2127 	mtree_test_erase(mt, 1);
2128 	mtree_test_insert(mt, 2263, (void *)0x11af);
2129 	mtree_test_insert(mt, 446, (void *)0x37d);
2130 	mtree_test_store_range(mt, 6, 45, (void *)0xd);
2131 	mtree_test_store_range(mt, 3, 446, (void *)0x7);
2132 	mtree_destroy(mt);
2133 
2134 	/*
2135 	 * 5. mas_wr_extend_null() may overflow slots.
2136 	 * Fix by checking against wr_mas->node_end.
2137 	 */
2138 	mt_init_flags(mt, 0);
2139 	mtree_test_store(mt, 48, (void *)0x61);
2140 	mtree_test_store(mt, 3, (void *)0x7);
2141 	mtree_test_load(mt, 0);
2142 	mtree_test_store(mt, 88, (void *)0xb1);
2143 	mtree_test_store(mt, 81, (void *)0xa3);
2144 	mtree_test_insert(mt, 0, (void *)0x1);
2145 	mtree_test_insert(mt, 8, (void *)0x11);
2146 	mtree_test_insert(mt, 4, (void *)0x9);
2147 	mtree_test_insert(mt, 2480, (void *)0x1361);
2148 	mtree_test_insert(mt, ULONG_MAX,
2149 			  (void *)0xffffffffffffffff);
2150 	mtree_test_erase(mt, ULONG_MAX);
2151 	mtree_destroy(mt);
2152 
2153 	/*
2154 	 * 6.  When reusing a node with an implied pivot and the node is
2155 	 * shrinking, old data would be left in the implied slot
2156 	 * Fixed by checking the last pivot for the mas->max and clear
2157 	 * accordingly.  This only affected the left-most node as that node is
2158 	 * the only one allowed to end in NULL.
2159 	 */
2160 	mt_init_flags(mt, 0);
2161 	mtree_test_erase(mt, 3);
2162 	mtree_test_insert(mt, 22, (void *)0x2d);
2163 	mtree_test_insert(mt, 15, (void *)0x1f);
2164 	mtree_test_load(mt, 2);
2165 	mtree_test_insert(mt, 1, (void *)0x3);
2166 	mtree_test_insert(mt, 1, (void *)0x3);
2167 	mtree_test_insert(mt, 5, (void *)0xb);
2168 	mtree_test_erase(mt, 1);
2169 	mtree_test_insert(mt, 1, (void *)0x3);
2170 	mtree_test_insert(mt, 4, (void *)0x9);
2171 	mtree_test_insert(mt, 1, (void *)0x3);
2172 	mtree_test_erase(mt, 1);
2173 	mtree_test_insert(mt, 2, (void *)0x5);
2174 	mtree_test_insert(mt, 1, (void *)0x3);
2175 	mtree_test_erase(mt, 3);
2176 	mtree_test_insert(mt, 22, (void *)0x2d);
2177 	mtree_test_insert(mt, 15, (void *)0x1f);
2178 	mtree_test_insert(mt, 2, (void *)0x5);
2179 	mtree_test_insert(mt, 1, (void *)0x3);
2180 	mtree_test_insert(mt, 8, (void *)0x11);
2181 	mtree_test_load(mt, 2);
2182 	mtree_test_insert(mt, 1, (void *)0x3);
2183 	mtree_test_insert(mt, 1, (void *)0x3);
2184 	mtree_test_store(mt, 1, (void *)0x3);
2185 	mtree_test_insert(mt, 5, (void *)0xb);
2186 	mtree_test_erase(mt, 1);
2187 	mtree_test_insert(mt, 1, (void *)0x3);
2188 	mtree_test_insert(mt, 4, (void *)0x9);
2189 	mtree_test_insert(mt, 1, (void *)0x3);
2190 	mtree_test_erase(mt, 1);
2191 	mtree_test_insert(mt, 2, (void *)0x5);
2192 	mtree_test_insert(mt, 1, (void *)0x3);
2193 	mtree_test_erase(mt, 3);
2194 	mtree_test_insert(mt, 22, (void *)0x2d);
2195 	mtree_test_insert(mt, 15, (void *)0x1f);
2196 	mtree_test_insert(mt, 2, (void *)0x5);
2197 	mtree_test_insert(mt, 1, (void *)0x3);
2198 	mtree_test_insert(mt, 8, (void *)0x11);
2199 	mtree_test_insert(mt, 12, (void *)0x19);
2200 	mtree_test_erase(mt, 1);
2201 	mtree_test_store_range(mt, 4, 62, (void *)0x9);
2202 	mtree_test_erase(mt, 62);
2203 	mtree_test_store_range(mt, 1, 0, (void *)0x3);
2204 	mtree_test_insert(mt, 11, (void *)0x17);
2205 	mtree_test_insert(mt, 3, (void *)0x7);
2206 	mtree_test_insert(mt, 3, (void *)0x7);
2207 	mtree_test_store(mt, 62, (void *)0x7d);
2208 	mtree_test_erase(mt, 62);
2209 	mtree_test_store_range(mt, 1, 15, (void *)0x3);
2210 	mtree_test_erase(mt, 1);
2211 	mtree_test_insert(mt, 22, (void *)0x2d);
2212 	mtree_test_insert(mt, 12, (void *)0x19);
2213 	mtree_test_erase(mt, 1);
2214 	mtree_test_insert(mt, 3, (void *)0x7);
2215 	mtree_test_store(mt, 62, (void *)0x7d);
2216 	mtree_test_erase(mt, 62);
2217 	mtree_test_insert(mt, 122, (void *)0xf5);
2218 	mtree_test_store(mt, 3, (void *)0x7);
2219 	mtree_test_insert(mt, 0, (void *)0x1);
2220 	mtree_test_store_range(mt, 0, 1, (void *)0x1);
2221 	mtree_test_insert(mt, 85, (void *)0xab);
2222 	mtree_test_insert(mt, 72, (void *)0x91);
2223 	mtree_test_insert(mt, 81, (void *)0xa3);
2224 	mtree_test_insert(mt, 726, (void *)0x5ad);
2225 	mtree_test_insert(mt, 0, (void *)0x1);
2226 	mtree_test_insert(mt, 1, (void *)0x3);
2227 	mtree_test_store(mt, 51, (void *)0x67);
2228 	mtree_test_insert(mt, 611, (void *)0x4c7);
2229 	mtree_test_insert(mt, 485, (void *)0x3cb);
2230 	mtree_test_insert(mt, 1, (void *)0x3);
2231 	mtree_test_erase(mt, 1);
2232 	mtree_test_insert(mt, 0, (void *)0x1);
2233 	mtree_test_insert(mt, 1, (void *)0x3);
2234 	mtree_test_insert_range(mt, 26, 1, (void *)0x35);
2235 	mtree_test_load(mt, 1);
2236 	mtree_test_store_range(mt, 1, 22, (void *)0x3);
2237 	mtree_test_insert(mt, 1, (void *)0x3);
2238 	mtree_test_erase(mt, 1);
2239 	mtree_test_load(mt, 53);
2240 	mtree_test_load(mt, 1);
2241 	mtree_test_store_range(mt, 1, 1, (void *)0x3);
2242 	mtree_test_insert(mt, 222, (void *)0x1bd);
2243 	mtree_test_insert(mt, 485, (void *)0x3cb);
2244 	mtree_test_insert(mt, 1, (void *)0x3);
2245 	mtree_test_erase(mt, 1);
2246 	mtree_test_load(mt, 0);
2247 	mtree_test_insert(mt, 21, (void *)0x2b);
2248 	mtree_test_insert(mt, 3, (void *)0x7);
2249 	mtree_test_store(mt, 621, (void *)0x4db);
2250 	mtree_test_insert(mt, 0, (void *)0x1);
2251 	mtree_test_erase(mt, 5);
2252 	mtree_test_insert(mt, 1, (void *)0x3);
2253 	mtree_test_store(mt, 62, (void *)0x7d);
2254 	mtree_test_erase(mt, 62);
2255 	mtree_test_store_range(mt, 1, 0, (void *)0x3);
2256 	mtree_test_insert(mt, 22, (void *)0x2d);
2257 	mtree_test_insert(mt, 12, (void *)0x19);
2258 	mtree_test_erase(mt, 1);
2259 	mtree_test_insert(mt, 1, (void *)0x3);
2260 	mtree_test_store_range(mt, 4, 62, (void *)0x9);
2261 	mtree_test_erase(mt, 62);
2262 	mtree_test_erase(mt, 1);
2263 	mtree_test_load(mt, 1);
2264 	mtree_test_store_range(mt, 1, 22, (void *)0x3);
2265 	mtree_test_insert(mt, 1, (void *)0x3);
2266 	mtree_test_erase(mt, 1);
2267 	mtree_test_load(mt, 53);
2268 	mtree_test_load(mt, 1);
2269 	mtree_test_store_range(mt, 1, 1, (void *)0x3);
2270 	mtree_test_insert(mt, 222, (void *)0x1bd);
2271 	mtree_test_insert(mt, 485, (void *)0x3cb);
2272 	mtree_test_insert(mt, 1, (void *)0x3);
2273 	mtree_test_erase(mt, 1);
2274 	mtree_test_insert(mt, 1, (void *)0x3);
2275 	mtree_test_load(mt, 0);
2276 	mtree_test_load(mt, 0);
2277 	mtree_destroy(mt);
2278 
2279 	/*
2280 	 * 7. Previous fix was incomplete, fix mas_resuse_node() clearing of old
2281 	 * data by overwriting it first - that way metadata is of no concern.
2282 	 */
2283 	mt_init_flags(mt, 0);
2284 	mtree_test_load(mt, 1);
2285 	mtree_test_insert(mt, 102, (void *)0xcd);
2286 	mtree_test_erase(mt, 2);
2287 	mtree_test_erase(mt, 0);
2288 	mtree_test_load(mt, 0);
2289 	mtree_test_insert(mt, 4, (void *)0x9);
2290 	mtree_test_insert(mt, 2, (void *)0x5);
2291 	mtree_test_insert(mt, 110, (void *)0xdd);
2292 	mtree_test_insert(mt, 1, (void *)0x3);
2293 	mtree_test_insert_range(mt, 5, 0, (void *)0xb);
2294 	mtree_test_erase(mt, 2);
2295 	mtree_test_store(mt, 0, (void *)0x1);
2296 	mtree_test_store(mt, 112, (void *)0xe1);
2297 	mtree_test_insert(mt, 21, (void *)0x2b);
2298 	mtree_test_store(mt, 1, (void *)0x3);
2299 	mtree_test_insert_range(mt, 110, 2, (void *)0xdd);
2300 	mtree_test_store(mt, 2, (void *)0x5);
2301 	mtree_test_load(mt, 22);
2302 	mtree_test_erase(mt, 2);
2303 	mtree_test_store(mt, 210, (void *)0x1a5);
2304 	mtree_test_store_range(mt, 0, 2, (void *)0x1);
2305 	mtree_test_store(mt, 2, (void *)0x5);
2306 	mtree_test_erase(mt, 2);
2307 	mtree_test_erase(mt, 22);
2308 	mtree_test_erase(mt, 1);
2309 	mtree_test_erase(mt, 2);
2310 	mtree_test_store(mt, 0, (void *)0x1);
2311 	mtree_test_load(mt, 112);
2312 	mtree_test_insert(mt, 2, (void *)0x5);
2313 	mtree_test_erase(mt, 2);
2314 	mtree_test_store(mt, 1, (void *)0x3);
2315 	mtree_test_insert_range(mt, 1, 2, (void *)0x3);
2316 	mtree_test_erase(mt, 0);
2317 	mtree_test_erase(mt, 2);
2318 	mtree_test_store(mt, 2, (void *)0x5);
2319 	mtree_test_erase(mt, 0);
2320 	mtree_test_erase(mt, 2);
2321 	mtree_test_store(mt, 0, (void *)0x1);
2322 	mtree_test_store(mt, 0, (void *)0x1);
2323 	mtree_test_erase(mt, 2);
2324 	mtree_test_store(mt, 2, (void *)0x5);
2325 	mtree_test_erase(mt, 2);
2326 	mtree_test_insert(mt, 2, (void *)0x5);
2327 	mtree_test_insert_range(mt, 1, 2, (void *)0x3);
2328 	mtree_test_erase(mt, 0);
2329 	mtree_test_erase(mt, 2);
2330 	mtree_test_store(mt, 0, (void *)0x1);
2331 	mtree_test_load(mt, 112);
2332 	mtree_test_store_range(mt, 110, 12, (void *)0xdd);
2333 	mtree_test_store(mt, 2, (void *)0x5);
2334 	mtree_test_load(mt, 110);
2335 	mtree_test_insert_range(mt, 4, 71, (void *)0x9);
2336 	mtree_test_load(mt, 2);
2337 	mtree_test_store(mt, 2, (void *)0x5);
2338 	mtree_test_insert_range(mt, 11, 22, (void *)0x17);
2339 	mtree_test_erase(mt, 12);
2340 	mtree_test_store(mt, 2, (void *)0x5);
2341 	mtree_test_load(mt, 22);
2342 	mtree_destroy(mt);
2343 
2344 
2345 	/*
2346 	 * 8.  When rebalancing or spanning_rebalance(), the max of the new node
2347 	 * may be set incorrectly to the final pivot and not the right max.
2348 	 * Fix by setting the left max to orig right max if the entire node is
2349 	 * consumed.
2350 	 */
2351 	mt_init_flags(mt, 0);
2352 	mtree_test_store(mt, 6, (void *)0xd);
2353 	mtree_test_store(mt, 67, (void *)0x87);
2354 	mtree_test_insert(mt, 15, (void *)0x1f);
2355 	mtree_test_insert(mt, 6716, (void *)0x3479);
2356 	mtree_test_store(mt, 61, (void *)0x7b);
2357 	mtree_test_insert(mt, 13, (void *)0x1b);
2358 	mtree_test_store(mt, 8, (void *)0x11);
2359 	mtree_test_insert(mt, 1, (void *)0x3);
2360 	mtree_test_load(mt, 0);
2361 	mtree_test_erase(mt, 67167);
2362 	mtree_test_insert_range(mt, 6, 7167, (void *)0xd);
2363 	mtree_test_insert(mt, 6, (void *)0xd);
2364 	mtree_test_erase(mt, 67);
2365 	mtree_test_insert(mt, 1, (void *)0x3);
2366 	mtree_test_erase(mt, 667167);
2367 	mtree_test_insert(mt, 6, (void *)0xd);
2368 	mtree_test_store(mt, 67, (void *)0x87);
2369 	mtree_test_insert(mt, 5, (void *)0xb);
2370 	mtree_test_erase(mt, 1);
2371 	mtree_test_insert(mt, 6, (void *)0xd);
2372 	mtree_test_erase(mt, 67);
2373 	mtree_test_insert(mt, 15, (void *)0x1f);
2374 	mtree_test_insert(mt, 67167, (void *)0x20cbf);
2375 	mtree_test_insert(mt, 1, (void *)0x3);
2376 	mtree_test_load(mt, 7);
2377 	mtree_test_insert(mt, 16, (void *)0x21);
2378 	mtree_test_insert(mt, 36, (void *)0x49);
2379 	mtree_test_store(mt, 67, (void *)0x87);
2380 	mtree_test_store(mt, 6, (void *)0xd);
2381 	mtree_test_insert(mt, 367, (void *)0x2df);
2382 	mtree_test_insert(mt, 115, (void *)0xe7);
2383 	mtree_test_store(mt, 0, (void *)0x1);
2384 	mtree_test_store_range(mt, 1, 3, (void *)0x3);
2385 	mtree_test_store(mt, 1, (void *)0x3);
2386 	mtree_test_erase(mt, 67167);
2387 	mtree_test_insert_range(mt, 6, 47, (void *)0xd);
2388 	mtree_test_store(mt, 1, (void *)0x3);
2389 	mtree_test_insert_range(mt, 1, 67, (void *)0x3);
2390 	mtree_test_load(mt, 67);
2391 	mtree_test_insert(mt, 1, (void *)0x3);
2392 	mtree_test_erase(mt, 67167);
2393 	mtree_destroy(mt);
2394 
2395 	/*
2396 	 * 9. spanning store to the end of data caused an invalid metadata
2397 	 * length which resulted in a crash eventually.
2398 	 * Fix by checking if there is a value in pivot before incrementing the
2399 	 * metadata end in mab_mas_cp().  To ensure this doesn't happen again,
2400 	 * abstract the two locations this happens into a function called
2401 	 * mas_leaf_set_meta().
2402 	 */
2403 	mt_init_flags(mt, 0);
2404 	mtree_test_insert(mt, 21, (void *)0x2b);
2405 	mtree_test_insert(mt, 12, (void *)0x19);
2406 	mtree_test_insert(mt, 6, (void *)0xd);
2407 	mtree_test_insert(mt, 8, (void *)0x11);
2408 	mtree_test_insert(mt, 2, (void *)0x5);
2409 	mtree_test_insert(mt, 91, (void *)0xb7);
2410 	mtree_test_insert(mt, 18, (void *)0x25);
2411 	mtree_test_insert(mt, 81, (void *)0xa3);
2412 	mtree_test_store_range(mt, 0, 128, (void *)0x1);
2413 	mtree_test_store(mt, 1, (void *)0x3);
2414 	mtree_test_erase(mt, 8);
2415 	mtree_test_insert(mt, 11, (void *)0x17);
2416 	mtree_test_insert(mt, 8, (void *)0x11);
2417 	mtree_test_insert(mt, 21, (void *)0x2b);
2418 	mtree_test_insert(mt, 2, (void *)0x5);
2419 	mtree_test_insert(mt, ULONG_MAX - 10, (void *)0xffffffffffffffeb);
2420 	mtree_test_erase(mt, ULONG_MAX - 10);
2421 	mtree_test_store_range(mt, 0, 281, (void *)0x1);
2422 	mtree_test_erase(mt, 2);
2423 	mtree_test_insert(mt, 1211, (void *)0x977);
2424 	mtree_test_insert(mt, 111, (void *)0xdf);
2425 	mtree_test_insert(mt, 13, (void *)0x1b);
2426 	mtree_test_insert(mt, 211, (void *)0x1a7);
2427 	mtree_test_insert(mt, 11, (void *)0x17);
2428 	mtree_test_insert(mt, 5, (void *)0xb);
2429 	mtree_test_insert(mt, 1218, (void *)0x985);
2430 	mtree_test_insert(mt, 61, (void *)0x7b);
2431 	mtree_test_store(mt, 1, (void *)0x3);
2432 	mtree_test_insert(mt, 121, (void *)0xf3);
2433 	mtree_test_insert(mt, 8, (void *)0x11);
2434 	mtree_test_insert(mt, 21, (void *)0x2b);
2435 	mtree_test_insert(mt, 2, (void *)0x5);
2436 	mtree_test_insert(mt, ULONG_MAX - 10, (void *)0xffffffffffffffeb);
2437 	mtree_test_erase(mt, ULONG_MAX - 10);
2438 }
2439 
2440 /* duplicate the tree with a specific gap */
2441 static noinline void check_dup_gaps(struct maple_tree *mt,
2442 				    unsigned long nr_entries, bool zero_start,
2443 				    unsigned long gap)
2444 {
2445 	unsigned long i = 0;
2446 	struct maple_tree newmt;
2447 	int ret;
2448 	void *tmp;
2449 	MA_STATE(mas, mt, 0, 0);
2450 	MA_STATE(newmas, &newmt, 0, 0);
2451 
2452 	if (!zero_start)
2453 		i = 1;
2454 
2455 	mt_zero_nr_tallocated();
2456 	for (; i <= nr_entries; i++)
2457 		mtree_store_range(mt, i*10, (i+1)*10 - gap,
2458 				  xa_mk_value(i), GFP_KERNEL);
2459 
2460 	mt_init_flags(&newmt, MT_FLAGS_ALLOC_RANGE);
2461 	mt_set_non_kernel(99999);
2462 	mas_lock(&newmas);
2463 	ret = mas_expected_entries(&newmas, nr_entries);
2464 	mt_set_non_kernel(0);
2465 	MT_BUG_ON(mt, ret != 0);
2466 
2467 	rcu_read_lock();
2468 	mas_for_each(&mas, tmp, ULONG_MAX) {
2469 		newmas.index = mas.index;
2470 		newmas.last = mas.last;
2471 		mas_store(&newmas, tmp);
2472 	}
2473 	rcu_read_unlock();
2474 	mas_destroy(&newmas);
2475 	mas_unlock(&newmas);
2476 
2477 	mtree_destroy(&newmt);
2478 }
2479 
2480 /* Duplicate many sizes of trees.  Mainly to test expected entry values */
2481 static noinline void check_dup(struct maple_tree *mt)
2482 {
2483 	int i;
2484 	int big_start = 100010;
2485 
2486 	/* Check with a value at zero */
2487 	for (i = 10; i < 1000; i++) {
2488 		mt_init_flags(mt, MT_FLAGS_ALLOC_RANGE);
2489 		check_dup_gaps(mt, i, true, 5);
2490 		mtree_destroy(mt);
2491 		rcu_barrier();
2492 	}
2493 
2494 	cond_resched();
2495 	mt_cache_shrink();
2496 	/* Check with a value at zero, no gap */
2497 	for (i = 1000; i < 2000; i++) {
2498 		mt_init_flags(mt, MT_FLAGS_ALLOC_RANGE);
2499 		check_dup_gaps(mt, i, true, 0);
2500 		mtree_destroy(mt);
2501 		rcu_barrier();
2502 	}
2503 
2504 	cond_resched();
2505 	mt_cache_shrink();
2506 	/* Check with a value at zero and unreasonably large */
2507 	for (i = big_start; i < big_start + 10; i++) {
2508 		mt_init_flags(mt, MT_FLAGS_ALLOC_RANGE);
2509 		check_dup_gaps(mt, i, true, 5);
2510 		mtree_destroy(mt);
2511 		rcu_barrier();
2512 	}
2513 
2514 	cond_resched();
2515 	mt_cache_shrink();
2516 	/* Small to medium size not starting at zero*/
2517 	for (i = 200; i < 1000; i++) {
2518 		mt_init_flags(mt, MT_FLAGS_ALLOC_RANGE);
2519 		check_dup_gaps(mt, i, false, 5);
2520 		mtree_destroy(mt);
2521 		rcu_barrier();
2522 	}
2523 
2524 	cond_resched();
2525 	mt_cache_shrink();
2526 	/* Unreasonably large not starting at zero*/
2527 	for (i = big_start; i < big_start + 10; i++) {
2528 		mt_init_flags(mt, MT_FLAGS_ALLOC_RANGE);
2529 		check_dup_gaps(mt, i, false, 5);
2530 		mtree_destroy(mt);
2531 		rcu_barrier();
2532 		cond_resched();
2533 		mt_cache_shrink();
2534 	}
2535 
2536 	/* Check non-allocation tree not starting at zero */
2537 	for (i = 1500; i < 3000; i++) {
2538 		mt_init_flags(mt, 0);
2539 		check_dup_gaps(mt, i, false, 5);
2540 		mtree_destroy(mt);
2541 		rcu_barrier();
2542 		cond_resched();
2543 		if (i % 2 == 0)
2544 			mt_cache_shrink();
2545 	}
2546 
2547 	mt_cache_shrink();
2548 	/* Check non-allocation tree starting at zero */
2549 	for (i = 200; i < 1000; i++) {
2550 		mt_init_flags(mt, 0);
2551 		check_dup_gaps(mt, i, true, 5);
2552 		mtree_destroy(mt);
2553 		rcu_barrier();
2554 		cond_resched();
2555 	}
2556 
2557 	mt_cache_shrink();
2558 	/* Unreasonably large */
2559 	for (i = big_start + 5; i < big_start + 10; i++) {
2560 		mt_init_flags(mt, 0);
2561 		check_dup_gaps(mt, i, true, 5);
2562 		mtree_destroy(mt);
2563 		rcu_barrier();
2564 		mt_cache_shrink();
2565 		cond_resched();
2566 	}
2567 }
2568 
2569 static noinline void check_bnode_min_spanning(struct maple_tree *mt)
2570 {
2571 	int i = 50;
2572 	MA_STATE(mas, mt, 0, 0);
2573 
2574 	mt_set_non_kernel(9999);
2575 	mas_lock(&mas);
2576 	do {
2577 		mas_set_range(&mas, i*10, i*10+9);
2578 		mas_store(&mas, check_bnode_min_spanning);
2579 	} while (i--);
2580 
2581 	mas_set_range(&mas, 240, 509);
2582 	mas_store(&mas, NULL);
2583 	mas_unlock(&mas);
2584 	mas_destroy(&mas);
2585 	mt_set_non_kernel(0);
2586 }
2587 
2588 static noinline void check_empty_area_window(struct maple_tree *mt)
2589 {
2590 	unsigned long i, nr_entries = 20;
2591 	MA_STATE(mas, mt, 0, 0);
2592 
2593 	for (i = 1; i <= nr_entries; i++)
2594 		mtree_store_range(mt, i*10, i*10 + 9,
2595 				  xa_mk_value(i), GFP_KERNEL);
2596 
2597 	/* Create another hole besides the one at 0 */
2598 	mtree_store_range(mt, 160, 169, NULL, GFP_KERNEL);
2599 
2600 	/* Check lower bounds that don't fit */
2601 	rcu_read_lock();
2602 	MT_BUG_ON(mt, mas_empty_area_rev(&mas, 5, 90, 10) != -EBUSY);
2603 
2604 	mas_reset(&mas);
2605 	MT_BUG_ON(mt, mas_empty_area_rev(&mas, 6, 90, 5) != -EBUSY);
2606 
2607 	/* Check lower bound that does fit */
2608 	mas_reset(&mas);
2609 	MT_BUG_ON(mt, mas_empty_area_rev(&mas, 5, 90, 5) != 0);
2610 	MT_BUG_ON(mt, mas.index != 5);
2611 	MT_BUG_ON(mt, mas.last != 9);
2612 	rcu_read_unlock();
2613 
2614 	/* Check one gap that doesn't fit and one that does */
2615 	rcu_read_lock();
2616 	mas_reset(&mas);
2617 	MT_BUG_ON(mt, mas_empty_area_rev(&mas, 5, 217, 9) != 0);
2618 	MT_BUG_ON(mt, mas.index != 161);
2619 	MT_BUG_ON(mt, mas.last != 169);
2620 
2621 	/* Check one gap that does fit above the min */
2622 	mas_reset(&mas);
2623 	MT_BUG_ON(mt, mas_empty_area_rev(&mas, 100, 218, 3) != 0);
2624 	MT_BUG_ON(mt, mas.index != 216);
2625 	MT_BUG_ON(mt, mas.last != 218);
2626 
2627 	/* Check size that doesn't fit any gap */
2628 	mas_reset(&mas);
2629 	MT_BUG_ON(mt, mas_empty_area_rev(&mas, 100, 218, 16) != -EBUSY);
2630 
2631 	/*
2632 	 * Check size that doesn't fit the lower end of the window but
2633 	 * does fit the gap
2634 	 */
2635 	mas_reset(&mas);
2636 	MT_BUG_ON(mt, mas_empty_area_rev(&mas, 167, 200, 4) != -EBUSY);
2637 
2638 	/*
2639 	 * Check size that doesn't fit the upper end of the window but
2640 	 * does fit the gap
2641 	 */
2642 	mas_reset(&mas);
2643 	MT_BUG_ON(mt, mas_empty_area_rev(&mas, 100, 162, 4) != -EBUSY);
2644 
2645 	/* Check mas_empty_area forward */
2646 	mas_reset(&mas);
2647 	MT_BUG_ON(mt, mas_empty_area(&mas, 0, 100, 9) != 0);
2648 	MT_BUG_ON(mt, mas.index != 0);
2649 	MT_BUG_ON(mt, mas.last != 8);
2650 
2651 	mas_reset(&mas);
2652 	MT_BUG_ON(mt, mas_empty_area(&mas, 0, 100, 4) != 0);
2653 	MT_BUG_ON(mt, mas.index != 0);
2654 	MT_BUG_ON(mt, mas.last != 3);
2655 
2656 	mas_reset(&mas);
2657 	MT_BUG_ON(mt, mas_empty_area(&mas, 0, 100, 11) != -EBUSY);
2658 
2659 	mas_reset(&mas);
2660 	MT_BUG_ON(mt, mas_empty_area(&mas, 5, 100, 6) != -EBUSY);
2661 
2662 	mas_reset(&mas);
2663 	MT_BUG_ON(mt, mas_empty_area(&mas, 0, 8, 10) != -EBUSY);
2664 
2665 	mas_reset(&mas);
2666 	mas_empty_area(&mas, 100, 165, 3);
2667 
2668 	mas_reset(&mas);
2669 	MT_BUG_ON(mt, mas_empty_area(&mas, 100, 163, 6) != -EBUSY);
2670 	rcu_read_unlock();
2671 }
2672 
2673 static noinline void check_empty_area_fill(struct maple_tree *mt)
2674 {
2675 	const unsigned long max = 0x25D78000;
2676 	unsigned long size;
2677 	int loop, shift;
2678 	MA_STATE(mas, mt, 0, 0);
2679 
2680 	mt_set_non_kernel(99999);
2681 	for (shift = 12; shift <= 16; shift++) {
2682 		loop = 5000;
2683 		size = 1 << shift;
2684 		while (loop--) {
2685 			mas_set(&mas, 0);
2686 			mas_lock(&mas);
2687 			MT_BUG_ON(mt, mas_empty_area(&mas, 0, max, size) != 0);
2688 			MT_BUG_ON(mt, mas.last != mas.index + size - 1);
2689 			mas_store_gfp(&mas, (void *)size, GFP_KERNEL);
2690 			mas_unlock(&mas);
2691 			mas_reset(&mas);
2692 		}
2693 	}
2694 
2695 	/* No space left. */
2696 	size = 0x1000;
2697 	rcu_read_lock();
2698 	MT_BUG_ON(mt, mas_empty_area(&mas, 0, max, size) != -EBUSY);
2699 	rcu_read_unlock();
2700 
2701 	/* Fill a depth 3 node to the maximum */
2702 	for (unsigned long i = 629440511; i <= 629440800; i += 6)
2703 		mtree_store_range(mt, i, i + 5, (void *)i, GFP_KERNEL);
2704 	/* Make space in the second-last depth 4 node */
2705 	mtree_erase(mt, 631668735);
2706 	/* Make space in the last depth 4 node */
2707 	mtree_erase(mt, 629506047);
2708 	mas_reset(&mas);
2709 	/* Search from just after the gap in the second-last depth 4 */
2710 	rcu_read_lock();
2711 	MT_BUG_ON(mt, mas_empty_area(&mas, 629506048, 690000000, 0x5000) != 0);
2712 	rcu_read_unlock();
2713 	mt_set_non_kernel(0);
2714 }
2715 
2716 static DEFINE_MTREE(tree);
2717 static int maple_tree_seed(void)
2718 {
2719 	unsigned long set[] = {5015, 5014, 5017, 25, 1000,
2720 			       1001, 1002, 1003, 1005, 0,
2721 			       5003, 5002};
2722 	void *ptr = &set;
2723 
2724 	pr_info("\nTEST STARTING\n\n");
2725 
2726 	mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
2727 	check_root_expand(&tree);
2728 	mtree_destroy(&tree);
2729 
2730 #if defined(BENCH_SLOT_STORE)
2731 #define BENCH
2732 	mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
2733 	bench_slot_store(&tree);
2734 	mtree_destroy(&tree);
2735 	goto skip;
2736 #endif
2737 #if defined(BENCH_NODE_STORE)
2738 #define BENCH
2739 	mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
2740 	bench_node_store(&tree);
2741 	mtree_destroy(&tree);
2742 	goto skip;
2743 #endif
2744 #if defined(BENCH_AWALK)
2745 #define BENCH
2746 	mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
2747 	bench_awalk(&tree);
2748 	mtree_destroy(&tree);
2749 	goto skip;
2750 #endif
2751 #if defined(BENCH_WALK)
2752 #define BENCH
2753 	mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
2754 	bench_walk(&tree);
2755 	mtree_destroy(&tree);
2756 	goto skip;
2757 #endif
2758 #if defined(BENCH_FORK)
2759 #define BENCH
2760 	mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
2761 	bench_forking(&tree);
2762 	mtree_destroy(&tree);
2763 	goto skip;
2764 #endif
2765 #if defined(BENCH_MT_FOR_EACH)
2766 #define BENCH
2767 	mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
2768 	bench_mt_for_each(&tree);
2769 	mtree_destroy(&tree);
2770 	goto skip;
2771 #endif
2772 
2773 	mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
2774 	check_iteration(&tree);
2775 	mtree_destroy(&tree);
2776 
2777 	mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
2778 	check_forking(&tree);
2779 	mtree_destroy(&tree);
2780 
2781 	mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
2782 	check_mas_store_gfp(&tree);
2783 	mtree_destroy(&tree);
2784 
2785 	/* Test ranges (store and insert) */
2786 	mt_init_flags(&tree, 0);
2787 	check_ranges(&tree);
2788 	mtree_destroy(&tree);
2789 
2790 #if defined(CONFIG_64BIT)
2791 	/* These tests have ranges outside of 4GB */
2792 	mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
2793 	check_alloc_range(&tree);
2794 	mtree_destroy(&tree);
2795 
2796 	mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
2797 	check_alloc_rev_range(&tree);
2798 	mtree_destroy(&tree);
2799 #endif
2800 
2801 	mt_init_flags(&tree, 0);
2802 
2803 	check_load(&tree, set[0], NULL);       /* See if 5015 -> NULL */
2804 
2805 	check_insert(&tree, set[9], &tree);     /* Insert 0 */
2806 	check_load(&tree, set[9], &tree);       /* See if 0 -> &tree */
2807 	check_load(&tree, set[0], NULL);       /* See if 5015 -> NULL */
2808 
2809 	check_insert(&tree, set[10], ptr);      /* Insert 5003 */
2810 	check_load(&tree, set[9], &tree);       /* See if 0 -> &tree */
2811 	check_load(&tree, set[11], NULL);       /* See if 5002 -> NULL */
2812 	check_load(&tree, set[10], ptr);       /* See if 5003 -> ptr */
2813 
2814 	/* Clear out the tree */
2815 	mtree_destroy(&tree);
2816 
2817 	/* Try to insert, insert a dup, and load back what was inserted. */
2818 	mt_init_flags(&tree, 0);
2819 	check_insert(&tree, set[0], &tree);     /* Insert 5015 */
2820 	check_dup_insert(&tree, set[0], &tree); /* Insert 5015 again */
2821 	check_load(&tree, set[0], &tree);       /* See if 5015 -> &tree */
2822 
2823 	/*
2824 	 * Second set of tests try to load a value that doesn't exist, inserts
2825 	 * a second value, then loads the value again
2826 	 */
2827 	check_load(&tree, set[1], NULL);        /* See if 5014 -> NULL */
2828 	check_insert(&tree, set[1], ptr);       /* insert 5014 -> ptr */
2829 	check_load(&tree, set[1], ptr);         /* See if 5014 -> ptr */
2830 	check_load(&tree, set[0], &tree);       /* See if 5015 -> &tree */
2831 	/*
2832 	 * Tree currently contains:
2833 	 * p[0]: 14 -> (nil) p[1]: 15 -> ptr p[2]: 16 -> &tree p[3]: 0 -> (nil)
2834 	 */
2835 	check_insert(&tree, set[6], ptr);       /* insert 1002 -> ptr */
2836 	check_insert(&tree, set[7], &tree);       /* insert 1003 -> &tree */
2837 
2838 	check_load(&tree, set[0], &tree);       /* See if 5015 -> &tree */
2839 	check_load(&tree, set[1], ptr);         /* See if 5014 -> ptr */
2840 	check_load(&tree, set[6], ptr);         /* See if 1002 -> ptr */
2841 	check_load(&tree, set[7], &tree);       /* 1003 = &tree ? */
2842 
2843 	/* Clear out tree */
2844 	mtree_destroy(&tree);
2845 
2846 	mt_init_flags(&tree, 0);
2847 	/* Test inserting into a NULL hole. */
2848 	check_insert(&tree, set[5], ptr);       /* insert 1001 -> ptr */
2849 	check_insert(&tree, set[7], &tree);       /* insert 1003 -> &tree */
2850 	check_insert(&tree, set[6], ptr);       /* insert 1002 -> ptr */
2851 	check_load(&tree, set[5], ptr);         /* See if 1001 -> ptr */
2852 	check_load(&tree, set[6], ptr);         /* See if 1002 -> ptr */
2853 	check_load(&tree, set[7], &tree);       /* See if 1003 -> &tree */
2854 
2855 	/* Clear out the tree */
2856 	mtree_destroy(&tree);
2857 
2858 	mt_init_flags(&tree, 0);
2859 	/*
2860 	 *       set[] = {5015, 5014, 5017, 25, 1000,
2861 	 *                1001, 1002, 1003, 1005, 0,
2862 	 *                5003, 5002};
2863 	 */
2864 
2865 	check_insert(&tree, set[0], ptr); /* 5015 */
2866 	check_insert(&tree, set[1], &tree); /* 5014 */
2867 	check_insert(&tree, set[2], ptr); /* 5017 */
2868 	check_insert(&tree, set[3], &tree); /* 25 */
2869 	check_load(&tree, set[0], ptr);
2870 	check_load(&tree, set[1], &tree);
2871 	check_load(&tree, set[2], ptr);
2872 	check_load(&tree, set[3], &tree);
2873 	check_insert(&tree, set[4], ptr); /* 1000 < Should split. */
2874 	check_load(&tree, set[0], ptr);
2875 	check_load(&tree, set[1], &tree);
2876 	check_load(&tree, set[2], ptr);
2877 	check_load(&tree, set[3], &tree); /*25 */
2878 	check_load(&tree, set[4], ptr);
2879 	check_insert(&tree, set[5], &tree); /* 1001 */
2880 	check_load(&tree, set[0], ptr);
2881 	check_load(&tree, set[1], &tree);
2882 	check_load(&tree, set[2], ptr);
2883 	check_load(&tree, set[3], &tree);
2884 	check_load(&tree, set[4], ptr);
2885 	check_load(&tree, set[5], &tree);
2886 	check_insert(&tree, set[6], ptr);
2887 	check_load(&tree, set[0], ptr);
2888 	check_load(&tree, set[1], &tree);
2889 	check_load(&tree, set[2], ptr);
2890 	check_load(&tree, set[3], &tree);
2891 	check_load(&tree, set[4], ptr);
2892 	check_load(&tree, set[5], &tree);
2893 	check_load(&tree, set[6], ptr);
2894 	check_insert(&tree, set[7], &tree);
2895 	check_load(&tree, set[0], ptr);
2896 	check_insert(&tree, set[8], ptr);
2897 
2898 	check_insert(&tree, set[9], &tree);
2899 
2900 	check_load(&tree, set[0], ptr);
2901 	check_load(&tree, set[1], &tree);
2902 	check_load(&tree, set[2], ptr);
2903 	check_load(&tree, set[3], &tree);
2904 	check_load(&tree, set[4], ptr);
2905 	check_load(&tree, set[5], &tree);
2906 	check_load(&tree, set[6], ptr);
2907 	check_load(&tree, set[9], &tree);
2908 	mtree_destroy(&tree);
2909 
2910 	mt_init_flags(&tree, 0);
2911 	check_seq(&tree, 16, false);
2912 	mtree_destroy(&tree);
2913 
2914 	mt_init_flags(&tree, 0);
2915 	check_seq(&tree, 1000, true);
2916 	mtree_destroy(&tree);
2917 
2918 	mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
2919 	check_rev_seq(&tree, 1000, true);
2920 	mtree_destroy(&tree);
2921 
2922 	check_lower_bound_split(&tree);
2923 	check_upper_bound_split(&tree);
2924 	check_mid_split(&tree);
2925 
2926 	mt_init_flags(&tree, 0);
2927 	check_next_entry(&tree);
2928 	check_find(&tree);
2929 	check_find_2(&tree);
2930 	mtree_destroy(&tree);
2931 
2932 	mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
2933 	check_prev_entry(&tree);
2934 	mtree_destroy(&tree);
2935 
2936 	mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
2937 	check_gap_combining(&tree);
2938 	mtree_destroy(&tree);
2939 
2940 	mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
2941 	check_node_overwrite(&tree);
2942 	mtree_destroy(&tree);
2943 
2944 	mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
2945 	next_prev_test(&tree);
2946 	mtree_destroy(&tree);
2947 
2948 	mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
2949 	check_spanning_relatives(&tree);
2950 	mtree_destroy(&tree);
2951 
2952 	mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
2953 	check_rev_find(&tree);
2954 	mtree_destroy(&tree);
2955 
2956 	mt_init_flags(&tree, 0);
2957 	check_fuzzer(&tree);
2958 	mtree_destroy(&tree);
2959 
2960 	mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
2961 	check_dup(&tree);
2962 	mtree_destroy(&tree);
2963 
2964 	mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
2965 	check_bnode_min_spanning(&tree);
2966 	mtree_destroy(&tree);
2967 
2968 	mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
2969 	check_empty_area_window(&tree);
2970 	mtree_destroy(&tree);
2971 
2972 	mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
2973 	check_empty_area_fill(&tree);
2974 	mtree_destroy(&tree);
2975 
2976 
2977 #if defined(BENCH)
2978 skip:
2979 #endif
2980 	rcu_barrier();
2981 	pr_info("maple_tree: %u of %u tests passed\n",
2982 			atomic_read(&maple_tree_tests_passed),
2983 			atomic_read(&maple_tree_tests_run));
2984 	if (atomic_read(&maple_tree_tests_run) ==
2985 	    atomic_read(&maple_tree_tests_passed))
2986 		return 0;
2987 
2988 	return -EINVAL;
2989 }
2990 
2991 static void maple_tree_harvest(void)
2992 {
2993 
2994 }
2995 
2996 module_init(maple_tree_seed);
2997 module_exit(maple_tree_harvest);
2998 MODULE_AUTHOR("Liam R. Howlett <Liam.Howlett@Oracle.com>");
2999 MODULE_LICENSE("GPL");
3000