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:
Olivier Houchard 2026-05-07 13:14:16 +02:00 committed by Olivier Houchard
parent aa2c7034e1
commit 82d723dd8e

View File

@ -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