]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: tasks/debug: add a few BUG_ON() to detect use of wrong timer queue
authorWilly Tarreau <w@1wt.eu>
Wed, 22 Jul 2020 12:29:42 +0000 (14:29 +0200)
committerWilly Tarreau <w@1wt.eu>
Wed, 22 Jul 2020 12:42:52 +0000 (14:42 +0200)
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.

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

index 56fd50de60ffc663b0df4f7b5ba153cc250db623..820c2f1dd2026229121fcfeef026c150e501cba0 100644 (file)
@@ -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);
index 449857806dbd3356d4213732d2f4f5e3c8ffcdd1..c91316cbbac449a8c5145b9aef50ff58defaa3d2 100644 (file)
@@ -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);