]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
OPTIM: ring: always relax in the ring lock and leader wait loop
authorWilly Tarreau <w@1wt.eu>
Thu, 18 Sep 2025 13:01:29 +0000 (15:01 +0200)
committerWilly Tarreau <w@1wt.eu>
Thu, 18 Sep 2025 13:07:56 +0000 (15:07 +0200)
Tests have shown that AMD systems really need to use a cpu_relax()
in these two loops. The performance improves from 10.03 to 10.56M
messages per second (+5%) on a 128-thread system, without affecting
intel nor ARM, so let's do this.

src/ring.c

index 74172ce3a2c6d8aa52f9723742059bce1d0329c1..8a97b37c0c4a4df59e5d868ae3506337eca68e7a 100644 (file)
@@ -295,7 +295,7 @@ ssize_t ring_write(struct ring *ring, size_t maxlen, const struct ist pfx[], siz
                                break;
                }
 #endif
-               __ha_cpu_relax_for_read();
+               __ha_cpu_relax();
        }
 
        /* Here we own the tail. We can go on if we're still the leader,
@@ -459,7 +459,7 @@ ssize_t ring_write(struct ring *ring, size_t maxlen, const struct ist pfx[], siz
         */
        do {
                next_cell = HA_ATOMIC_LOAD(&cell.next);
-       } while (next_cell != &cell && __ha_cpu_relax_for_read());
+       } while (next_cell != &cell && __ha_cpu_relax());
 
        /* OK our message was queued. Retrieving the sent size in the ring cell
         * allows another leader thread to zero it if it finally couldn't send