]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
OPTIM: task: limit the impact of memory barriers in taks_remove_from_task_list()
authorWilly Tarreau <w@1wt.eu>
Thu, 7 Mar 2019 17:44:12 +0000 (18:44 +0100)
committerWilly Tarreau <w@1wt.eu>
Thu, 7 Mar 2019 17:44:12 +0000 (18:44 +0100)
In this function we end up with successive locked operations then a
store barrier, and in addition the compiler has to emit less efficient
code due to a longer jump. There's no need for absolutely updating the
tasks_run_queue counter before clearing the task's leaf pointer, so
let's swap the two operations and benefit from a single barrier as much
as possible. This code is on the hot path and shows about half a percent
of improvement with 8 threads.

include/proto/task.h

index c90a369827865e2b337d776b1096e9cd251abec6..f11b445a0787bcba4089ab46f048c90a2afe8d6d 100644 (file)
@@ -273,11 +273,9 @@ static inline void task_remove_from_task_list(struct task *t)
 {
        LIST_DEL_INIT(&((struct tasklet *)t)->list);
        task_per_thread[tid].task_list_size--;
+       if (!TASK_IS_TASKLET(t))
+               HA_ATOMIC_STORE(&t->rq.node.leaf_p, NULL); // was 0x1
        HA_ATOMIC_SUB(&tasks_run_queue, 1);
-       if (!TASK_IS_TASKLET(t)) {
-               t->rq.node.leaf_p = NULL; // was 0x1
-               __ha_barrier_store();
-       }
 }
 
 /*