From: Willy Tarreau Date: Wed, 24 Jun 2020 07:19:50 +0000 (+0200) Subject: MINOR: tasks: make current_queue an index instead of a pointer X-Git-Tag: v2.2-dev11~29 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c0a08ba2df49e7096a25d7082699b389ee1d4776;p=thirdparty%2Fhaproxy.git MINOR: tasks: make current_queue an index instead of a pointer It will be convenient to have the tasklet queue number soon, better make current_queue an index rather than a pointer to the queue. When not currently running (e.g. from I/O), the index is -1. --- diff --git a/include/haproxy/task-t.h b/include/haproxy/task-t.h index 7d23f68fe2..334547bc26 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 c60bbd228b..acfa2c37fd 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 ed0416cbc4..1bb2ce4164 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 */