From 967de20a43665715e4513c7cc7a67e36a36a9955 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Mon, 4 Mar 2019 11:19:49 +0100 Subject: [PATCH] BUG/MEDIUM: list: fix again LIST_ADDQ_LOCKED Well, that's becoming embarrassing. Now this fixes commit 4ef6801c ("BUG/MEDIUM: list: correct fix for LIST_POP_LOCKED's removal of last element") which itself tried to fix commit 285192564. This fix only works under low contention and was tested with the listener's queue. With the idle conns it's obvious that it's still wrong since adding more than one element to the list leaves a LLIST_BUSY pointer into the list's head. This was visible when accumulating idle connections in a server's list. This new version of the fix almost goes back to the original code, except that since then we addressed issues with expectedly idempotent operations that were not. Now the code has been verified on paper again and has survived 300 million connections spread over 4 threads. This will have to be backported if the commit above is backported. --- include/common/mini-clist.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/common/mini-clist.h b/include/common/mini-clist.h index 5cf23df1b..23c1600db 100644 --- a/include/common/mini-clist.h +++ b/include/common/mini-clist.h @@ -216,9 +216,9 @@ struct cond_wordlist { (el)->n = n; \ (el)->p = p; \ __ha_barrier_store(); \ - n->n = (el); \ + p->n = (el); \ __ha_barrier_store(); \ - p->p = (el); \ + n->p = (el); \ __ha_barrier_store(); \ break; \ } \