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");