From: Willy Tarreau Date: Thu, 28 Feb 2019 14:55:18 +0000 (+0100) Subject: BUG/MEDIUM: list: fix LIST_POP_LOCKED's removal of the last pointer X-Git-Tag: v2.0-dev2~152 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=285192564;p=thirdparty%2Fhaproxy.git BUG/MEDIUM: list: fix LIST_POP_LOCKED's removal of the last pointer There was a typo making the last updated pointer be the pre-last element's prev instead of the last's prev element. It didn't show up during early tests because the contention is very rare on this one and it's implicitly recovered when updating the pointers to go to the next element, but it was clearly visible in the listener_accept() tests by having all threads block on LIST_POP_LOCKED() with n==p==LLIST_BUSY. This will have to be backported if commit a8434ec14 ("MINOR: lists: Implement locked variations.") is backported. --- diff --git a/include/common/mini-clist.h b/include/common/mini-clist.h index 53db885b82..aefff82fa0 100644 --- a/include/common/mini-clist.h +++ b/include/common/mini-clist.h @@ -292,7 +292,7 @@ struct cond_wordlist { __ha_barrier_store(); \ continue; \ } \ - p2 = HA_ATOMIC_XCHG(&n2->p, LLIST_BUSY); \ + p2 = HA_ATOMIC_XCHG(&n->p, LLIST_BUSY); \ if (p2 == LLIST_BUSY) { \ n->n = n2; \ n->p = p; \