From eeffb3df415d8f658e139f9a78adaf9d08212617 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Wed, 24 Feb 2021 16:44:51 +0100 Subject: [PATCH] MINOR: task: limit the remote thread wakeup to the global runqueue only The test in __task_wakeup() to figure if the remote threads are sleeping doesn't make sense outside of the global runqueue test, since there are only two possibilities here: local runqueue or global runqueue, hence a sleeping thread is another one and can only happen when sending to the global run queue. Let's move the test inside the "if" block. --- src/task.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/task.c b/src/task.c index 1d1e63c20..32c17b0a1 100644 --- a/src/task.c +++ b/src/task.c @@ -153,18 +153,18 @@ void __task_wakeup(struct task *t) if (root == &rqueue) { _HA_ATOMIC_OR(&t->state, TASK_GLOBAL); HA_SPIN_UNLOCK(TASK_RQ_LOCK, &rq_lock); - } - /* If all threads that are supposed to handle this task are sleeping, - * wake one. - */ - if ((((t->thread_mask & all_threads_mask) & sleeping_thread_mask) == - (t->thread_mask & all_threads_mask))) { - unsigned long m = (t->thread_mask & all_threads_mask) &~ tid_bit; + /* If all threads that are supposed to handle this task are sleeping, + * wake one. + */ + if ((((t->thread_mask & all_threads_mask) & sleeping_thread_mask) == + (t->thread_mask & all_threads_mask))) { + unsigned long m = (t->thread_mask & all_threads_mask) &~ tid_bit; - m = (m & (m - 1)) ^ m; // keep lowest bit set - _HA_ATOMIC_AND(&sleeping_thread_mask, ~m); - wake_thread(my_ffsl(m) - 1); + m = (m & (m - 1)) ^ m; // keep lowest bit set + _HA_ATOMIC_AND(&sleeping_thread_mask, ~m); + wake_thread(my_ffsl(m) - 1); + } } #endif return;