]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MINOR: fd/threads: properly dereference fdcache as volatile
authorWilly Tarreau <w@1wt.eu>
Mon, 5 Feb 2018 18:43:30 +0000 (19:43 +0100)
committerWilly Tarreau <w@1wt.eu>
Mon, 5 Feb 2018 18:45:31 +0000 (19:45 +0100)
In fd_rm_from_fd_list(), we have loops waiting for another change to
complete, in case we don't have support for a double CAS. But these
ones fail to place a compiler barrier or to dereference the fdcache
as a volatile, resulting in an endless loop on the first collision,
which is visible when run on MIPS32.

No backport needed.

src/fd.c

index 108235332e5f38b6b7e701fae5ec157fb7f34f3d..04ac3350a9cf4c98b7e376fa835b386c4ed03bf6 100644 (file)
--- a/src/fd.c
+++ b/src/fd.c
@@ -281,7 +281,7 @@ lock_self:
 
 #else
 lock_self_next:
-       next = fdtab[fd].cache.next;
+       next = pl_deref_int(&fdtab[fd].cache.next);
        if (next == -2)
                goto lock_self_next;
        if (next <= -3)
@@ -289,7 +289,7 @@ lock_self_next:
        if (unlikely(!HA_ATOMIC_CAS(&fdtab[fd].cache.next, &next, -2)))
                goto lock_self_next;
 lock_self_prev:
-       prev = fdtab[fd].cache.prev;
+       prev = pl_deref_int(&fdtab[fd].cache.prev);
        if (prev == -2)
                goto lock_self_prev;
        if (unlikely(!HA_ATOMIC_CAS(&fdtab[fd].cache.prev, &prev, -2)))