From: Willy Tarreau Date: Mon, 5 Feb 2018 18:43:30 +0000 (+0100) Subject: BUG/MINOR: fd/threads: properly dereference fdcache as volatile X-Git-Tag: v1.9-dev1~437 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=abeaff2d543fded7ffc14dd908d673c59d725155;p=thirdparty%2Fhaproxy.git BUG/MINOR: fd/threads: properly dereference fdcache as volatile 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. --- diff --git a/src/fd.c b/src/fd.c index 108235332e..04ac3350a9 100644 --- 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)))