]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
test_maple_tree: Add tests for prev/next
authorLiam R. Howlett <Liam.Howlett@Oracle.com>
Mon, 30 Nov 2020 20:34:39 +0000 (15:34 -0500)
committerLiam R. Howlett <Liam.Howlett@Oracle.com>
Tue, 5 Jan 2021 17:33:30 +0000 (12:33 -0500)
Signed-off-by: Liam R. Howlett <Liam.Howlett@Oracle.com>
lib/test_maple_tree.c

index e16d305a83458b3486692bfecb010de64550b69f..203926ef4919788579f8a24a43e7032b46a57ee0 100644 (file)
@@ -35430,6 +35430,156 @@ static noinline void bench_forking(struct maple_tree *mt)
 }
 #endif
 
+static noinline void next_prev_test(struct maple_tree *mt)
+{
+       int i, nr_entries = 200;
+       void *val;
+       MA_STATE(mas, mt, 0, 0);
+       struct maple_enode *mn;
+
+       for (i = 0; i <= nr_entries; i++)
+               mtree_store_range(mt, i*10, i*10 + 5,
+                                 xa_mk_value(i), GFP_KERNEL);
+
+       for (i = 0; i <= nr_entries / 2; i++) {
+               mas_next(&mas, 1000);
+               if (mas_is_none(&mas))
+                       break;
+
+       }
+       mas_reset(&mas);
+       mas_set(&mas, 0);
+       i = 0;
+       mas_for_each(&mas, val, 1000) {
+               i++;
+       }
+
+       mas_reset(&mas);
+       mas_set(&mas, 0);
+       i = 0;
+       mas_for_each(&mas, val, 1000) {
+               mas_pause(&mas);
+               i++;
+       }
+
+       // 680 - 685 = 0x61a00001930c
+       // 686 - 689 = NULL;
+       // 690 - 695 = 0x61a00001930c
+       /* Check simple next/prev */
+       mas_reset(&mas);
+       mas_set(&mas, 686);
+       val = mas_walk(&mas);
+       MT_BUG_ON(mt, val != NULL);
+
+       val = mas_next(&mas, 1000);
+       MT_BUG_ON(mt, val != xa_mk_value(690 / 10));
+       MT_BUG_ON(mt, mas.index != 690);
+       MT_BUG_ON(mt, mas.last != 695);
+
+       val = mas_prev(&mas, 0);
+       MT_BUG_ON(mt, val != xa_mk_value(680 / 10));
+       MT_BUG_ON(mt, mas.index != 680);
+       MT_BUG_ON(mt, mas.last != 685);
+
+       val = mas_next(&mas, 1000);
+       MT_BUG_ON(mt, val != xa_mk_value(690 / 10));
+       MT_BUG_ON(mt, mas.index != 690);
+       MT_BUG_ON(mt, mas.last != 695);
+
+       val = mas_next(&mas, 1000);
+       MT_BUG_ON(mt, val != xa_mk_value(700 / 10));
+       MT_BUG_ON(mt, mas.index != 700);
+       MT_BUG_ON(mt, mas.last != 705);
+
+       /* Check across node boundaries of the tree */
+       mas_reset(&mas);
+       mas_set(&mas, 70);
+       val = mas_walk(&mas);
+       MT_BUG_ON(mt, val != xa_mk_value(70/ 10));
+       MT_BUG_ON(mt, mas.index != 70);
+       MT_BUG_ON(mt, mas.last != 75);
+
+       val = mas_next(&mas, 1000);
+       MT_BUG_ON(mt, val != xa_mk_value(80 / 10));
+       MT_BUG_ON(mt, mas.index != 80);
+       MT_BUG_ON(mt, mas.last != 85);
+
+       val = mas_prev(&mas, 70);
+       MT_BUG_ON(mt, val != xa_mk_value(70 / 10));
+       MT_BUG_ON(mt, mas.index != 70);
+       MT_BUG_ON(mt, mas.last != 75);
+
+       /* Check across two levels of the tree */
+       mas_reset(&mas);
+       mas_set(&mas, 707);
+       val = mas_walk(&mas);
+       MT_BUG_ON(mt, val != NULL);
+       val = mas_next(&mas, 1000);
+       MT_BUG_ON(mt, val != xa_mk_value(710 / 10));
+       MT_BUG_ON(mt, mas.index != 710);
+       MT_BUG_ON(mt, mas.last != 715);
+       mn = mas.node;
+
+       val = mas_next(&mas, 1000);
+       MT_BUG_ON(mt, val != xa_mk_value(720 / 10));
+       MT_BUG_ON(mt, mas.index != 720);
+       MT_BUG_ON(mt, mas.last != 725);
+       MT_BUG_ON(mt, mn == mas.node);
+
+       val = mas_prev(&mas, 0);
+       MT_BUG_ON(mt, val != xa_mk_value(710 / 10));
+       MT_BUG_ON(mt, mas.index != 710);
+       MT_BUG_ON(mt, mas.last != 715);
+
+       /* Check running off the end and back on */
+       mas_reset(&mas);
+       mas_set(&mas, 2000);
+       val = mas_walk(&mas);
+       MT_BUG_ON(mt, val != xa_mk_value(2000 / 10));
+       MT_BUG_ON(mt, mas.index != 2000);
+       MT_BUG_ON(mt, mas.last != 2005);
+
+       val = mas_next(&mas, ULONG_MAX);
+       MT_BUG_ON(mt, val != NULL);
+       MT_BUG_ON(mt, mas.index != ULONG_MAX);
+       MT_BUG_ON(mt, mas.last != ULONG_MAX);
+
+       val = mas_prev(&mas, 0);
+       MT_BUG_ON(mt, val != xa_mk_value(2000 / 10));
+       MT_BUG_ON(mt, mas.index != 2000);
+       MT_BUG_ON(mt, mas.last != 2005);
+
+       /* Check running off the start and back on */
+       mas_reset(&mas);
+       mas_set(&mas, 10);
+       val = mas_walk(&mas);
+       MT_BUG_ON(mt, val != xa_mk_value(1));
+       MT_BUG_ON(mt, mas.index != 10);
+       MT_BUG_ON(mt, mas.last != 15);
+
+       val = mas_prev(&mas, 0);
+       MT_BUG_ON(mt, val != xa_mk_value(0));
+       MT_BUG_ON(mt, mas.index != 0);
+       MT_BUG_ON(mt, mas.last != 5);
+
+       val = mas_prev(&mas, 0);
+       MT_BUG_ON(mt, val != NULL);
+       MT_BUG_ON(mt, mas.index != 0);
+       MT_BUG_ON(mt, mas.last != 0);
+
+       mas.index = 0;
+       mas.last = 5;
+       mas_store(&mas, NULL);
+       mas_reset(&mas);
+       mas_set(&mas, 10);
+       mas_walk(&mas);
+
+       val = mas_prev(&mas, 0);
+       MT_BUG_ON(mt, val != NULL);
+       MT_BUG_ON(mt, mas.index != 0);
+       MT_BUG_ON(mt, mas.last != 0);
+}
+
 static DEFINE_MTREE(tree);
 static int maple_tree_seed(void)
 {
@@ -35650,6 +35800,10 @@ static int maple_tree_seed(void)
        check_node_overwrite(&tree);
        mtree_destroy(&tree);
 
+       mtree_init(&tree, MAPLE_ALLOC_RANGE);
+       next_prev_test(&tree);
+       mtree_destroy(&tree);
+
 #if defined(BENCH)
 skip:
 #endif