From: Jérémie Galarneau Date: Fri, 7 Dec 2018 22:06:37 +0000 (-0500) Subject: Fix: don't wait after completion of job batch if work queue is empty X-Git-Tag: v0.11.0~32 X-Git-Url: https://git.lttng.org/?p=urcu.git;a=commitdiff_plain;h=73d8b52e55af02475eb693a33b36fcfbcf761c9a Fix: don't wait after completion of job batch if work queue is empty On completion of a batch of jobs from the work queue, a wait of 10 ms (using poll()) is performed if there is no work present in the work queue before waiting on its futex. The work queue thread's structure is inspired by the call-rcu thread. In the context of the call-rcu thread, my understanding is that the intention is to ensure that the thread does not continuously wake-up to process a single queued item. This is fine as an application should not wait for a call-rcu job to be executed (or at least I don't see a use-case for that). In the context of the work queue, waiting for more work to be available artificially slows down the execution of work on which an application may wait. I have observed a case where LTTng's session daemon's shutdown is takes around 4 seconds as a large number of cds_lfht objects are destroyed. Removing the wait reduces the duration of this phase of the shut-down to almost ~10ms. 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 6707ffe..0b1a9ea 100644 --- a/src/workqueue.c +++ b/src/workqueue.c @@ -238,7 +238,6 @@ static void *workqueue_thread(void *arg) if (cds_wfcq_empty(&workqueue->cbs_head, &workqueue->cbs_tail)) { futex_wait(&workqueue->futex); - (void) poll(NULL, 0, 10); uatomic_dec(&workqueue->futex); /* * Decrement futex before reading