diff --git a/include/proto/task.h b/include/proto/task.h index 511d3cd6c..261ee9c5d 100644 --- a/include/proto/task.h +++ b/include/proto/task.h @@ -38,6 +38,8 @@ #include #include +#include + /* 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); + } + } } diff --git a/src/haproxy.c b/src/haproxy.c index f577104f5..05b0afa32 100644 --- a/src/haproxy.c +++ b/src/haproxy.c @@ -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