]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: tasks: make run_tasks_from_lists() scan the queues itself
authorWilly Tarreau <w@1wt.eu>
Wed, 24 Jun 2020 08:17:29 +0000 (10:17 +0200)
committerWilly Tarreau <w@1wt.eu>
Wed, 24 Jun 2020 10:21:26 +0000 (12:21 +0200)
Now process_runnable_tasks is responsible for calculating the budgets
for each queue, dequeuing from the tree, and calling run_tasks_from_lists().
This latter one scans the queues, picking tasks there and respecting budgets.
Note that its name was updated with a plural "s" for this reason.

include/haproxy/task.h
src/debug.c
src/task.c

index 335baf9a848cde6c079226416d4bd4ca1361f0be..4bc216f63b5149d8c693b09ec99a0f2ac4a8b0bc 100644 (file)
@@ -116,7 +116,7 @@ struct work_list *work_list_create(int nbthread,
                                    struct task *(*fct)(struct task *, void *, unsigned short),
                                    void *arg);
 void work_list_destroy(struct work_list *work, int nbthread);
-int run_tasks_from_list(unsigned int queue, int max);
+unsigned int run_tasks_from_lists(unsigned int budgets[]);
 
 /*
  * This does 3 things :
index b4475f38be8b83407daf8dec524ebab51c06299c..6f465910da30dd1b93a6e6e40357770c280b037e 100644 (file)
@@ -142,7 +142,7 @@ void ha_thread_dump(struct buffer *buf, int thr, int calling_tid)
 
                        if (dump == 2) {
                                /* dumping */
-                               if (addr == run_poll_loop || addr == main || addr == run_tasks_from_list) {
+                               if (addr == run_poll_loop || addr == main || addr == run_tasks_from_lists) {
                                        dump = 3;
                                        *buf = bak;
                                        break;
index 65d29c33317ba151d5a9c44d11b9a191178f5c77..22954adc225c746c9a2ca430d64ce8a4ba63a4ee 100644 (file)
@@ -318,30 +318,36 @@ int next_timer_expiry()
        return ret;
 }
 
-/* Walks over tasklet list sched->tasklets[queue] and run at most <max> of
- * them. Returns the number of entries effectively processed (tasks and
- * tasklets merged). The count of tasks in the list for the current thread
- * is adjusted.
+/* Walks over tasklet lists sched->tasklets[0..TL_CLASSES-1] and run at most
+ * budget[TL_*] of them. Returns the number of entries effectively processed
+ * (tasks and tasklets merged). The count of tasks in the list for the current
+ * thread is adjusted.
  */
-int run_tasks_from_list(unsigned int queue, int max)
+unsigned int run_tasks_from_lists(unsigned int budgets[])
 {
        struct task *(*process)(struct task *t, void *ctx, unsigned short state);
        struct list *tl_queues = sched->tasklets;
        struct task *t;
+       unsigned int done = 0;
+       unsigned int queue;
        unsigned short state;
        void *ctx;
-       int done = 0;
 
-       sched->current_queue = queue;
-       while (1) {
+       for (queue = 0; queue < TL_CLASSES;) {
+               sched->current_queue = queue;
+
                if (LIST_ISEMPTY(&tl_queues[queue])) {
                        sched->tl_class_mask &= ~(1 << queue);
-                       break;
+                       queue++;
+                       continue;
                }
 
-               if (done >= max)
-                       break;
+               if (!budgets[queue]) {
+                       queue++;
+                       continue;
+               }
 
+               budgets[queue]--;
                t = (struct task *)LIST_ELEM(tl_queues[queue].n, struct tasklet *, list);
                state = (t->state & (TASK_SHARED_WQ|TASK_SELF_WAKING));
 
@@ -564,10 +570,7 @@ void process_runnable_tasks()
        }
 
        /* execute tasklets in each queue */
-       for (queue = 0; queue < TL_CLASSES; queue++) {
-               if (max[queue] > 0)
-                       max_processed -= run_tasks_from_list(queue, max[queue]);
-       }
+       max_processed -= run_tasks_from_lists(max);
 
        /* some tasks may have woken other ones up */
        if (max_processed > 0 && thread_has_tasks())