From 1ea5f410fff44170ea4be5c74c5ab1ff45209a52 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Thu, 2 Feb 2023 15:37:24 +0100 Subject: [PATCH] CLEANUP: quic: no need for atomics on packet refcnt This is a leftover from the implementation's history, but the quic_rx_packet and quic_tx_packet ref counts were still atomically updated. It was found in perf top that the cost of the atomic inc in quic_tx_packet_refinc() alone was responsible for 1% of the CPU usage at 135 Gbps. Given that packets are only processed on their assigned thread we don't need that anymore and this can be replaced with regular non-atomic operations. Doing this alone has reduced the CPU usage of qc_do_build_pkt() from 3.6 to 2.5% and increased the overall bit rate by about 1%. --- include/haproxy/quic_conn.h | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/include/haproxy/quic_conn.h b/include/haproxy/quic_conn.h index 60afccd8d..b5f25d865 100644 --- a/include/haproxy/quic_conn.h +++ b/include/haproxy/quic_conn.h @@ -502,13 +502,13 @@ static inline void quic_tx_packet_dgram_detach(struct quic_tx_packet *pkt) /* Increment the reference counter of */ static inline void quic_tx_packet_refinc(struct quic_tx_packet *pkt) { - HA_ATOMIC_ADD(&pkt->refcnt, 1); + pkt->refcnt++; } /* Decrement the reference counter of */ static inline void quic_tx_packet_refdec(struct quic_tx_packet *pkt) { - if (!HA_ATOMIC_SUB_FETCH(&pkt->refcnt, 1)) { + if (--pkt->refcnt == 0) { BUG_ON(!LIST_ISEMPTY(&pkt->frms)); /* If there are others packet in the same datagram is attached to, * detach the previous one and the next one from . @@ -670,7 +670,7 @@ static inline void quic_rx_pkts_del(struct quic_conn *qc) break; } - if (HA_ATOMIC_LOAD(&pkt->refcnt)) + if (pkt->refcnt) break; b_del(&qc->rx.buf, pkt->raw_len); @@ -685,17 +685,14 @@ static inline void quic_rx_pkts_del(struct quic_conn *qc) /* Increment the reference counter of */ static inline void quic_rx_packet_refinc(struct quic_rx_packet *pkt) { - HA_ATOMIC_ADD(&pkt->refcnt, 1); + pkt->refcnt++; } /* Decrement the reference counter of while remaining positive */ static inline void quic_rx_packet_refdec(struct quic_rx_packet *pkt) { - unsigned int refcnt; - - do { - refcnt = HA_ATOMIC_LOAD(&pkt->refcnt); - } while (refcnt && !HA_ATOMIC_CAS(&pkt->refcnt, &refcnt, refcnt - 1)); + if (pkt->refcnt) + pkt->refcnt--; } /* Delete all RX packets for QUIC encryption level */