From de82aeaa262cbb2e06ff2dcb227f6015f0ff8132 Mon Sep 17 00:00:00 2001 From: Olivier Houchard Date: Wed, 17 Apr 2019 19:10:22 +0200 Subject: [PATCH] BUG/MEDIUM: tasks: Make sure we modify global_tasks_mask with the rq_lock. When modifying global_tasks_mask, make sure we hold the rq_lock, or we might remove the bit while it has been re-set by somebody else, and we make not be waked when needed. --- src/task.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/task.c b/src/task.c index 56ba69efe..a9c501abb 100644 --- a/src/task.c +++ b/src/task.c @@ -77,7 +77,7 @@ void __task_wakeup(struct task *t, struct eb_root *root) _HA_ATOMIC_ADD(&tasks_run_queue, 1); #ifdef USE_THREAD if (root == &rqueue) { - _HA_ATOMIC_OR(&global_tasks_mask, t->thread_mask); + global_tasks_mask |= t->thread_mask; __ha_barrier_atomic_store(); } #endif @@ -302,8 +302,8 @@ void process_runnable_tasks() if (unlikely(!grq)) { grq = eb32sc_first(&rqueue, tid_bit); if (!grq) { + global_tasks_mask &= ~tid_bit; HA_SPIN_UNLOCK(TASK_RQ_LOCK, &rq_lock); - _HA_ATOMIC_AND(&global_tasks_mask, ~tid_bit); } } #endif @@ -335,8 +335,8 @@ void process_runnable_tasks() if (unlikely(!grq)) { grq = eb32sc_first(&rqueue, tid_bit); if (!grq) { + global_tasks_mask &= ~tid_bit; HA_SPIN_UNLOCK(TASK_RQ_LOCK, &rq_lock); - _HA_ATOMIC_AND(&global_tasks_mask, ~tid_bit); } } }