linux/tools/testing/radix-tree/regression4.c
<<
>>
Prefs
   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
  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