Jiri Wiesner 14de98
From 0c0a5ef809f9150e9229e7b13e43183b681b7a39 Mon Sep 17 00:00:00 2001
Jiri Wiesner 14de98
From: Eric Dumazet <edumazet@google.com>
Jiri Wiesner 14de98
Date: Mon, 25 Oct 2021 09:48:16 -0700
Jiri Wiesner 14de98
Subject: [PATCH] tcp: move inet->rx_dst_ifindex to sk->sk_rx_dst_ifindex
Jiri Wiesner 14de98
Git-commit: 0c0a5ef809f9150e9229e7b13e43183b681b7a39
Jiri Wiesner 14de98
Patch-mainline: v5.16-rc1
Jiri Wiesner 14de98
References: bsc#1207361
Jiri Wiesner 14de98
Jiri Wiesner 14de98
Increase cache locality by moving rx_dst_ifindex next to sk->sk_rx_dst
Jiri Wiesner 14de98
Jiri Wiesner 14de98
This is part of an effort to reduce cache line misses in TCP fast path.
Jiri Wiesner 14de98
Jiri Wiesner 14de98
This removes one cache line miss in early demux.
Jiri Wiesner 14de98
Jiri Wiesner 14de98
Signed-off-by: Eric Dumazet <edumazet@google.com>
Jiri Wiesner 14de98
Acked-by: Soheil Hassas Yeganeh <soheil@google.com>
Jiri Wiesner 14de98
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Jiri Wiesner 14de98
Signed-off-by: Jiri Wiesner <jwiesner@suse.de>
Jiri Wiesner 14de98
---
Jiri Wiesner 14de98
 include/net/inet_sock.h | 3 +--
Jiri Wiesner 14de98
 include/net/sock.h      | 3 +++
Jiri Wiesner 14de98
 net/ipv4/tcp_ipv4.c     | 6 +++---
Jiri Wiesner 14de98
 net/ipv6/tcp_ipv6.c     | 6 +++---
Jiri Wiesner 14de98
 4 files changed, 10 insertions(+), 8 deletions(-)
