From: Mathieu Desnoyers Date: Thu, 1 Oct 2015 19:01:14 +0000 (-0400) Subject: tests: rcutorture: use parameters rather than random X-Git-Tag: v0.9.0~14 X-Git-Url: https://git.lttng.org./?a=commitdiff_plain;h=26b5a74b238dae64c7ad68c04e44159b8ebe9bbb;p=userspace-rcu.git tests: rcutorture: use parameters rather than random Ensure those tests are reproducible by passing the kind of callrcu worker as parameter to the test rather than randomly choosing it within the test. Expand the regression_tests list to invoke the test with all kinds of callrcu workers. Signed-off-by: Mathieu Desnoyers --- diff --git a/tests/regression/rcutorture.h b/tests/regression/rcutorture.h index 3444f5b..7de182f 100644 --- a/tests/regression/rcutorture.h +++ b/tests/regression/rcutorture.h @@ -73,6 +73,14 @@ DEFINE_PER_THREAD(long long, n_reads_pt); DEFINE_PER_THREAD(long long, n_updates_pt); +enum callrcu_type { + CALLRCU_GLOBAL, + CALLRCU_PERCPU, + CALLRCU_PERTHREAD, +}; + +static enum callrcu_type callrcu_type = CALLRCU_GLOBAL; + long long n_reads = 0LL; long n_updates = 0L; int nthreadsrunning; @@ -122,7 +130,6 @@ volatile int goflag __attribute__((__aligned__(CAA_CACHE_LINE_SIZE))) void *rcu_read_perf_test(void *arg) { - struct call_rcu_data *crdp; int i; int me = (long)arg; long long n_reads_local = 0; @@ -146,9 +153,6 @@ void *rcu_read_perf_test(void *arg) } __get_thread_var(n_reads_pt) += n_reads_local; put_thread_offline(); - crdp = get_thread_call_rcu_data(); - set_thread_call_rcu_data(NULL); - call_rcu_data_free(crdp); rcu_unregister_thread(); return (NULL); @@ -158,12 +162,12 @@ void *rcu_update_perf_test(void *arg) { long long n_updates_local = 0; - if ((random() & 0xf00) == 0) { + if (callrcu_type == CALLRCU_PERTHREAD) { struct call_rcu_data *crdp; crdp = create_call_rcu_data(0, -1); if (crdp != NULL) { - diag("Using per-thread call_rcu() worker."); + diag("Successfully using per-thread call_rcu() worker."); set_thread_call_rcu_data(crdp); } } @@ -175,6 +179,13 @@ void *rcu_update_perf_test(void *arg) n_updates_local++; } __get_thread_var(n_updates_pt) += n_updates_local; + if (callrcu_type == CALLRCU_PERTHREAD) { + struct call_rcu_data *crdp; + + crdp = get_thread_call_rcu_data(); + set_thread_call_rcu_data(NULL); + call_rcu_data_free(crdp); + } return NULL; } @@ -409,12 +420,12 @@ void *rcu_update_stress_test(void *arg) void *rcu_fake_update_stress_test(void *arg) { - if ((random() & 0xf00) == 0) { + if (callrcu_type == CALLRCU_PERTHREAD) { struct call_rcu_data *crdp; crdp = create_call_rcu_data(0, -1); if (crdp != NULL) { - diag("Using per-thread call_rcu() worker."); + diag("Successfully using per-thread call_rcu() worker."); set_thread_call_rcu_data(crdp); } } @@ -424,6 +435,13 @@ void *rcu_fake_update_stress_test(void *arg) synchronize_rcu(); (void) poll(NULL, 0, 1); } + if (callrcu_type == CALLRCU_PERTHREAD) { + struct call_rcu_data *crdp; + + crdp = get_thread_call_rcu_data(); + set_thread_call_rcu_data(NULL); + call_rcu_data_free(crdp); + } return NULL; } @@ -486,7 +504,7 @@ int stresstest(int nreaders) void usage(int argc, char *argv[]) { - diag("Usage: %s [nreaders [ perf | rperf | uperf | stress ] ]\n", argv[0]); + diag("Usage: %s nreaders [ perf | rperf | uperf | stress ] [ stride ] [ callrcu_global | callrcu_percpu | callrcu_perthread ]\n", argv[0]); exit(-1); } @@ -499,12 +517,36 @@ int main(int argc, char *argv[]) smp_init(); //rcu_init(); - srandom(time(NULL)); - if (random() & 0x100) { - diag("Allocating per-CPU call_rcu threads."); + if (argc > 4) { + const char *callrcu_str = argv[4];; + + if (strcmp(callrcu_str, "callrcu_global") == 0) { + callrcu_type = CALLRCU_GLOBAL; + } else if (strcmp(callrcu_str, "callrcu_percpu") == 0) { + callrcu_type = CALLRCU_PERCPU; + } else if (strcmp(callrcu_str, "callrcu_perthread") == 0) { + callrcu_type = CALLRCU_PERTHREAD; + } else { + usage(argc, argv); + goto end; + } + } + + switch (callrcu_type) { + case CALLRCU_GLOBAL: + diag("Using global per-process call_rcu thread."); + break; + case CALLRCU_PERCPU: + diag("Using per-CPU call_rcu threads."); if (create_all_cpu_call_rcu_data(0)) diag("create_all_cpu_call_rcu_data: %s", strerror(errno)); + break; + case CALLRCU_PERTHREAD: + diag("Using per-thread call_rcu() worker."); + break; + default: + abort(); } #ifdef DEBUG_YIELD @@ -513,6 +555,11 @@ int main(int argc, char *argv[]) #endif if (argc > 1) { + if (strcmp(argv[1], "-h") == 0 + || strcmp(argv[1], "--help") == 0) { + usage(argc, argv); + goto end; + } nreaders = strtoul(argv[1], NULL, 0); if (argc == 2) { ok(!perftest(nreaders, cpustride), @@ -541,9 +588,7 @@ int main(int argc, char *argv[]) else usage(argc, argv); } else { - ok(!perftest(nreaders, cpustride), - "perftest readers: %d, stride: %d", - nreaders, cpustride); + usage(argc, argv); } end: return exit_status(); diff --git a/tests/regression/regression_tests b/tests/regression/regression_tests index cdd7571..bbf9297 100644 --- a/tests/regression/regression_tests +++ b/tests/regression/regression_tests @@ -1,21 +1,61 @@ ./test_urcu_fork -./rcutorture_urcu $(nproc) perf -./rcutorture_urcu_signal $(nproc) perf -./rcutorture_urcu_mb $(nproc) perf -./rcutorture_urcu_bp $(nproc) perf -./rcutorture_urcu_qsbr $(nproc) perf -./rcutorture_urcu $(nproc) rperf -./rcutorture_urcu_signal $(nproc) rperf -./rcutorture_urcu_mb $(nproc) rperf -./rcutorture_urcu_bp $(nproc) rperf -./rcutorture_urcu_qsbr $(nproc) rperf -./rcutorture_urcu $(nproc) uperf -./rcutorture_urcu_signal $(nproc) uperf -./rcutorture_urcu_mb $(nproc) uperf -./rcutorture_urcu_bp $(nproc) uperf -./rcutorture_urcu_qsbr $(nproc) uperf -./rcutorture_urcu $(nproc) stress -./rcutorture_urcu_signal $(nproc) stress -./rcutorture_urcu_mb $(nproc) stress -./rcutorture_urcu_bp $(nproc) stress -./rcutorture_urcu_qsbr $(nproc) stress +./rcutorture_urcu $(nproc) perf 1 callrcu_global +./rcutorture_urcu_signal $(nproc) perf 1 callrcu_global +./rcutorture_urcu_mb $(nproc) perf 1 callrcu_global +./rcutorture_urcu_bp $(nproc) perf 1 callrcu_global +./rcutorture_urcu_qsbr $(nproc) perf 1 callrcu_global +./rcutorture_urcu $(nproc) rperf 1 callrcu_global +./rcutorture_urcu_signal $(nproc) rperf 1 callrcu_global +./rcutorture_urcu_mb $(nproc) rperf 1 callrcu_global +./rcutorture_urcu_bp $(nproc) rperf 1 callrcu_global +./rcutorture_urcu_qsbr $(nproc) rperf 1 callrcu_global +./rcutorture_urcu $(nproc) uperf 1 callrcu_global +./rcutorture_urcu_signal $(nproc) uperf 1 callrcu_global +./rcutorture_urcu_mb $(nproc) uperf 1 callrcu_global +./rcutorture_urcu_bp $(nproc) uperf 1 callrcu_global +./rcutorture_urcu_qsbr $(nproc) uperf 1 callrcu_global +./rcutorture_urcu $(nproc) stress 1 callrcu_global +./rcutorture_urcu_signal $(nproc) stress 1 callrcu_global +./rcutorture_urcu_mb $(nproc) stress 1 callrcu_global +./rcutorture_urcu_bp $(nproc) stress 1 callrcu_global +./rcutorture_urcu_qsbr $(nproc) stress 1 callrcu_global +./rcutorture_urcu $(nproc) perf 1 callrcu_percpu +./rcutorture_urcu_signal $(nproc) perf 1 callrcu_percpu +./rcutorture_urcu_mb $(nproc) perf 1 callrcu_percpu +./rcutorture_urcu_bp $(nproc) perf 1 callrcu_percpu +./rcutorture_urcu_qsbr $(nproc) perf 1 callrcu_percpu +./rcutorture_urcu $(nproc) rperf 1 callrcu_percpu +./rcutorture_urcu_signal $(nproc) rperf 1 callrcu_percpu +./rcutorture_urcu_mb $(nproc) rperf 1 callrcu_percpu +./rcutorture_urcu_bp $(nproc) rperf 1 callrcu_percpu +./rcutorture_urcu_qsbr $(nproc) rperf 1 callrcu_percpu +./rcutorture_urcu $(nproc) uperf 1 callrcu_percpu +./rcutorture_urcu_signal $(nproc) uperf 1 callrcu_percpu +./rcutorture_urcu_mb $(nproc) uperf 1 callrcu_percpu +./rcutorture_urcu_bp $(nproc) uperf 1 callrcu_percpu +./rcutorture_urcu_qsbr $(nproc) uperf 1 callrcu_percpu +./rcutorture_urcu $(nproc) stress 1 callrcu_percpu +./rcutorture_urcu_signal $(nproc) stress 1 callrcu_percpu +./rcutorture_urcu_mb $(nproc) stress 1 callrcu_percpu +./rcutorture_urcu_bp $(nproc) stress 1 callrcu_percpu +./rcutorture_urcu_qsbr $(nproc) stress 1 callrcu_percpu +./rcutorture_urcu $(nproc) perf 1 callrcu_perthread +./rcutorture_urcu_signal $(nproc) perf 1 callrcu_perthread +./rcutorture_urcu_mb $(nproc) perf 1 callrcu_perthread +./rcutorture_urcu_bp $(nproc) perf 1 callrcu_perthread +./rcutorture_urcu_qsbr $(nproc) perf 1 callrcu_perthread +./rcutorture_urcu $(nproc) rperf 1 callrcu_perthread +./rcutorture_urcu_signal $(nproc) rperf 1 callrcu_perthread +./rcutorture_urcu_mb $(nproc) rperf 1 callrcu_perthread +./rcutorture_urcu_bp $(nproc) rperf 1 callrcu_perthread +./rcutorture_urcu_qsbr $(nproc) rperf 1 callrcu_perthread +./rcutorture_urcu $(nproc) uperf 1 callrcu_perthread +./rcutorture_urcu_signal $(nproc) uperf 1 callrcu_perthread +./rcutorture_urcu_mb $(nproc) uperf 1 callrcu_perthread +./rcutorture_urcu_bp $(nproc) uperf 1 callrcu_perthread +./rcutorture_urcu_qsbr $(nproc) uperf 1 callrcu_perthread +./rcutorture_urcu $(nproc) stress 1 callrcu_perthread +./rcutorture_urcu_signal $(nproc) stress 1 callrcu_perthread +./rcutorture_urcu_mb $(nproc) stress 1 callrcu_perthread +./rcutorture_urcu_bp $(nproc) stress 1 callrcu_perthread +./rcutorture_urcu_qsbr $(nproc) stress 1 callrcu_perthread