57 lines
2.1 KiB
Diff
57 lines
2.1 KiB
Diff
From d3e42beb106479eae7c234bb0aeacce92661ca7a Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Galarneau?=
|
|
<jeremie.galarneau@efficios.com>
|
|
Date: Fri, 7 Dec 2018 17:06:37 -0500
|
|
Subject: [PATCH 08/15] Fix: don't wait after completion of job batch if work
|
|
queue is empty
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
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 <jeremie.galarneau@efficios.com>
|
|
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
|
|
---
|
|
src/workqueue.c | 1 -
|
|
1 file changed, 1 deletion(-)
|
|
|
|
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
|
|
--
|
|
2.19.1
|
|
|