diff options
Diffstat (limited to 'tools/testing/radix-tree/regression4.c')
-rw-r--r-- | tools/testing/radix-tree/regression4.c | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/tools/testing/radix-tree/regression4.c b/tools/testing/radix-tree/regression4.c new file mode 100644 index 000000000000..cf4e5aba6b08 --- /dev/null +++ b/tools/testing/radix-tree/regression4.c | |||
@@ -0,0 +1,79 @@ | |||
1 | // SPDX-License-Identifier: GPL-2.0 | ||
2 | #include <linux/kernel.h> | ||
3 | #include <linux/gfp.h> | ||
4 | #include <linux/slab.h> | ||
5 | #include <linux/radix-tree.h> | ||
6 | #include <linux/rcupdate.h> | ||
7 | #include <stdlib.h> | ||
8 | #include <pthread.h> | ||
9 | #include <stdio.h> | ||
10 | #include <assert.h> | ||
11 | |||
12 | #include "regression.h" | ||
13 | |||
14 | static pthread_barrier_t worker_barrier; | ||
15 | static int obj0, obj1; | ||
16 | static RADIX_TREE(mt_tree, GFP_KERNEL); | ||
17 | |||
18 | static void *reader_fn(void *arg) | ||
19 | { | ||
20 | int i; | ||
21 | void *entry; | ||
22 | |||
23 | rcu_register_thread(); | ||
24 | pthread_barrier_wait(&worker_barrier); | ||
25 | |||
26 | for (i = 0; i < 1000000; i++) { | ||
27 | rcu_read_lock(); | ||
28 | entry = radix_tree_lookup(&mt_tree, 0); | ||
29 | rcu_read_unlock(); | ||
30 | if (entry != &obj0) { | ||
31 | printf("iteration %d bad entry = %p\n", i, entry); | ||
32 | abort(); | ||
33 | } | ||
34 | } | ||
35 | |||
36 | rcu_unregister_thread(); | ||
37 | |||
38 | return NULL; | ||
39 | } | ||
40 | |||
41 | static void *writer_fn(void *arg) | ||
42 | { | ||
43 | int i; | ||
44 | |||
45 | rcu_register_thread(); | ||
46 | pthread_barrier_wait(&worker_barrier); | ||
47 | |||
48 | for (i = 0; i < 1000000; i++) { | ||
49 | radix_tree_insert(&mt_tree, 1, &obj1); | ||
50 | radix_tree_delete(&mt_tree, 1); | ||
51 | } | ||
52 | |||
53 | rcu_unregister_thread(); | ||
54 | |||
55 | return NULL; | ||
56 | } | ||
57 | |||
58 | void regression4_test(void) | ||
59 | { | ||
60 | pthread_t reader, writer; | ||
61 | |||
62 | printv(1, "regression test 4 starting\n"); | ||
63 | |||
64 | radix_tree_insert(&mt_tree, 0, &obj0); | ||
65 | pthread_barrier_init(&worker_barrier, NULL, 2); | ||
66 | |||
67 | if (pthread_create(&reader, NULL, reader_fn, NULL) || | ||
68 | pthread_create(&writer, NULL, writer_fn, NULL)) { | ||
69 | perror("pthread_create"); | ||
70 | exit(1); | ||
71 | } | ||
72 | |||
73 | if (pthread_join(reader, NULL) || pthread_join(writer, NULL)) { | ||
74 | perror("pthread_join"); | ||
75 | exit(1); | ||
76 | } | ||
77 | |||
78 | printv(1, "regression test 4 passed\n"); | ||
79 | } | ||