80 lines · c
1// SPDX-License-Identifier: GPL-2.02#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 14static pthread_barrier_t worker_barrier;15static int obj0, obj1;16static RADIX_TREE(mt_tree, GFP_KERNEL);17 18static 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 41static 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 58void 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}80