static unsigned long max_queue_len;
+static int test_steal;
+
static inline void loop_sleep(unsigned long loops)
{
while (loops-- != 0)
set_affinity();
rcu_register_thread();
- urcu_worker_init(&workqueue, &worker, URCU_WORKER_STEAL);
- //urcu_worker_init(&workqueue, &worker, 0);
+ urcu_worker_init(&workqueue, &worker);
urcu_worker_register(&workqueue, &worker);
while (!test_go)
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");
}
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);
case 'w':
test_wait_empty = 1;
break;
+ case 's':
+ test_steal = 1;
+ break;
}
}
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, max_queue_len);
+ if (test_steal)
+ worker_flags |= URCU_WORKER_STEAL;
+ urcu_workqueue_init(&workqueue, max_queue_len, worker_flags);
next_aff = 0;
printf("SUMMARY %-25s testdur %4lu nr_dispatchers %3u dispatch_delay_loops %6lu "
"work_loops %lu nr_workers %3u "
- "nr_enqueues %12llu nr_dequeues %12llu max_queue_len %lu\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, max_queue_len);
+ nr_workers, tot_enqueues, tot_dequeues, max_queue_len,
+ test_steal ? "enabled" : "disabled");
free(count_dispatcher);
free(count_worker);
free(tid_dispatcher);
/* Maximum number of work entries (approximate). 0 means infinite. */
unsigned long nr_work_max;
unsigned long nr_work; /* Current number of work items */
+
+ int worker_flags; /* Worker flags */
bool shutdown; /* Shutdown performed */
};
static inline
void urcu_workqueue_init(struct urcu_workqueue *queue,
- unsigned long max_queue_len)
+ unsigned long max_queue_len,
+ int worker_flags)
{
__cds_wfcq_init(&queue->head, &queue->tail);
urcu_wait_queue_init(&queue->waitqueue);
static inline
void urcu_worker_init(struct urcu_workqueue *queue,
- struct urcu_worker *worker, int flags)
+ struct urcu_worker *worker)
{
cds_wfcq_init(&worker->head, &worker->tail);
- worker->flags = flags;
urcu_wait_node_init(&worker->wait_node, URCU_WAIT_RUNNING);
worker->own = NULL;
worker->wait_node.node.next = NULL;
worker->queue = queue;
+ worker->flags = queue->worker_flags;
}
static inline