mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2026-05-14 09:46:10 +02:00
BUG/MEDIUM: tasks: Keep the TASK_RUNNING flag until queued
In task_schedule(), it is not enough to get the TASK_RUNNING flag before setting the expire field, we also have to keep it while queueing the taks, otherwise the task may run in the meanwhile and set expire to 0, triggering the BUG_ON() in __task_queue() again. So now, only drop the running flag once it's done. This should be backported up to 2.8.
This commit is contained in:
parent
aa2c7034e1
commit
82d723dd8e
@ -736,7 +736,6 @@ static inline void _task_schedule(struct task *task, int when, const struct ha_c
|
||||
when = tick_first(when, task->expire);
|
||||
|
||||
task->expire = when;
|
||||
task_drop_running(task, 0);
|
||||
if (!task_in_wq(task) || tick_is_lt(task->expire, task->wq.key)) {
|
||||
if (likely(caller)) {
|
||||
caller = HA_ATOMIC_XCHG(&task->caller, caller);
|
||||
@ -747,6 +746,7 @@ static inline void _task_schedule(struct task *task, int when, const struct ha_c
|
||||
}
|
||||
__task_queue(task, &tg_ctx->timers);
|
||||
}
|
||||
task_drop_running(task, 0);
|
||||
HA_RWLOCK_WRUNLOCK(TASK_WQ_LOCK, &wq_lock);
|
||||
} else
|
||||
#endif
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user