summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorJakub Kicinski <kuba@kernel.org>2024-12-17 19:37:02 -0800
committerJakub Kicinski <kuba@kernel.org>2024-12-17 19:37:57 -0800
commit3a4130550998f23762184b0de4cc9163a3f2c49d (patch)
treeb6d9cd4e2333cf6afc87beb0bc7675bc73777006 /include
parentbf8469fc4d1ef2696bbe10b049cc8f9ef501face (diff)
parenta853c609504e2d1d83e71285e3622fda1f1451d8 (diff)
Merge branch 'inetpeer-reduce-false-sharing-and-atomic-operations'
Eric Dumazet says: ==================== inetpeer: reduce false sharing and atomic operations After commit 8c2bd38b95f7 ("icmp: change the order of rate limits"), there is a risk that a host receiving packets from an unique source targeting closed ports is using a common inet_peer structure from many cpus. All these cpus have to acquire/release a refcount and update the inet_peer timestamp (p->dtime) Switch to pure RCU to avoid changing the refcount, and update p->dtime only once per jiffy. Tested: DUT : 128 cores, 32 hw rx queues. receiving 8,400,000 UDP packets per second, targeting closed ports. Before the series: - napi poll can not keep up, NIC drops 1,200,000 packets per second. - We use 20 % of cpu cycles After this series: - All packets are received (no more hw drops) - We use 12 % of cpu cycles. v1: https://lore.kernel.org/20241213130212.1783302-1-edumazet@google.com ==================== Link: https://patch.msgid.link/20241215175629.1248773-1-edumazet@google.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Diffstat (limited to 'include')
-rw-r--r--include/net/inetpeer.h12
1 files changed, 5 insertions, 7 deletions
diff --git a/include/net/inetpeer.h b/include/net/inetpeer.h
index 74ff688568a0..f475757daafb 100644
--- a/include/net/inetpeer.h
+++ b/include/net/inetpeer.h
@@ -96,30 +96,28 @@ static inline struct in6_addr *inetpeer_get_addr_v6(struct inetpeer_addr *iaddr)
/* can be called with or without local BH being disabled */
struct inet_peer *inet_getpeer(struct inet_peer_base *base,
- const struct inetpeer_addr *daddr,
- int create);
+ const struct inetpeer_addr *daddr);
static inline struct inet_peer *inet_getpeer_v4(struct inet_peer_base *base,
__be32 v4daddr,
- int vif, int create)
+ int vif)
{
struct inetpeer_addr daddr;
daddr.a4.addr = v4daddr;
daddr.a4.vif = vif;
daddr.family = AF_INET;
- return inet_getpeer(base, &daddr, create);
+ return inet_getpeer(base, &daddr);
}
static inline struct inet_peer *inet_getpeer_v6(struct inet_peer_base *base,
- const struct in6_addr *v6daddr,
- int create)
+ const struct in6_addr *v6daddr)
{
struct inetpeer_addr daddr;
daddr.a6 = *v6daddr;
daddr.family = AF_INET6;
- return inet_getpeer(base, &daddr, create);
+ return inet_getpeer(base, &daddr);
}
static inline int inetpeer_addr_cmp(const struct inetpeer_addr *a,