]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MINOR: task: close a tiny race in the inter-thread wakeup
authorWilly Tarreau <w@1wt.eu>
Mon, 4 Feb 2019 09:26:53 +0000 (10:26 +0100)
committerWilly Tarreau <w@1wt.eu>
Mon, 4 Feb 2019 13:21:35 +0000 (14:21 +0100)
__task_wakeup() takes care of a small race that exists between threads,
but it uses a store barrier that is not sufficient since apparently the
state read after clearing the leaf_p pointer sometimes is incorrect. This
results in missed wakeups between threads competing at a high rate. Let's
use a full barrier instead to serialize the operations.

This may be backported to 1.9 though it's extremely unlikely that this
bug will ever manifest itself there.

src/task.c

index e7ea0db4a480ec6401b2bb8bc91e84f6ba1bf8bc..826e2124b3f6f46a22637f7dc3ce6787bdab0133 100644 (file)
@@ -107,7 +107,7 @@ redo:
        if (((volatile unsigned short)(t->state)) & TASK_RUNNING) {
                unsigned short state;
                t->rq.node.leaf_p = NULL;
-               __ha_barrier_store();
+               __ha_barrier_full();
 
                state = (volatile unsigned short)(t->state);
                if (unlikely(state != 0 && !(state & TASK_RUNNING)))