root/tools/testing/radix-tree/regression4.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. reader_fn
  2. writer_fn
  3. regression4_test

   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 
  14 static pthread_barrier_t worker_barrier;
  15 static int obj0, obj1;
  16 static RADIX_TREE(mt_tree, GFP_KERNEL);
  17 
  18 static 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 
  41 static 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 
  58 void 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 }

/* [<][>][^][v][top][bottom][index][help] */