]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MEDIUM: memory_pool: Update the seq number in pool_flush().
authorOlivier Houchard <cognet@ci0.org>
Sat, 1 Feb 2020 16:37:22 +0000 (17:37 +0100)
committerOlivier Houchard <cognet@ci0.org>
Sat, 1 Feb 2020 17:08:34 +0000 (18:08 +0100)
In pool_flush(), we can't just set the free_list to NULL, or we may suffer
the ABA problem. Instead, use a double-width CAS and update the sequence
number.

This should be backported to 2.1, 2.0 and 1.9.
This may, or may not, be related to github issue #476.

src/memory.c

index a858a09834aeefa77c1285867551c00409321468..24d709f1d4a35dbe1fac922a21dd2e75277256aa 100644 (file)
@@ -217,15 +217,20 @@ void *pool_refill_alloc(struct pool_head *pool, unsigned int avail)
  */
 void pool_flush(struct pool_head *pool)
 {
+       struct pool_free_list cmp, new;
        void **next, *temp;
        int removed = 0;
 
        if (!pool)
                return;
        do {
-               next = pool->free_list;
-       } while (!_HA_ATOMIC_CAS(&pool->free_list, &next, NULL));
+               cmp.free_list = pool->free_list;
+               cmp.seq = pool->seq;
+               new.free_list = NULL;
+               new.seq = cmp.seq + 1;
+       } while (!_HA_ATOMIC_DWCAS(&pool->free_list, &cmp, &new));
        __ha_barrier_atomic_store();
+       next = cmp.free_list;
        while (next) {
                temp = next;
                next = *POOL_LINK(pool, temp);