diff --git a/include/haproxy/task-t.h b/include/haproxy/task-t.h index 7d23f68fe..334547bc2 100644 --- a/include/haproxy/task-t.h +++ b/include/haproxy/task-t.h @@ -77,7 +77,7 @@ struct task_per_thread { int task_list_size; /* Number of tasks among the tasklets */ int rqueue_size; /* Number of elements in the per-thread run queue */ struct task *current; /* current task (not tasklet) */ - struct list *current_queue; /* points to current tasklet list being run */ + int current_queue; /* points to current tasklet list being run, -1 if none */ __attribute__((aligned(64))) char end[0]; }; diff --git a/include/haproxy/task.h b/include/haproxy/task.h index c60bbd228..acfa2c37f 100644 --- a/include/haproxy/task.h +++ b/include/haproxy/task.h @@ -329,17 +329,17 @@ static inline void tasklet_wakeup(struct tasklet *tl) /* this tasklet runs on the caller thread */ if (LIST_ISEMPTY(&tl->list)) { if (tl->state & TASK_SELF_WAKING) { - LIST_ADDQ(&task_per_thread[tid].tasklets[TL_BULK], &tl->list); + LIST_ADDQ(&sched->tasklets[TL_BULK], &tl->list); } else if ((struct task *)tl == sched->current) { _HA_ATOMIC_OR(&tl->state, TASK_SELF_WAKING); - LIST_ADDQ(&task_per_thread[tid].tasklets[TL_BULK], &tl->list); + LIST_ADDQ(&sched->tasklets[TL_BULK], &tl->list); } - else if (!sched->current) { - LIST_ADDQ(&task_per_thread[tid].tasklets[TL_URGENT], &tl->list); + else if (sched->current_queue < 0) { + LIST_ADDQ(&sched->tasklets[TL_URGENT], &tl->list); } else { - LIST_ADDQ(sched->current_queue, &tl->list); + LIST_ADDQ(&sched->tasklets[sched->current_queue], &tl->list); } _HA_ATOMIC_ADD(&tasks_run_queue, 1); diff --git a/src/task.c b/src/task.c index ed0416cbc..1bb2ce416 100644 --- a/src/task.c +++ b/src/task.c @@ -330,7 +330,6 @@ int run_tasks_from_list(struct list *list, int max) void *ctx; int done = 0; - sched->current_queue = list; while (done < max && !LIST_ISEMPTY(list)) { t = (struct task *)LIST_ELEM(list->n, struct tasklet *, list); state = (t->state & (TASK_SHARED_WQ|TASK_SELF_WAKING)); @@ -402,7 +401,6 @@ int run_tasks_from_list(struct list *list, int max) done++; } - sched->current_queue = NULL; return done; } @@ -551,8 +549,11 @@ void process_runnable_tasks() /* execute tasklets in each queue */ for (queue = 0; queue < TL_CLASSES; queue++) { - if (max[queue] > 0) + if (max[queue] > 0) { + tt->current_queue = queue; max_processed -= run_tasks_from_list(&tt->tasklets[queue], max[queue]); + tt->current_queue = -1; + } } /* some tasks may have woken other ones up */