]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MEDIUM: tasklets: Make sure we're waking the target thread if it sleeps.
authorOlivier Houchard <cognet@ci0.org>
Tue, 24 Sep 2019 12:55:28 +0000 (14:55 +0200)
committerOlivier Houchard <cognet@ci0.org>
Tue, 24 Sep 2019 12:58:45 +0000 (14:58 +0200)
Now that we can wake tasklet for other threads, make sure that if the thread
is sleeping, we wake it up, or the tasklet won't be executed until it's
done sleeping.
That also means that, before going to sleep, and after we put our bit
in sleeping_thread_mask, we have to check that nobody added a tasklet for
us, just checking for global_tasks_mask isn't enough anymore.

include/proto/task.h
src/haproxy.c

index 511d3cd6ca4733fe25d633c76dee67e2b5df111b..261ee9c5dff63413b453ac0d5fd121759e6a9d7a 100644 (file)
@@ -38,6 +38,8 @@
 #include <types/global.h>
 #include <types/task.h>
 
+#include <proto/fd.h>
+
 /* Principle of the wait queue.
  *
  * We want to be able to tell whether an expiration date is before of after the
@@ -226,8 +228,13 @@ static inline struct task *task_unlink_rq(struct task *t)
 
 static inline void tasklet_wakeup(struct tasklet *tl)
 {
-       if (MT_LIST_ADDQ(&task_per_thread[tl->tid].task_list, &tl->list) == 1)
+       if (MT_LIST_ADDQ(&task_per_thread[tl->tid].task_list, &tl->list) == 1) {
                _HA_ATOMIC_ADD(&tasks_run_queue, 1);
+               if (sleeping_thread_mask & (1 << tl->tid)) {
+                       _HA_ATOMIC_AND(&sleeping_thread_mask, ~(1 << tl->tid));
+                       wake_thread(tl->tid);
+               }
+       }
 
 }
 
index f577104f554c3614095e49be1cfd09118e5e1886..05b0afa32f2b6ca40b49c9b841a8282299172801 100644 (file)
@@ -2634,7 +2634,7 @@ static void run_poll_loop()
                else {
                        _HA_ATOMIC_OR(&sleeping_thread_mask, tid_bit);
                        __ha_barrier_atomic_store();
-                       if (global_tasks_mask & tid_bit) {
+                       if ((global_tasks_mask & tid_bit) || thread_has_tasks()) {
                                activity[tid].wake_tasks++;
                                _HA_ATOMIC_AND(&sleeping_thread_mask, ~tid_bit);
                        } else