net: dst: Switch to rcuref_t reference counting
authorThomas Gleixner <tglx@linutronix.de>
Thu, 23 Mar 2023 20:55:32 +0000 (21:55 +0100)
committerJakub Kicinski <kuba@kernel.org>
Wed, 29 Mar 2023 01:52:28 +0000 (18:52 -0700)
commitbc9d3a9f2afca189a6ae40225b6985e3c775375e
tree4e23464338077861625422ed7db14381cc888997
parentd288a162dd1c73507da582966f17dd226e34a0c0
net: dst: Switch to rcuref_t reference counting

Under high contention dst_entry::__refcnt becomes a significant bottleneck.

atomic_inc_not_zero() is implemented with a cmpxchg() loop, which goes into
high retry rates on contention.

Switch the reference count to rcuref_t which results in a significant
performance gain. Rename the reference count member to __rcuref to reflect
the change.

The gain depends on the micro-architecture and the number of concurrent
operations and has been measured in the range of +25% to +130% with a
localhost memtier/memcached benchmark which amplifies the problem
massively.

Running the memtier/memcached benchmark over a real (1Gb) network
connection the conversion on top of the false sharing fix for struct
dst_entry::__refcnt results in a total gain in the 2%-5% range over the
upstream baseline.

Reported-by: Wangyang Guo <wangyang.guo@intel.com>
Reported-by: Arjan Van De Ven <arjan.van.de.ven@intel.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Link: https://lore.kernel.org/r/20230307125538.989175656@linutronix.de
Link: https://lore.kernel.org/r/20230323102800.215027837@linutronix.de
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
include/net/dst.h
include/net/sock.h
net/bridge/br_nf_core.c
net/core/dst.c
net/core/rtnetlink.c
net/ipv6/route.c
net/netfilter/ipvs/ip_vs_xmit.c