1 // SPDX-License-Identifier: GPL-2.0
2 #include <linux/kernel.h>
4 #include <linux/slab.h>
5 #include <linux/radix-tree.h>
6 #include <linux/rcupdate.h>
12 #include "regression.h"
14 static pthread_barrier_t worker_barrier
;
15 static int obj0
, obj1
;
16 static RADIX_TREE(mt_tree
, GFP_KERNEL
);
18 static void *reader_fn(void *arg
)
23 rcu_register_thread();
24 pthread_barrier_wait(&worker_barrier
);
26 for (i
= 0; i
< 1000000; i
++) {
28 entry
= radix_tree_lookup(&mt_tree
, 0);
31 printf("iteration %d bad entry = %p\n", i
, entry
);
36 rcu_unregister_thread();
41 static void *writer_fn(void *arg
)
45 rcu_register_thread();
46 pthread_barrier_wait(&worker_barrier
);
48 for (i
= 0; i
< 1000000; i
++) {
49 radix_tree_insert(&mt_tree
, 1, &obj1
);
50 radix_tree_delete(&mt_tree
, 1);
53 rcu_unregister_thread();
58 void regression4_test(void)
60 pthread_t reader
, writer
;
62 printv(1, "regression test 4 starting\n");
64 radix_tree_insert(&mt_tree
, 0, &obj0
);
65 pthread_barrier_init(&worker_barrier
, NULL
, 2);
67 if (pthread_create(&reader
, NULL
, reader_fn
, NULL
) ||
68 pthread_create(&writer
, NULL
, writer_fn
, NULL
)) {
69 perror("pthread_create");
73 if (pthread_join(reader
, NULL
) || pthread_join(writer
, NULL
)) {
74 perror("pthread_join");
78 printv(1, "regression test 4 passed\n");