From: Olivier Houchard Date: Fri, 8 Nov 2019 14:41:55 +0000 (+0100) Subject: BUG/MEDIUM: tasks: Make tasklet_remove_from_tasklet_list() no matter the tasklet. X-Git-Tag: v2.1-dev5~26 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7031e3daced2169a2ebc5041611a2f05310f130f;p=thirdparty%2Fhaproxy.git 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. --- diff --git a/include/proto/task.h b/include/proto/task.h index 5f2b144a7a..b29d84a914 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); } /*