From: Willy Tarreau Date: Wed, 22 Jul 2020 12:29:42 +0000 (+0200) Subject: MINOR: tasks/debug: add a few BUG_ON() to detect use of wrong timer queue X-Git-Tag: v2.3-dev2~39 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e5d79bccc0641ba26bb78ae029cafb4e17e6b13f;p=thirdparty%2Fhaproxy.git MINOR: tasks/debug: add a few BUG_ON() to detect use of wrong timer queue This aims at catching calls to task_unlink_wq() performed by the wrong thread based on the shared status for the task, as well as calls to __task_queue() with the wrong timer queue being used based on the task's capabilities. This will at least help eliminate some hypothesis during debugging sessions when suspecting that a wrong thread has attempted to queue a task at the wrong place. --- diff --git a/include/haproxy/task.h b/include/haproxy/task.h index 56fd50de60..820c2f1dd2 100644 --- a/include/haproxy/task.h +++ b/include/haproxy/task.h @@ -221,6 +221,7 @@ static inline struct task *task_unlink_wq(struct task *t) if (likely(task_in_wq(t))) { locked = t->state & TASK_SHARED_WQ; + BUG_ON(!locked && t->thread_mask != tid_bit); if (locked) HA_RWLOCK_WRLOCK(TASK_WQ_LOCK, &wq_lock); __task_unlink_wq(t); diff --git a/src/task.c b/src/task.c index 449857806d..c91316cbba 100644 --- a/src/task.c +++ b/src/task.c @@ -192,6 +192,12 @@ void __task_wakeup(struct task *t, struct eb_root *root) */ void __task_queue(struct task *task, struct eb_root *wq) { +#ifdef USE_THREAD + BUG_ON((wq == &timers && !(task->state & TASK_SHARED_WQ)) || + (wq == &sched->timers && (task->state & TASK_SHARED_WQ)) || + (wq != &timers && wq != &sched->timers)); +#endif + if (likely(task_in_wq(task))) __task_unlink_wq(task);