haproxy/dev
Willy Tarreau eb3d5f464d MEDIUM: ring: use the topmost bit of the tail as a lock
We're now locking the tail while looking for some room in the ring. In
fact it's still while writing to it, but the goal definitely is to get
rid of the lock ASAP. For this we reserve the topmost bit of the tail
as a lock, which may have as a possible visible effect that buffers will
be limited to 2GB instead of 4GB on 32-bit machines (though in practise,
good luck for allocating more than 2GB contiguous on 32-bit), but in
practice since the size is read with atol() and some operating systems
limit it to LONG_MAX unless passing negative numbers, the limit is
already there.

For now the impact on x86_64 is significant (drop from 2.35 to 1.4M/s
on 48 threads on EPYC 24 cores) but this situation is only temporary
so that changes can be reviewable and bisectable.

Other approaches were attempted, such as using XCHG instead, which is
slightly faster on x86 with low thread counts (but causes more write
contention), and forces readers to stall under heavy traffic because
they can't access a valid value for the queue anymore. A CAS requires
preloading the value and is les good on ARMv8.1. XADD could also be
considered with 12-13 upper bits of the offset dedicated to locking,
but that looks overkill.
2024-03-25 17:34:19 +00:00
..
base64
coccinelle
flags
h2 DEV: h2: support hex-encoded data sequences in mkhdr 2024-01-12 18:59:59 +01:00
haring MEDIUM: ring: use the topmost bit of the tail as a lock 2024-03-25 17:34:19 +00:00
hpack
patchbot DEV: patchbot: produce a verdict for too long commit messages 2024-01-09 14:46:04 +01:00
phash DEV: phash: add a trivial perfect hash generator for integers 2024-01-11 15:10:08 +01:00
plug_qdisc
poll
qpack
sslkeylogger DEV: sslkeylogger: handle file opening error 2023-10-03 15:23:35 +02:00
tcploop
trace
udp BUILD: address a few remaining calloc(size, n) cases 2024-02-10 11:37:27 +01:00