Jiri Wiesner 14de98
Jiri Wiesner 14de98
diff --git a/include/net/inet_sock.h b/include/net/inet_sock.h
Jiri Wiesner 14de98
index 89163ef8cf4b..9e1111f5915b 100644
Jiri Wiesner 14de98
--- a/include/net/inet_sock.h
Jiri Wiesner 14de98
+++ b/include/net/inet_sock.h
Jiri Wiesner 14de98
@@ -207,11 +207,10 @@ struct inet_sock {
Jiri Wiesner 14de98
 	__be32			inet_saddr;
Jiri Wiesner 14de98
 	__s16			uc_ttl;
Jiri Wiesner 14de98
 	__u16			cmsg_flags;
Jiri Wiesner 14de98
+	struct ip_options_rcu __rcu	*inet_opt;
Jiri Wiesner 14de98
 	__be16			inet_sport;
Jiri Wiesner 14de98
 	__u16			inet_id;
Jiri Wiesner 14de98
 
Jiri Wiesner 14de98
-	struct ip_options_rcu __rcu	*inet_opt;
Jiri Wiesner 14de98
-	int			rx_dst_ifindex;
Jiri Wiesner 14de98
 	__u8			tos;
Jiri Wiesner 14de98
 	__u8			min_ttl;
Jiri Wiesner 14de98
 	__u8			mc_ttl;
Jiri Wiesner 14de98
diff --git a/include/net/sock.h b/include/net/sock.h
Jiri Wiesner 14de98
index 596ba85611bc..0bfb3f138bda 100644
Jiri Wiesner 14de98
--- a/include/net/sock.h
Jiri Wiesner 14de98
+++ b/include/net/sock.h
Jiri Wiesner 14de98
@@ -259,6 +259,7 @@ struct bpf_local_storage;
Jiri Wiesner 14de98
   *	@sk_rcvbuf: size of receive buffer in bytes
Jiri Wiesner 14de98
   *	@sk_wq: sock wait queue and async head
Jiri Wiesner 14de98
   *	@sk_rx_dst: receive input route used by early demux
Jiri Wiesner 14de98
+  *	@sk_rx_dst_ifindex: ifindex for @sk_rx_dst
Jiri Wiesner 14de98
   *	@sk_dst_cache: destination cache
Jiri Wiesner 14de98
   *	@sk_dst_pending_confirm: need to confirm neighbour
Jiri Wiesner 14de98
   *	@sk_policy: flow policy
Jiri Wiesner 14de98
@@ -430,6 +431,8 @@ struct sock {
Jiri Wiesner 14de98
 	struct xfrm_policy __rcu *sk_policy[2];
Jiri Wiesner 14de98
 #endif
Jiri Wiesner 14de98
 	struct dst_entry	*sk_rx_dst;
Jiri Wiesner 14de98
+	int			sk_rx_dst_ifindex;
Jiri Wiesner 14de98
+
Jiri Wiesner 14de98
 	struct dst_entry __rcu	*sk_dst_cache;
Jiri Wiesner 14de98
 	atomic_t		sk_omem_alloc;
Jiri Wiesner 14de98
 	int			sk_sndbuf;
Jiri Wiesner 14de98
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
Jiri Wiesner 14de98
index 5e6d8cb82ce5..2bdc32c1afb6 100644
Jiri Wiesner 14de98
--- a/net/ipv4/tcp_ipv4.c
Jiri Wiesner 14de98
+++ b/net/ipv4/tcp_ipv4.c
Jiri Wiesner 14de98
@@ -1703,7 +1703,7 @@ int tcp_v4_do_rcv(struct sock *sk, struct sk_buff *skb)
Jiri Wiesner 14de98
 		sock_rps_save_rxhash(sk, skb);
Jiri Wiesner 14de98
 		sk_mark_napi_id(sk, skb);
Jiri Wiesner 14de98
 		if (dst) {
Jiri Wiesner 14de98
-			if (inet_sk(sk)->rx_dst_ifindex != skb->skb_iif ||
Jiri Wiesner 14de98
+			if (sk->sk_rx_dst_ifindex != skb->skb_iif ||
Jiri Wiesner 14de98
 			    !INDIRECT_CALL_1(dst->ops->check, ipv4_dst_check,
Jiri Wiesner 14de98
 					     dst, 0)) {
Jiri Wiesner 14de98
 				dst_release(dst);
Jiri Wiesner 14de98
@@ -1788,7 +1788,7 @@ int tcp_v4_early_demux(struct sk_buff *skb)
Jiri Wiesner 14de98
 			if (dst)
Jiri Wiesner 14de98
 				dst = dst_check(dst, 0);
Jiri Wiesner 14de98
 			if (dst &&
Jiri Wiesner 14de98
-			    inet_sk(sk)->rx_dst_ifindex == skb->skb_iif)
Jiri Wiesner 14de98
+			    sk->sk_rx_dst_ifindex == skb->skb_iif)
Jiri Wiesner 14de98
 				skb_dst_set_noref(skb, dst);
Jiri Wiesner 14de98
 		}
Jiri Wiesner 14de98
 	}
Jiri Wiesner 14de98
@@ -2195,7 +2195,7 @@ void inet_sk_rx_dst_set(struct sock *sk, const struct sk_buff *skb)
Jiri Wiesner 14de98
 
Jiri Wiesner 14de98
 	if (dst && dst_hold_safe(dst)) {
Jiri Wiesner 14de98
 		sk->sk_rx_dst = dst;
Jiri Wiesner 14de98
-		inet_sk(sk)->rx_dst_ifindex = skb->skb_iif;
Jiri Wiesner 14de98
+		sk->sk_rx_dst_ifindex = skb->skb_iif;
Jiri Wiesner 14de98
 	}
Jiri Wiesner 14de98
 }
Jiri Wiesner 14de98
 EXPORT_SYMBOL(inet_sk_rx_dst_set);
Jiri Wiesner 14de98
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c
Jiri Wiesner 14de98
index 1ef27cd7dbff..3e8669b6d636 100644
Jiri Wiesner 14de98
--- a/net/ipv6/tcp_ipv6.c
Jiri Wiesner 14de98
+++ b/net/ipv6/tcp_ipv6.c
Jiri Wiesner 14de98
@@ -108,7 +108,7 @@ static void inet6_sk_rx_dst_set(struct sock *sk, const struct sk_buff *skb)
Jiri Wiesner 14de98
 		const struct rt6_info *rt = (const struct rt6_info *)dst;
Jiri Wiesner 14de98
 
Jiri Wiesner 14de98
 		sk->sk_rx_dst = dst;
Jiri Wiesner 14de98
-		inet_sk(sk)->rx_dst_ifindex = skb->skb_iif;
Jiri Wiesner 14de98
+		sk->sk_rx_dst_ifindex = skb->skb_iif;
Jiri Wiesner 14de98
 		tcp_inet6_sk(sk)->rx_dst_cookie = rt6_get_cookie(rt);
Jiri Wiesner 14de98
 	}
Jiri Wiesner 14de98
 }
Jiri Wiesner 14de98
@@ -1509,7 +1509,7 @@ static int tcp_v6_do_rcv(struct sock *sk, struct sk_buff *skb)
Jiri Wiesner 14de98
 		sock_rps_save_rxhash(sk, skb);
Jiri Wiesner 14de98
 		sk_mark_napi_id(sk, skb);
Jiri Wiesner 14de98
 		if (dst) {
Jiri Wiesner 14de98
-			if (inet_sk(sk)->rx_dst_ifindex != skb->skb_iif ||
Jiri Wiesner 14de98
+			if (sk->sk_rx_dst_ifindex != skb->skb_iif ||
Jiri Wiesner 14de98
 			    INDIRECT_CALL_1(dst->ops->check, ip6_dst_check,
Jiri Wiesner 14de98
 					    dst, np->rx_dst_cookie) == NULL) {
Jiri Wiesner 14de98
 				dst_release(dst);
Jiri Wiesner 14de98
@@ -1874,7 +1874,7 @@ INDIRECT_CALLABLE_SCOPE void tcp_v6_early_demux(struct sk_buff *skb)
Jiri Wiesner 14de98
 			if (dst)
Jiri Wiesner 14de98
 				dst = dst_check(dst, tcp_inet6_sk(sk)->rx_dst_cookie);
Jiri Wiesner 14de98
 			if (dst &&
Jiri Wiesner 14de98
-			    inet_sk(sk)->rx_dst_ifindex == skb->skb_iif)
Jiri Wiesner 14de98
+			    sk->sk_rx_dst_ifindex == skb->skb_iif)
Jiri Wiesner 14de98
 				skb_dst_set_noref(skb, dst);
Jiri Wiesner 14de98
 		}
Jiri Wiesner 14de98
 	}
Jiri Wiesner 14de98
-- 
Jiri Wiesner 14de98
2.35.3
Jiri Wiesner 14de98