From: Olivier Houchard Date: Wed, 17 Apr 2019 17:10:22 +0000 (+0200) Subject: BUG/MEDIUM: tasks: Make sure we modify global_tasks_mask with the rq_lock. X-Git-Tag: v2.0-dev3~241 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=de82aeaa262cbb2e06ff2dcb227f6015f0ff8132;p=thirdparty%2Fhaproxy.git 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. --- diff --git a/src/task.c b/src/task.c index 56ba69efe3..a9c501abbe 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); } } }