]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MEDIUM: tasks: Make sure we modify global_tasks_mask with the rq_lock.
authorOlivier Houchard <ohouchard@haproxy.com>
Wed, 17 Apr 2019 17:10:22 +0000 (19:10 +0200)
committerOlivier Houchard <cognet@ci0.org>
Wed, 17 Apr 2019 17:28:01 +0000 (19:28 +0200)
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

index 56ba69efe30ea32a0f34c4a6c36181932ed5b75a..a9c501abbe4c49929eb2726949bf960022c22d28 100644 (file)
@@ -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);
                                }
                        }
                }