From: Jérémie Galarneau Date: Fri, 7 Dec 2018 22:06:39 +0000 (-0500) Subject: Fix: only wait if work queue is empty in real-time mode X-Git-Tag: v0.11.0~30 X-Git-Url: http://git.liburcu.org/?p=urcu.git;a=commitdiff_plain;h=5bbe95bb510534d0a5bab8d7d205b32d6e4a57b2 Fix: only wait if work queue is empty in real-time mode Unconditionally waiting for 10 ms after the completion of every batch of jobs of the work queue in real-time mode appears to be a behaviour inherited from the call-rcu thread. While this is a fair trade-off in the context of call-rcu, it is less evident that it is desirable in the context of a general-purpose work queue. Waiting when work is available artificially degrades the latency characteristics of the work queue. If a workqueue user even need the explicit delay for batching (e.g. if a call-rcu implementation would ever use the workqueue worker thread), it can add it within the worker_before_wait_fct callback received as argument from workqueue creation. Signed-off-by: Jérémie Galarneau Signed-off-by: Mathieu Desnoyers --- diff --git a/src/workqueue.c b/src/workqueue.c index 39d0e07..14957a0 100644 --- a/src/workqueue.c +++ b/src/workqueue.c @@ -246,7 +246,10 @@ static void *workqueue_thread(void *arg) cmm_smp_mb(); } } else { - (void) poll(NULL, 0, 10); + if (cds_wfcq_empty(&workqueue->cbs_head, + &workqueue->cbs_tail)) { + (void) poll(NULL, 0, 10); + } } if (workqueue->worker_after_wake_up_fct) workqueue->worker_after_wake_up_fct(workqueue, workqueue->priv);