cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

regression4.c (1521B)


      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}