X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=tests%2Fbenchmark%2Ftest_urcu_workqueue.c;h=0074de05bbe967653e5b68d7ac548a5129e56cbe;hb=2f02be5c694af89378293d463aa5fd2c2ccd3848;hp=d12d9e8659f2f4d4e27f93626835288bf511c534;hpb=1b0a9891cd2f9100dc87745d77a4d0069a21adb7;p=userspace-rcu.git diff --git a/tests/benchmark/test_urcu_workqueue.c b/tests/benchmark/test_urcu_workqueue.c index d12d9e8..0074de0 100644 --- a/tests/benchmark/test_urcu_workqueue.c +++ b/tests/benchmark/test_urcu_workqueue.c @@ -60,6 +60,10 @@ static unsigned long duration; static unsigned long dispatch_delay_loops; +static unsigned long max_queue_len; + +static int test_steal; + static inline void loop_sleep(unsigned long loops) { while (loops-- != 0) @@ -153,10 +157,19 @@ static void *thr_dispatcher(void *_count) for (;;) { struct test_work *work = malloc(sizeof(*work)); + enum urcu_enqueue_ret ret; + if (!work) goto fail; - printf_verbose("queue work %p\n", work); - urcu_queue_work(&workqueue, &work->w); +retry: + printf_verbose("attempt queue work %p\n", work); + ret = urcu_queue_work(&workqueue, &work->w); + if (ret == URCU_ENQUEUE_FULL) { + printf_verbose("queue work %p (queue full)\n", work); + (void) poll(NULL, 0, 10); + goto retry; + } + printf_verbose("queue work %p (ok)\n", work); URCU_TLS(nr_enqueues)++; if (caa_unlikely(dispatch_delay_loops)) @@ -187,8 +200,7 @@ static void *thr_worker(void *_count) set_affinity(); rcu_register_thread(); - urcu_worker_init(&worker, URCU_WORKER_STEAL); - //urcu_worker_init(&worker, 0); + urcu_worker_init(&workqueue, &worker); urcu_worker_register(&workqueue, &worker); while (!test_go) @@ -199,7 +211,7 @@ static void *thr_worker(void *_count) for (;;) { enum urcu_accept_ret ret; - ret = urcu_accept_work(&workqueue, &worker); + ret = urcu_accept_work(&worker); if (ret == URCU_ACCEPT_SHUTDOWN) break; for (;;) { @@ -239,6 +251,8 @@ static void show_usage(int argc, char **argv) printf(" [-v] (verbose output)\n"); printf(" [-a cpu#] [-a cpu#]... (affinity)\n"); printf(" [-w] Wait for worker to empty stack\n"); + printf(" [-m len] (Max queue length. 0 means infinite.))\n"); + printf(" [-s] (Enable work-stealing between workers.))\n"); printf("\n"); } @@ -251,6 +265,7 @@ int main(int argc, char **argv) unsigned long long tot_enqueues = 0, tot_dequeues = 0; unsigned long long end_dequeues = 0; int i, a, retval = 0; + int worker_flags = 0; if (argc < 4) { show_usage(argc, argv); @@ -289,6 +304,13 @@ int main(int argc, char **argv) use_affinity = 1; printf_verbose("Adding CPU %d affinity\n", a); break; + case 'm': + if (argc < i + 2) { + show_usage(argc, argv); + return -1; + } + max_queue_len = atol(argv[++i]); + break; case 'c': if (argc < i + 2) { show_usage(argc, argv); @@ -309,6 +331,9 @@ int main(int argc, char **argv) case 'w': test_wait_empty = 1; break; + case 's': + test_steal = 1; + break; } } @@ -326,7 +351,9 @@ int main(int argc, char **argv) tid_worker = calloc(nr_workers, sizeof(*tid_worker)); count_dispatcher = calloc(nr_dispatchers, sizeof(*count_dispatcher)); count_worker = calloc(nr_workers, sizeof(*count_worker)); - urcu_workqueue_init(&workqueue); + if (test_steal) + worker_flags |= URCU_WORKER_STEAL; + urcu_workqueue_init(&workqueue, max_queue_len, worker_flags); next_aff = 0; @@ -380,9 +407,11 @@ int main(int argc, char **argv) printf("SUMMARY %-25s testdur %4lu nr_dispatchers %3u dispatch_delay_loops %6lu " "work_loops %lu nr_workers %3u " - "nr_enqueues %12llu nr_dequeues %12llu\n", + "nr_enqueues %12llu nr_dequeues %12llu max_queue_len %lu " + "work_stealing %s\n", argv[0], duration, nr_dispatchers, dispatch_delay_loops, work_loops, - nr_workers, tot_enqueues, tot_dequeues); + nr_workers, tot_enqueues, tot_dequeues, max_queue_len, + test_steal ? "enabled" : "disabled"); free(count_dispatcher); free(count_worker); free(tid_dispatcher);