]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
maple_tree: Add benchmarking for mas_for_each
authorLiam R. Howlett <Liam.Howlett@oracle.com>
Tue, 2 May 2023 16:08:24 +0000 (12:08 -0400)
committerLiam R. Howlett <Liam.Howlett@oracle.com>
Tue, 2 May 2023 17:56:44 +0000 (13:56 -0400)
Add a way to test the speed of mas_for_each() to the testing code.

Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
lib/test_maple_tree.c

index b406782920294af01f43781fb71504471d2f05d6..be4610e26682e4d7c0e3f9f36441b95ddaa4af5f 100644 (file)
@@ -23,6 +23,7 @@
 /* #define BENCH_WALK */
 /* #define BENCH_MT_FOR_EACH */
 /* #define BENCH_FORK */
+/* #define BENCH_MAS_FOR_EACH */
 
 #ifdef __KERNEL__
 #define mt_set_non_kernel(x)           do {} while (0)
@@ -1671,6 +1672,36 @@ static noinline void bench_mt_for_each(struct maple_tree *mt)
 }
 #endif
 
+#if defined(BENCH_MAS_FOR_EACH)
+static noinline void __init bench_mas_for_each(struct maple_tree *mt)
+{
+       int i, count = 1000000;
+       unsigned long max = 2500;
+       void *entry;
+       MA_STATE(mas, mt, 0, 0);
+
+       for (i = 0; i < max; i += 5) {
+               int gap = 4;
+               if (i % 30 == 0)
+                       gap = 3;
+               mtree_store_range(mt, i, i + gap, xa_mk_value(i), GFP_KERNEL);
+       }
+
+       rcu_read_lock();
+       for (i = 0; i < count; i++) {
+               unsigned long j = 0;
+
+               mas_for_each(&mas, entry, max) {
+                       MT_BUG_ON(mt, entry != xa_mk_value(j));
+                       j += 5;
+               }
+               mas_set(&mas, 0);
+       }
+       rcu_read_unlock();
+
+}
+#endif
+
 /* check_forking - simulate the kernel forking sequence with the tree. */
 static noinline void check_forking(struct maple_tree *mt)
 {
@@ -3395,6 +3426,13 @@ static int maple_tree_seed(void)
        mtree_destroy(&tree);
        goto skip;
 #endif
+#if defined(BENCH_MAS_FOR_EACH)
+#define BENCH
+       mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
+       bench_mas_for_each(&tree);
+       mtree_destroy(&tree);
+       goto skip;
+#endif
 
        mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
        check_iteration(&tree);