]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: tasks: make current_queue an index instead of a pointer
authorWilly Tarreau <w@1wt.eu>
Wed, 24 Jun 2020 07:19:50 +0000 (09:19 +0200)
committerWilly Tarreau <w@1wt.eu>
Wed, 24 Jun 2020 10:21:26 +0000 (12:21 +0200)
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.

include/haproxy/task-t.h
include/haproxy/task.h
src/task.c

index 7d23f68fe2f11d1c9397c48964ed7a6539ad202b..334547bc26e7d33871b500404f16bf52993460b1 100644 (file)
@@ -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];
 };
 
index c60bbd228bccecc7c7e4012dca2426a5b595e6c5..acfa2c37fdb5b9e209c63a5258e95d3371411cc4 100644 (file)
@@ -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);
index ed0416cbc41ac284d217152c4402ae9e33866e2f..1bb2ce416456f6d99895d62e844a4f0b4f4cdaf6 100644 (file)
@@ -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 */