X-Git-Url: https://git.liburcu.org/?a=blobdiff_plain;f=test_urcu.c;h=016fa3f6c70ac2f7aa7c6c74cef1225493d6b1fa;hb=b4fde1d45c43e18b0589a983509bea738c54cbce;hp=4dfe2182860a41e497bf9fef36749f2382dc7bfa;hpb=8c86b9a193ba4b6a6a77443a7da693530716dff1;p=urcu.git diff --git a/test_urcu.c b/test_urcu.c index 4dfe218..016fa3f 100644 --- a/test_urcu.c +++ b/test_urcu.c @@ -20,6 +20,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +#define _GNU_SOURCE #include #include #include @@ -30,6 +31,9 @@ #include #include #include +#include + +#include "arch.h" #if defined(_syscall0) _syscall0(pid_t, gettid) @@ -57,39 +61,25 @@ struct test_array { int a; }; -static volatile int test_go; +static volatile int test_go, test_stop; static int wdelay; static struct test_array *test_rcu_pointer; static unsigned long duration; -static time_t start_time; -static unsigned long __thread duration_interval; -#define DURATION_TEST_DELAY_WRITE 4 -#define DURATION_TEST_DELAY_READ 100 /* * returns 0 if test should end. */ static int test_duration_write(void) { - if (duration_interval++ >= DURATION_TEST_DELAY_WRITE) { - duration_interval = 0; - if (time(NULL) - start_time >= duration) - return 0; - } - return 1; + return !test_stop; } static int test_duration_read(void) { - if (duration_interval++ >= DURATION_TEST_DELAY_READ) { - duration_interval = 0; - if (time(NULL) - start_time >= duration) - return 0; - } - return 1; + return !test_stop; } static unsigned long long __thread nr_writes; @@ -170,6 +160,7 @@ void *thr_reader(void *_count) while (!test_go) { } + smp_mb(); for (;;) { rcu_read_lock(); @@ -179,7 +170,7 @@ void *thr_reader(void *_count) assert(local_ptr->a == 8); rcu_read_unlock(); nr_reads++; - if (!test_duration_read()) + if (unlikely(!test_duration_read())) break; } @@ -203,6 +194,7 @@ void *thr_writer(void *_count) while (!test_go) { } + smp_mb(); for (;;) { new = test_array_alloc(); @@ -218,9 +210,9 @@ void *thr_writer(void *_count) old->a = 0; test_array_free(old); nr_writes++; - if (!test_duration_write()) + if (unlikely(!test_duration_write())) break; - if (wdelay) + if (unlikely(wdelay)) usleep(wdelay); } @@ -236,10 +228,13 @@ void show_usage(int argc, char **argv) #ifdef DEBUG_YIELD printf(" [-r] [-w] (yield reader and/or writer)"); #endif - printf(" [-d delay] (writer period)"); + printf(" [-d delay] (writer period (us))"); + printf(" [-a cpu#] [-a cpu#]... (affinity)"); printf("\n"); } +cpu_set_t affinity; + int main(int argc, char **argv) { int err; @@ -247,7 +242,8 @@ int main(int argc, char **argv) void *tret; unsigned long long *count_reader, *count_writer; unsigned long long tot_reads = 0, tot_writes = 0; - int i; + int i, a; + int use_affinity = 0; if (argc < 4) { show_usage(argc, argv); @@ -272,6 +268,8 @@ int main(int argc, char **argv) return -1; } + CPU_ZERO(&affinity); + for (i = 4; i < argc; i++) { if (argv[i][0] != '-') continue; @@ -284,8 +282,18 @@ int main(int argc, char **argv) yield_active |= YIELD_WRITE; break; #endif + case 'a': + if (argc < i + 2) { + show_usage(argc, argv); + return -1; + } + a = atoi(argv[++i]); + CPU_SET(a, &affinity); + use_affinity = 1; + printf("Adding CPU %d affinity\n", a); + break; case 'd': - if (argc < i + 1) { + if (argc < i + 2) { show_usage(argc, argv); return -1; } @@ -297,10 +305,15 @@ int main(int argc, char **argv) printf("running test for %lu seconds, %u readers, %u writers.\n", duration, nr_readers, nr_writers); printf("Writer delay : %u us.\n", wdelay); - start_time = time(NULL); printf("thread %-6s, thread id : %lx, tid %lu\n", "main", pthread_self(), (unsigned long)gettid()); + if (use_affinity + && sched_setaffinity(0, sizeof(affinity), &affinity) < 0) { + perror("sched_setaffinity"); + exit(-1); + } + test_array = malloc(sizeof(*test_array) * ARRAY_SIZE); tid_reader = malloc(sizeof(*tid_reader) * nr_readers); tid_writer = malloc(sizeof(*tid_writer) * nr_writers); @@ -320,8 +333,14 @@ int main(int argc, char **argv) exit(1); } + smp_mb(); + test_go = 1; + sleep(duration); + + test_stop = 1; + for (i = 0; i < nr_readers; i++) { err = pthread_join(tid_reader[i], &tret); if (err != 0)