brintos

brintos / linux-shallow public Read only

0
0
Text · 1.5 KiB · cf4e5ab Raw
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