X-Git-Url: https://git.liburcu.org/?a=blobdiff_plain;f=tests%2Fregression%2Frcutorture.h;h=46a673767ebd4d8ccc02063621a13f783149bfe9;hb=61c3fb603104bda9e67c0690c1964e61a770d045;hp=7de182f5db4025ad87effd3184c8b0d10bfdce55;hpb=26b5a74b238dae64c7ad68c04e44159b8ebe9bbb;p=urcu.git diff --git a/tests/regression/rcutorture.h b/tests/regression/rcutorture.h index 7de182f..46a6737 100644 --- a/tests/regression/rcutorture.h +++ b/tests/regression/rcutorture.h @@ -113,13 +113,13 @@ volatile int goflag __attribute__((__aligned__(CAA_CACHE_LINE_SIZE))) #endif #ifndef mark_rcu_quiescent_state -#define mark_rcu_quiescent_state() do ; while (0) +#define mark_rcu_quiescent_state() do {} while (0) #endif /* #ifdef mark_rcu_quiescent_state */ #ifndef put_thread_offline -#define put_thread_offline() do ; while (0) -#define put_thread_online() do ; while (0) -#define put_thread_online_delay() do ; while (0) +#define put_thread_offline() do {} while (0) +#define put_thread_online() do {} while (0) +#define put_thread_online_delay() do {} while (0) #else /* #ifndef put_thread_offline */ #define put_thread_online_delay() synchronize_rcu() #endif /* #else #ifndef put_thread_offline */ @@ -128,6 +128,7 @@ volatile int goflag __attribute__((__aligned__(CAA_CACHE_LINE_SIZE))) * Performance test. */ +static void *rcu_read_perf_test(void *arg) { int i; @@ -158,6 +159,7 @@ void *rcu_read_perf_test(void *arg) return (NULL); } +static void *rcu_update_perf_test(void *arg) { long long n_updates_local = 0; @@ -189,6 +191,7 @@ void *rcu_update_perf_test(void *arg) return NULL; } +static void perftestinit(void) { init_per_thread(n_reads_pt, 0LL); @@ -196,6 +199,7 @@ void perftestinit(void) uatomic_set(&nthreadsrunning, 0); } +static int perftestrun(int nthreads, int nreaders, int nupdaters) { int t; @@ -229,6 +233,7 @@ int perftestrun(int nthreads, int nreaders, int nupdaters) return 0; } +static int perftest(int nreaders, int cpustride) { int i; @@ -244,6 +249,7 @@ int perftest(int nreaders, int cpustride) return perftestrun(i + 1, nreaders, 1); } +static int rperftest(int nreaders, int cpustride) { int i; @@ -258,6 +264,7 @@ int rperftest(int nreaders, int cpustride) return perftestrun(i, nreaders, 0); } +static int uperftest(int nupdaters, int cpustride) { int i; @@ -292,6 +299,7 @@ DEFINE_PER_THREAD(long long [RCU_STRESS_PIPE_LEN + 1], rcu_stress_count); int garbage = 0; +static void *rcu_read_stress_test(void *arg) { int i; @@ -335,6 +343,7 @@ void *rcu_read_stress_test(void *arg) static pthread_mutex_t call_rcu_test_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_cond_t call_rcu_test_cond = PTHREAD_COND_INITIALIZER; +static void rcu_update_stress_test_rcu(struct rcu_head *head) { int ret; @@ -362,6 +371,7 @@ void rcu_update_stress_test_rcu(struct rcu_head *head) } } +static void *rcu_update_stress_test(void *arg) { int i; @@ -396,7 +406,23 @@ void *rcu_update_stress_test(void *arg) strerror(errno)); abort(); } + rcu_register_thread(); call_rcu(&rh, rcu_update_stress_test_rcu); + rcu_unregister_thread(); + /* + * Our MacOS X test machine with the following + * config: + * 15.6.0 Darwin Kernel Version 15.6.0 + * root:xnu-3248.60.10~1/RELEASE_X86_64 + * appears to have issues with liburcu-signal + * signal being delivered on top of + * pthread_cond_wait. It seems to make the + * thread continue, and therefore corrupt the + * rcu_head. Work around this issue by + * unregistering the RCU read-side thread + * immediately after call_rcu (call_rcu needs + * us to be registered RCU readers). + */ ret = pthread_cond_wait(&call_rcu_test_cond, &call_rcu_test_mutex); if (ret) { @@ -415,9 +441,11 @@ void *rcu_update_stress_test(void *arg) } n_updates++; } + return NULL; } +static void *rcu_fake_update_stress_test(void *arg) { if (callrcu_type == CALLRCU_PERTHREAD) { @@ -445,6 +473,7 @@ void *rcu_fake_update_stress_test(void *arg) return NULL; } +static int stresstest(int nreaders) { int i; @@ -502,6 +531,7 @@ int stresstest(int nreaders) * Mainprogram. */ +static void usage(int argc, char *argv[]) { diag("Usage: %s nreaders [ perf | rperf | uperf | stress ] [ stride ] [ callrcu_global | callrcu_percpu | callrcu_perthread ]\n", argv[0]); @@ -531,7 +561,7 @@ int main(int argc, char *argv[]) goto end; } } - + switch (callrcu_type) { case CALLRCU_GLOBAL: diag("Using global per-process call_rcu thread.");