From abeaff2d543fded7ffc14dd908d673c59d725155 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Mon, 5 Feb 2018 19:43:30 +0100 Subject: [PATCH] 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. --- src/fd.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/fd.c b/src/fd.c index 108235332..04ac3350a 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)))