Merge tag 'trace-printf-v6.13' of git://git.kernel.org/pub/scm/linux/kernel/git/trace...
[drm/drm-misc.git] / tools / testing / radix-tree / regression4.c
blobcf4e5aba6b082a1766de7612cbfa68bb7b9d3b6d
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>
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)
20 int i;
21 void *entry;
23 rcu_register_thread();
24 pthread_barrier_wait(&worker_barrier);
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();
36 rcu_unregister_thread();
38 return NULL;
41 static void *writer_fn(void *arg)
43 int i;
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();
55 return NULL;
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");
70 exit(1);
73 if (pthread_join(reader, NULL) || pthread_join(writer, NULL)) {
74 perror("pthread_join");
75 exit(1);
78 printv(1, "regression test 4 passed\n");