From 1ee55fddea19b9ec8f26bd3ec62ef3fc6d2ad25a Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Fri, 14 Dec 2018 15:49:45 +0100 Subject: [PATCH] MEDIUM: tasks: check the global task mask instead of the thread number When deciding whether to scan the global run queue or not, we currently check the configured threads number, and if it's 1 we skip the queue since it's not supposed to be used. However when running with a master process and multiple threads in the workers, the master will turn this number back to 1 while some task wakeups might possibly have set bits in the global tasks mask, thus causing active_tasks_mask to have one bit permanently set, preventing the process from sleeping. Instead of checking global.nbthread, let's check for the current thread's bit in global_tasks_mask. First it will make this part of the code more consistent, working like a test and set operation, it will solve the issue with master+nbthread and as a bonus it will save a lock/unlock for each scheduler call when the thread doesn't have a task in the global run queue. --- src/task.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/task.c b/src/task.c index 11a171d45..e7ea0db4a 100644 --- a/src/task.c +++ b/src/task.c @@ -322,7 +322,7 @@ void process_runnable_tasks() nb_tasks_cur = nb_tasks; max_processed = global.tune.runqueue_depth; - if (likely(global.nbthread > 1)) { + if (likely(global_tasks_mask & tid_bit)) { HA_SPIN_LOCK(TASK_RQ_LOCK, &rq_lock); if (!(active_tasks_mask & tid_bit)) { HA_SPIN_UNLOCK(TASK_RQ_LOCK, &rq_lock);