Path: blob/master/tools/testing/radix-tree/regression4.c
26285 views
// SPDX-License-Identifier: GPL-2.01#include <linux/kernel.h>2#include <linux/gfp.h>3#include <linux/slab.h>4#include <linux/radix-tree.h>5#include <linux/rcupdate.h>6#include <stdlib.h>7#include <pthread.h>8#include <stdio.h>9#include <assert.h>1011#include "regression.h"1213static pthread_barrier_t worker_barrier;14static int obj0, obj1;15static RADIX_TREE(mt_tree, GFP_KERNEL);1617static void *reader_fn(void *arg)18{19int i;20void *entry;2122rcu_register_thread();23pthread_barrier_wait(&worker_barrier);2425for (i = 0; i < 1000000; i++) {26rcu_read_lock();27entry = radix_tree_lookup(&mt_tree, 0);28rcu_read_unlock();29if (entry != &obj0) {30printf("iteration %d bad entry = %p\n", i, entry);31abort();32}33}3435rcu_unregister_thread();3637return NULL;38}3940static void *writer_fn(void *arg)41{42int i;4344rcu_register_thread();45pthread_barrier_wait(&worker_barrier);4647for (i = 0; i < 1000000; i++) {48radix_tree_insert(&mt_tree, 1, &obj1);49radix_tree_delete(&mt_tree, 1);50}5152rcu_unregister_thread();5354return NULL;55}5657void regression4_test(void)58{59pthread_t reader, writer;6061printv(1, "regression test 4 starting\n");6263radix_tree_insert(&mt_tree, 0, &obj0);64pthread_barrier_init(&worker_barrier, NULL, 2);6566if (pthread_create(&reader, NULL, reader_fn, NULL) ||67pthread_create(&writer, NULL, writer_fn, NULL)) {68perror("pthread_create");69exit(1);70}7172if (pthread_join(reader, NULL) || pthread_join(writer, NULL)) {73perror("pthread_join");74exit(1);75}7677printv(1, "regression test 4 passed\n");78}798081