From: Willy Tarreau Date: Thu, 29 Feb 2024 10:57:28 +0000 (+0100) Subject: OPTIM: ring: don't even try to update offset when failed to read X-Git-Tag: v3.0-dev6~17 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1f8b14b7be51efcfe3c57fe9aecdc88c7acf3f5c;p=thirdparty%2Fhaproxy.git OPTIM: ring: don't even try to update offset when failed to read If there's nothing to read, it's pointless for a reader to try to update the offset pointer, that's two atomic ops to replace a value by itself twice. Let's just stop this. --- diff --git a/src/ring.c b/src/ring.c index 826662aea3..31b75a13fe 100644 --- a/src/ring.c +++ b/src/ring.c @@ -538,17 +538,19 @@ int ring_dispatch_messages(struct ring *ring, void *ctx, size_t *ofs_ptr, size_t vp_data_to_ring(v1, v2, (char *)ring_area, ring_size, &head_ofs, &tail_ofs); - /* inc readers count on new place */ - do { - readers = _HA_ATOMIC_LOAD(ring_area + head_ofs); - } while ((readers > RING_MAX_READERS || - !_HA_ATOMIC_CAS(ring_area + head_ofs, &readers, readers + 1)) && __ha_cpu_relax()); + if (head_ofs != prev_ofs) { + /* inc readers count on new place */ + do { + readers = _HA_ATOMIC_LOAD(ring_area + head_ofs); + } while ((readers > RING_MAX_READERS || + !_HA_ATOMIC_CAS(ring_area + head_ofs, &readers, readers + 1)) && __ha_cpu_relax()); - /* dec readers count on old place */ - do { - readers = _HA_ATOMIC_LOAD(ring_area + prev_ofs); - } while ((readers > RING_MAX_READERS || - !_HA_ATOMIC_CAS(ring_area + prev_ofs, &readers, readers - 1)) && __ha_cpu_relax()); + /* dec readers count on old place */ + do { + readers = _HA_ATOMIC_LOAD(ring_area + prev_ofs); + } while ((readers > RING_MAX_READERS || + !_HA_ATOMIC_CAS(ring_area + prev_ofs, &readers, readers - 1)) && __ha_cpu_relax()); + } if (last_ofs_ptr) *last_ofs_ptr = tail_ofs;