tests: rcutorture: use parameters rather than random
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Thu, 1 Oct 2015 19:01:14 +0000 (15:01 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Thu, 1 Oct 2015 19:01:14 +0000 (15:01 -0400)
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 <mathieu.desnoyers@efficios.com>
tests/regression/rcutorture.h
tests/regression/regression_tests

index 3444f5bdbab5e815234cc6976e4fd91f7e3f66c6..7de182f5db4025ad87effd3184c8b0d10bfdce55 100644 (file)
 DEFINE_PER_THREAD(long long, n_reads_pt);
 DEFINE_PER_THREAD(long long, n_updates_pt);
 
 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;
 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)
 {
 
 void *rcu_read_perf_test(void *arg)
 {
-       struct call_rcu_data *crdp;
        int i;
        int me = (long)arg;
        long long n_reads_local = 0;
        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();
        }
        __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);
        rcu_unregister_thread();
 
        return (NULL);
@@ -158,12 +162,12 @@ void *rcu_update_perf_test(void *arg)
 {
        long long n_updates_local = 0;
 
 {
        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) {
                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);
                }
        }
                        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;
                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;
 }
 
        return NULL;
 }
 
@@ -409,12 +420,12 @@ void *rcu_update_stress_test(void *arg)
 
 void *rcu_fake_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) {
                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);
                }
        }
                        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);
        }
                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;
 }
 
        return NULL;
 }
 
@@ -486,7 +504,7 @@ int stresstest(int nreaders)
 
 void usage(int argc, char *argv[])
 {
 
 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);
 }
 
        exit(-1);
 }
 
@@ -499,12 +517,36 @@ int main(int argc, char *argv[])
 
        smp_init();
        //rcu_init();
 
        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));
                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
        }
 
 #ifdef DEBUG_YIELD
@@ -513,6 +555,11 @@ int main(int argc, char *argv[])
 #endif
 
        if (argc > 1) {
 #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),
                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 {
                else
                        usage(argc, argv);
        } else {
-               ok(!perftest(nreaders, cpustride),
-                       "perftest readers: %d, stride: %d",
-                       nreaders, cpustride);
+               usage(argc, argv);
        }
 end:
        return exit_status();
        }
 end:
        return exit_status();
index cdd7571fc20d51b1689d705c4f145697cee9ba18..bbf9297dc5c4159a972f9cd700e81dd8b4d8b06c 100644 (file)
@@ -1,21 +1,61 @@
 ./test_urcu_fork
 ./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
This page took 0.029307 seconds and 4 git commands to generate.