From 7031e3daced2169a2ebc5041611a2f05310f130f Mon Sep 17 00:00:00 2001 From: Olivier Houchard Date: Fri, 8 Nov 2019 15:41:55 +0100 Subject: [PATCH] BUG/MEDIUM: tasks: Make tasklet_remove_from_tasklet_list() no matter the tasklet. In tasklet_remove_from_tasket_list(), we can be called for a tasklet that is either in the private task list, or in the shared tasklet list. Take that into account and always use MT_LIST_DEL() to remove it, otherwise if we're in the shared list and another thread attempts to add a tasklet in it, bad things will happen. __tasklet_remove_from_tasklet_list() is left unchanged, it's only supposed to be used by process_runnable_task() to remove task/tasklets from the private tast list. This should not be backported. This should fix github issue #357. --- include/proto/task.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/proto/task.h b/include/proto/task.h index 5f2b144a7..b29d84a91 100644 --- a/include/proto/task.h +++ b/include/proto/task.h @@ -270,8 +270,8 @@ static inline void __tasklet_remove_from_tasklet_list(struct tasklet *t) static inline void tasklet_remove_from_tasklet_list(struct tasklet *t) { - if (likely(!LIST_ISEMPTY(&t->list))) - __tasklet_remove_from_tasklet_list(t); + if (MT_LIST_DEL((struct mt_list *)&t->list)) + _HA_ATOMIC_SUB(&tasks_run_queue, 1); } /*