netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH net 00/16] net: first round to use dev_net_rcu()
@ 2025-01-31 17:13 Eric Dumazet
  2025-01-31 17:13 ` [PATCH net 01/16] net: add dev_net_rcu() helper Eric Dumazet
                   ` (15 more replies)
  0 siblings, 16 replies; 35+ messages in thread
From: Eric Dumazet @ 2025-01-31 17:13 UTC (permalink / raw)
  To: David S . Miller, Jakub Kicinski, Paolo Abeni
  Cc: netdev, Kuniyuki Iwashima, Simon Horman, eric.dumazet,
	Eric Dumazet

dev_net(dev) should either be protected by RTNL or RCU.

There is no LOCKDEP support yet for this helper.

Adding it would trigger too many splats.

Instead, add dev_net_rcu() and start to use it
to either fix bugs or document points that were safely
using dev_net().

Eric Dumazet (16):
  net: add dev_net_rcu() helper
  ipv4: add RCU protection to ip4_dst_hoplimit()
  ipv4: use RCU protection in ip_dst_mtu_maybe_forward()
  ipv4: use RCU protection in ipv4_default_advmss()
  ipv4: use RCU protection in rt_is_expired()
  tcp: convert to dev_net_rcu()
  net: gro: convert four dev_net() calls
  udp: convert to dev_net_rcu()
  ipv4: icmp: convert to dev_net_rcu()
  ipv6: icmp: convert to dev_net_rcu()
  ipv6: input: convert to dev_net_rcu()
  ipv6: output: convert to dev_net_rcu()
  ipv6: use RCU protection in ip6_default_advmss()
  net: filter: convert to dev_net_rcu()
  flow_dissector: use rcu protection to fetch dev_net()
  ipv4: use RCU protection in inet_select_addr()

 include/linux/netdevice.h      |  6 +++++
 include/net/inet6_hashtables.h |  2 +-
 include/net/inet_hashtables.h  |  2 +-
 include/net/ip.h               | 13 ++++++++---
 include/net/net_namespace.h    |  2 +-
 include/net/route.h            |  9 ++++++--
 net/core/filter.c              | 40 +++++++++++++++++-----------------
 net/core/flow_dissector.c      | 21 +++++++++---------
 net/ipv4/devinet.c             |  3 ++-
 net/ipv4/icmp.c                | 22 +++++++++----------
 net/ipv4/route.c               | 19 ++++++++++++----
 net/ipv4/tcp_ipv4.c            |  8 +++----
 net/ipv4/tcp_metrics.c         |  6 ++---
 net/ipv4/tcp_offload.c         |  2 +-
 net/ipv4/udp.c                 | 19 ++++++++--------
 net/ipv4/udp_offload.c         |  2 +-
 net/ipv6/icmp.c                | 22 +++++++++----------
 net/ipv6/ip6_input.c           | 12 +++++-----
 net/ipv6/ip6_output.c          |  4 ++--
 net/ipv6/output_core.c         |  2 +-
 net/ipv6/route.c               |  7 +++++-
 net/ipv6/tcp_ipv6.c            | 10 ++++-----
 net/ipv6/tcpv6_offload.c       |  2 +-
 net/ipv6/udp.c                 | 18 +++++++--------
 net/ipv6/udp_offload.c         |  2 +-
 25 files changed, 146 insertions(+), 109 deletions(-)

-- 
2.48.1.362.g079036d154-goog


^ permalink raw reply	[flat|nested] 35+ messages in thread

* [PATCH net 01/16] net: add dev_net_rcu() helper
  2025-01-31 17:13 [PATCH net 00/16] net: first round to use dev_net_rcu() Eric Dumazet
@ 2025-01-31 17:13 ` Eric Dumazet
  2025-01-31 18:29   ` Kuniyuki Iwashima
  2025-01-31 17:13 ` [PATCH net 02/16] ipv4: add RCU protection to ip4_dst_hoplimit() Eric Dumazet
                   ` (14 subsequent siblings)
  15 siblings, 1 reply; 35+ messages in thread
From: Eric Dumazet @ 2025-01-31 17:13 UTC (permalink / raw)
  To: David S . Miller, Jakub Kicinski, Paolo Abeni
  Cc: netdev, Kuniyuki Iwashima, Simon Horman, eric.dumazet,
	Eric Dumazet

dev->nd_net can change, readers should either
use rcu_read_lock() or RTNL.

We currently use a generic helper, dev_net() with
no debugging support. We probably have many hidden bugs.

Add dev_net_rcu() helper for callers using rcu_read_lock()
protection.

Signed-off-by: Eric Dumazet <edumazet@google.com>
---
 include/linux/netdevice.h   | 6 ++++++
 include/net/net_namespace.h | 2 +-
 2 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 2a59034a5fa2fb53300657968c2053ab354bb746..046015adf2856f859b9a671e2be4ef674125ef96 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -2663,6 +2663,12 @@ struct net *dev_net(const struct net_device *dev)
 	return read_pnet(&dev->nd_net);
 }
 
+static inline
+struct net *dev_net_rcu(const struct net_device *dev)
+{
+	return read_pnet_rcu(&dev->nd_net);
+}
+
 static inline
 void dev_net_set(struct net_device *dev, struct net *net)
 {
diff --git a/include/net/net_namespace.h b/include/net/net_namespace.h
index 0f5eb9db0c6264efc1ac83ab577511fd6823f4fe..7ba1402ca7796663bed3373b1a0c6a0249cd1599 100644
--- a/include/net/net_namespace.h
+++ b/include/net/net_namespace.h
@@ -398,7 +398,7 @@ static inline struct net *read_pnet(const possible_net_t *pnet)
 #endif
 }
 
-static inline struct net *read_pnet_rcu(possible_net_t *pnet)
+static inline struct net *read_pnet_rcu(const possible_net_t *pnet)
 {
 #ifdef CONFIG_NET_NS
 	return rcu_dereference(pnet->net);
-- 
2.48.1.362.g079036d154-goog


^ permalink raw reply related	[flat|nested] 35+ messages in thread

* [PATCH net 02/16] ipv4: add RCU protection to ip4_dst_hoplimit()
  2025-01-31 17:13 [PATCH net 00/16] net: first round to use dev_net_rcu() Eric Dumazet
  2025-01-31 17:13 ` [PATCH net 01/16] net: add dev_net_rcu() helper Eric Dumazet
@ 2025-01-31 17:13 ` Eric Dumazet
  2025-01-31 18:34   ` Kuniyuki Iwashima
  2025-01-31 17:13 ` [PATCH net 03/16] ipv4: use RCU protection in ip_dst_mtu_maybe_forward() Eric Dumazet
                   ` (13 subsequent siblings)
  15 siblings, 1 reply; 35+ messages in thread
From: Eric Dumazet @ 2025-01-31 17:13 UTC (permalink / raw)
  To: David S . Miller, Jakub Kicinski, Paolo Abeni
  Cc: netdev, Kuniyuki Iwashima, Simon Horman, eric.dumazet,
	Eric Dumazet

ip4_dst_hoplimit() must use RCU protection to make
sure the net structure it reads does not disappear.

Fixes: fa50d974d104 ("ipv4: Namespaceify ip_default_ttl sysctl knob")
Signed-off-by: Eric Dumazet <edumazet@google.com>
---
 include/net/route.h | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/include/net/route.h b/include/net/route.h
index f86775be3e2934697533a61f566aca1ef196d74e..c605fd5ec0c08cc7658c3cf6aa6223790d463ede 100644
--- a/include/net/route.h
+++ b/include/net/route.h
@@ -382,10 +382,15 @@ static inline int inet_iif(const struct sk_buff *skb)
 static inline int ip4_dst_hoplimit(const struct dst_entry *dst)
 {
 	int hoplimit = dst_metric_raw(dst, RTAX_HOPLIMIT);
-	struct net *net = dev_net(dst->dev);
 
-	if (hoplimit == 0)
+	if (hoplimit == 0) {
+		const struct net *net;
+
+		rcu_read_lock();
+		net = dev_net_rcu(dst->dev);
 		hoplimit = READ_ONCE(net->ipv4.sysctl_ip_default_ttl);
+		rcu_read_unlock();
+	}
 	return hoplimit;
 }
 
-- 
2.48.1.362.g079036d154-goog


^ permalink raw reply related	[flat|nested] 35+ messages in thread

* [PATCH net 03/16] ipv4: use RCU protection in ip_dst_mtu_maybe_forward()
  2025-01-31 17:13 [PATCH net 00/16] net: first round to use dev_net_rcu() Eric Dumazet
  2025-01-31 17:13 ` [PATCH net 01/16] net: add dev_net_rcu() helper Eric Dumazet
  2025-01-31 17:13 ` [PATCH net 02/16] ipv4: add RCU protection to ip4_dst_hoplimit() Eric Dumazet
@ 2025-01-31 17:13 ` Eric Dumazet
  2025-01-31 18:47   ` Kuniyuki Iwashima
  2025-01-31 17:13 ` [PATCH net 04/16] ipv4: use RCU protection in ipv4_default_advmss() Eric Dumazet
                   ` (12 subsequent siblings)
  15 siblings, 1 reply; 35+ messages in thread
From: Eric Dumazet @ 2025-01-31 17:13 UTC (permalink / raw)
  To: David S . Miller, Jakub Kicinski, Paolo Abeni
  Cc: netdev, Kuniyuki Iwashima, Simon Horman, eric.dumazet,
	Eric Dumazet

ip_dst_mtu_maybe_forward() must use RCU protection to make
sure the net structure it reads does not disappear.

Fixes: f87c10a8aa1e8 ("ipv4: introduce ip_dst_mtu_maybe_forward and protect forwarding path against pmtu spoofing")
Signed-off-by: Eric Dumazet <edumazet@google.com>
---
 include/net/ip.h | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/include/net/ip.h b/include/net/ip.h
index 9f5e33e371fcdd8ea88c54584b8d4b6c50e7d0c9..ba7b43447775e51b3b9a8cbf5c3345d6308bb525 100644
--- a/include/net/ip.h
+++ b/include/net/ip.h
@@ -471,9 +471,12 @@ static inline unsigned int ip_dst_mtu_maybe_forward(const struct dst_entry *dst,
 						    bool forwarding)
 {
 	const struct rtable *rt = dst_rtable(dst);
-	struct net *net = dev_net(dst->dev);
-	unsigned int mtu;
+	unsigned int mtu, res;
+	struct net *net;
+
+	rcu_read_lock();
 
+	net = dev_net_rcu(dst->dev);
 	if (READ_ONCE(net->ipv4.sysctl_ip_fwd_use_pmtu) ||
 	    ip_mtu_locked(dst) ||
 	    !forwarding) {
@@ -497,7 +500,11 @@ static inline unsigned int ip_dst_mtu_maybe_forward(const struct dst_entry *dst,
 out:
 	mtu = min_t(unsigned int, mtu, IP_MAX_MTU);
 
-	return mtu - lwtunnel_headroom(dst->lwtstate, mtu);
+	res = mtu - lwtunnel_headroom(dst->lwtstate, mtu);
+
+	rcu_read_unlock();
+
+	return res;
 }
 
 static inline unsigned int ip_skb_dst_mtu(struct sock *sk,
-- 
2.48.1.362.g079036d154-goog


^ permalink raw reply related	[flat|nested] 35+ messages in thread

* [PATCH net 04/16] ipv4: use RCU protection in ipv4_default_advmss()
  2025-01-31 17:13 [PATCH net 00/16] net: first round to use dev_net_rcu() Eric Dumazet
                   ` (2 preceding siblings ...)
  2025-01-31 17:13 ` [PATCH net 03/16] ipv4: use RCU protection in ip_dst_mtu_maybe_forward() Eric Dumazet
@ 2025-01-31 17:13 ` Eric Dumazet
  2025-01-31 18:51   ` Kuniyuki Iwashima
  2025-01-31 17:13 ` [PATCH net 05/16] ipv4: use RCU protection in rt_is_expired() Eric Dumazet
                   ` (11 subsequent siblings)
  15 siblings, 1 reply; 35+ messages in thread
From: Eric Dumazet @ 2025-01-31 17:13 UTC (permalink / raw)
  To: David S . Miller, Jakub Kicinski, Paolo Abeni
  Cc: netdev, Kuniyuki Iwashima, Simon Horman, eric.dumazet,
	Eric Dumazet

ipv4_default_advmss() must use RCU protection to make
sure the net structure it reads does not disappear.

Fixes: 2e9589ff809e ("ipv4: Namespaceify min_adv_mss sysctl knob")
Signed-off-by: Eric Dumazet <edumazet@google.com>
---
 net/ipv4/route.c | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/net/ipv4/route.c b/net/ipv4/route.c
index 577b88a43293aa801c3ee736d7e5cc4d97917717..74c074f45758be5ae78a87edb31837481cc40278 100644
--- a/net/ipv4/route.c
+++ b/net/ipv4/route.c
@@ -1307,10 +1307,15 @@ static void set_class_tag(struct rtable *rt, u32 tag)
 
 static unsigned int ipv4_default_advmss(const struct dst_entry *dst)
 {
-	struct net *net = dev_net(dst->dev);
 	unsigned int header_size = sizeof(struct tcphdr) + sizeof(struct iphdr);
-	unsigned int advmss = max_t(unsigned int, ipv4_mtu(dst) - header_size,
-				    net->ipv4.ip_rt_min_advmss);
+	unsigned int advmss;
+	struct net *net;
+
+	rcu_read_lock();
+	net = dev_net_rcu(dst->dev);
+	advmss = max_t(unsigned int, ipv4_mtu(dst) - header_size,
+				   net->ipv4.ip_rt_min_advmss);
+	rcu_read_unlock();
 
 	return min(advmss, IPV4_MAX_PMTU - header_size);
 }
-- 
2.48.1.362.g079036d154-goog


^ permalink raw reply related	[flat|nested] 35+ messages in thread

* [PATCH net 05/16] ipv4: use RCU protection in rt_is_expired()
  2025-01-31 17:13 [PATCH net 00/16] net: first round to use dev_net_rcu() Eric Dumazet
                   ` (3 preceding siblings ...)
  2025-01-31 17:13 ` [PATCH net 04/16] ipv4: use RCU protection in ipv4_default_advmss() Eric Dumazet
@ 2025-01-31 17:13 ` Eric Dumazet
  2025-01-31 19:00   ` Kuniyuki Iwashima
  2025-01-31 17:13 ` [PATCH net 06/16] tcp: convert to dev_net_rcu() Eric Dumazet
                   ` (10 subsequent siblings)
  15 siblings, 1 reply; 35+ messages in thread
From: Eric Dumazet @ 2025-01-31 17:13 UTC (permalink / raw)
  To: David S . Miller, Jakub Kicinski, Paolo Abeni
  Cc: netdev, Kuniyuki Iwashima, Simon Horman, eric.dumazet,
	Eric Dumazet

rt_is_expired() must use RCU protection to make
sure the net structure it reads does not disappear.

Signed-off-by: Eric Dumazet <edumazet@google.com>
---
 net/ipv4/route.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/net/ipv4/route.c b/net/ipv4/route.c
index 74c074f45758be5ae78a87edb31837481cc40278..e959327c0ba8979ce5c7ca8c46ae41068824edc6 100644
--- a/net/ipv4/route.c
+++ b/net/ipv4/route.c
@@ -390,7 +390,13 @@ static inline int ip_rt_proc_init(void)
 
 static inline bool rt_is_expired(const struct rtable *rth)
 {
-	return rth->rt_genid != rt_genid_ipv4(dev_net(rth->dst.dev));
+	bool res;
+
+	rcu_read_lock();
+	res = rth->rt_genid != rt_genid_ipv4(dev_net_rcu(rth->dst.dev));
+	rcu_read_unlock();
+
+	return res;
 }
 
 void rt_cache_flush(struct net *net)
-- 
2.48.1.362.g079036d154-goog


^ permalink raw reply related	[flat|nested] 35+ messages in thread

* [PATCH net 06/16] tcp: convert to dev_net_rcu()
  2025-01-31 17:13 [PATCH net 00/16] net: first round to use dev_net_rcu() Eric Dumazet
                   ` (4 preceding siblings ...)
  2025-01-31 17:13 ` [PATCH net 05/16] ipv4: use RCU protection in rt_is_expired() Eric Dumazet
@ 2025-01-31 17:13 ` Eric Dumazet
  2025-01-31 19:03   ` Kuniyuki Iwashima
  2025-01-31 17:13 ` [PATCH net 07/16] net: gro: convert four dev_net() calls Eric Dumazet
                   ` (9 subsequent siblings)
  15 siblings, 1 reply; 35+ messages in thread
From: Eric Dumazet @ 2025-01-31 17:13 UTC (permalink / raw)
  To: David S . Miller, Jakub Kicinski, Paolo Abeni
  Cc: netdev, Kuniyuki Iwashima, Simon Horman, eric.dumazet,
	Eric Dumazet

TCP uses of dev_net() are safe, change them to dev_net_rcu()
to get LOCKDEP support.

Signed-off-by: Eric Dumazet <edumazet@google.com>
---
 include/net/inet6_hashtables.h |  2 +-
 include/net/inet_hashtables.h  |  2 +-
 net/ipv4/tcp_ipv4.c            |  8 ++++----
 net/ipv4/tcp_metrics.c         |  6 +++---
 net/ipv6/tcp_ipv6.c            | 10 +++++-----
 5 files changed, 14 insertions(+), 14 deletions(-)

diff --git a/include/net/inet6_hashtables.h b/include/net/inet6_hashtables.h
index 74dd90ff5f129fe4c8adad67a642ae5070410518..c32878c69179dac5a7fcfa098a297420d9adfab2 100644
--- a/include/net/inet6_hashtables.h
+++ b/include/net/inet6_hashtables.h
@@ -150,7 +150,7 @@ static inline struct sock *__inet6_lookup_skb(struct inet_hashinfo *hashinfo,
 					      int iif, int sdif,
 					      bool *refcounted)
 {
-	struct net *net = dev_net(skb_dst(skb)->dev);
+	struct net *net = dev_net_rcu(skb_dst(skb)->dev);
 	const struct ipv6hdr *ip6h = ipv6_hdr(skb);
 	struct sock *sk;
 
diff --git a/include/net/inet_hashtables.h b/include/net/inet_hashtables.h
index 5eea47f135a421ce8275d4cd83c5771b3f448e5c..da818fb0205fed6b4120946bc032e67e046b716f 100644
--- a/include/net/inet_hashtables.h
+++ b/include/net/inet_hashtables.h
@@ -492,7 +492,7 @@ static inline struct sock *__inet_lookup_skb(struct inet_hashinfo *hashinfo,
 					     const int sdif,
 					     bool *refcounted)
 {
-	struct net *net = dev_net(skb_dst(skb)->dev);
+	struct net *net = dev_net_rcu(skb_dst(skb)->dev);
 	const struct iphdr *iph = ip_hdr(skb);
 	struct sock *sk;
 
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
index cc2b5194a18d2e64595f474f62c6f2fd3eff319f..3bd835220d43d6d6491fd5c8d5e9954c37303f83 100644
--- a/net/ipv4/tcp_ipv4.c
+++ b/net/ipv4/tcp_ipv4.c
@@ -503,7 +503,7 @@ int tcp_v4_err(struct sk_buff *skb, u32 info)
 	struct request_sock *fastopen;
 	u32 seq, snd_una;
 	int err;
-	struct net *net = dev_net(skb->dev);
+	struct net *net = dev_net_rcu(skb->dev);
 
 	sk = __inet_lookup_established(net, net->ipv4.tcp_death_row.hashinfo,
 				       iph->daddr, th->dest, iph->saddr,
@@ -788,7 +788,7 @@ static void tcp_v4_send_reset(const struct sock *sk, struct sk_buff *skb,
 	arg.iov[0].iov_base = (unsigned char *)&rep;
 	arg.iov[0].iov_len  = sizeof(rep.th);
 
-	net = sk ? sock_net(sk) : dev_net(skb_dst(skb)->dev);
+	net = sk ? sock_net(sk) : dev_net_rcu(skb_dst(skb)->dev);
 
 	/* Invalid TCP option size or twice included auth */
 	if (tcp_parse_auth_options(tcp_hdr(skb), &md5_hash_location, &aoh))
@@ -1967,7 +1967,7 @@ EXPORT_SYMBOL(tcp_v4_do_rcv);
 
 int tcp_v4_early_demux(struct sk_buff *skb)
 {
-	struct net *net = dev_net(skb->dev);
+	struct net *net = dev_net_rcu(skb->dev);
 	const struct iphdr *iph;
 	const struct tcphdr *th;
 	struct sock *sk;
@@ -2178,7 +2178,7 @@ static void tcp_v4_fill_cb(struct sk_buff *skb, const struct iphdr *iph,
 
 int tcp_v4_rcv(struct sk_buff *skb)
 {
-	struct net *net = dev_net(skb->dev);
+	struct net *net = dev_net_rcu(skb->dev);
 	enum skb_drop_reason drop_reason;
 	int sdif = inet_sdif(skb);
 	int dif = inet_iif(skb);
diff --git a/net/ipv4/tcp_metrics.c b/net/ipv4/tcp_metrics.c
index 95669935494ef8003a1877e2b86c76bd27307afd..4251670e328c83b55eff7bbda3cc3d97d78563a8 100644
--- a/net/ipv4/tcp_metrics.c
+++ b/net/ipv4/tcp_metrics.c
@@ -170,7 +170,7 @@ static struct tcp_metrics_block *tcpm_new(struct dst_entry *dst,
 	bool reclaim = false;
 
 	spin_lock_bh(&tcp_metrics_lock);
-	net = dev_net(dst->dev);
+	net = dev_net_rcu(dst->dev);
 
 	/* While waiting for the spin-lock the cache might have been populated
 	 * with this entry and so we have to check again.
@@ -273,7 +273,7 @@ static struct tcp_metrics_block *__tcp_get_metrics_req(struct request_sock *req,
 		return NULL;
 	}
 
-	net = dev_net(dst->dev);
+	net = dev_net_rcu(dst->dev);
 	hash ^= net_hash_mix(net);
 	hash = hash_32(hash, tcp_metrics_hash_log);
 
@@ -318,7 +318,7 @@ static struct tcp_metrics_block *tcp_get_metrics(struct sock *sk,
 	else
 		return NULL;
 
-	net = dev_net(dst->dev);
+	net = dev_net_rcu(dst->dev);
 	hash ^= net_hash_mix(net);
 	hash = hash_32(hash, tcp_metrics_hash_log);
 
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c
index 2debdf085a3b4d2452b2b316cb5368507b17efc8..429f8a5ab511b671aa405ae20f7c1b3163839779 100644
--- a/net/ipv6/tcp_ipv6.c
+++ b/net/ipv6/tcp_ipv6.c
@@ -376,7 +376,7 @@ static int tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
 {
 	const struct ipv6hdr *hdr = (const struct ipv6hdr *)skb->data;
 	const struct tcphdr *th = (struct tcphdr *)(skb->data+offset);
-	struct net *net = dev_net(skb->dev);
+	struct net *net = dev_net_rcu(skb->dev);
 	struct request_sock *fastopen;
 	struct ipv6_pinfo *np;
 	struct tcp_sock *tp;
@@ -868,7 +868,7 @@ static void tcp_v6_send_response(const struct sock *sk, struct sk_buff *skb, u32
 	struct tcphdr *t1;
 	struct sk_buff *buff;
 	struct flowi6 fl6;
-	struct net *net = sk ? sock_net(sk) : dev_net(skb_dst(skb)->dev);
+	struct net *net = sk ? sock_net(sk) : dev_net_rcu(skb_dst(skb)->dev);
 	struct sock *ctl_sk = net->ipv6.tcp_sk;
 	unsigned int tot_len = sizeof(struct tcphdr);
 	__be32 mrst = 0, *topt;
@@ -1039,7 +1039,7 @@ static void tcp_v6_send_reset(const struct sock *sk, struct sk_buff *skb,
 	if (!sk && !ipv6_unicast_destination(skb))
 		return;
 
-	net = sk ? sock_net(sk) : dev_net(skb_dst(skb)->dev);
+	net = sk ? sock_net(sk) : dev_net_rcu(skb_dst(skb)->dev);
 	/* Invalid TCP option size or twice included auth */
 	if (tcp_parse_auth_options(th, &md5_hash_location, &aoh))
 		return;
@@ -1744,6 +1744,7 @@ static void tcp_v6_fill_cb(struct sk_buff *skb, const struct ipv6hdr *hdr,
 
 INDIRECT_CALLABLE_SCOPE int tcp_v6_rcv(struct sk_buff *skb)
 {
+	struct net *net = dev_net_rcu(skb->dev);
 	enum skb_drop_reason drop_reason;
 	int sdif = inet6_sdif(skb);
 	int dif = inet6_iif(skb);
@@ -1753,7 +1754,6 @@ INDIRECT_CALLABLE_SCOPE int tcp_v6_rcv(struct sk_buff *skb)
 	bool refcounted;
 	int ret;
 	u32 isn;
-	struct net *net = dev_net(skb->dev);
 
 	drop_reason = SKB_DROP_REASON_NOT_SPECIFIED;
 	if (skb->pkt_type != PACKET_HOST)
@@ -2004,7 +2004,7 @@ INDIRECT_CALLABLE_SCOPE int tcp_v6_rcv(struct sk_buff *skb)
 
 void tcp_v6_early_demux(struct sk_buff *skb)
 {
-	struct net *net = dev_net(skb->dev);
+	struct net *net = dev_net_rcu(skb->dev);
 	const struct ipv6hdr *hdr;
 	const struct tcphdr *th;
 	struct sock *sk;
-- 
2.48.1.362.g079036d154-goog


^ permalink raw reply related	[flat|nested] 35+ messages in thread

* [PATCH net 07/16] net: gro: convert four dev_net() calls
  2025-01-31 17:13 [PATCH net 00/16] net: first round to use dev_net_rcu() Eric Dumazet
                   ` (5 preceding siblings ...)
  2025-01-31 17:13 ` [PATCH net 06/16] tcp: convert to dev_net_rcu() Eric Dumazet
@ 2025-01-31 17:13 ` Eric Dumazet
  2025-01-31 19:05   ` Kuniyuki Iwashima
  2025-01-31 17:13 ` [PATCH net 08/16] udp: convert to dev_net_rcu() Eric Dumazet
                   ` (8 subsequent siblings)
  15 siblings, 1 reply; 35+ messages in thread
From: Eric Dumazet @ 2025-01-31 17:13 UTC (permalink / raw)
  To: David S . Miller, Jakub Kicinski, Paolo Abeni
  Cc: netdev, Kuniyuki Iwashima, Simon Horman, eric.dumazet,
	Eric Dumazet

tcp4_check_fraglist_gro(), tcp6_check_fraglist_gro(),
udp4_gro_lookup_skb() and udp6_gro_lookup_skb()
assume RCU is held so that the net structure does not disappear.

Use dev_net_rcu() instead of dev_net() to get LOCKDEP support.

Signed-off-by: Eric Dumazet <edumazet@google.com>
---
 net/ipv4/tcp_offload.c   | 2 +-
 net/ipv4/udp_offload.c   | 2 +-
 net/ipv6/tcpv6_offload.c | 2 +-
 net/ipv6/udp_offload.c   | 2 +-
 4 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/net/ipv4/tcp_offload.c b/net/ipv4/tcp_offload.c
index 2308665b51c5388814e5b61a262a1636d897c4a9..ecef16c58c07146cbeebade0620a5ec7251ddbc5 100644
--- a/net/ipv4/tcp_offload.c
+++ b/net/ipv4/tcp_offload.c
@@ -425,7 +425,7 @@ static void tcp4_check_fraglist_gro(struct list_head *head, struct sk_buff *skb,
 
 	inet_get_iif_sdif(skb, &iif, &sdif);
 	iph = skb_gro_network_header(skb);
-	net = dev_net(skb->dev);
+	net = dev_net_rcu(skb->dev);
 	sk = __inet_lookup_established(net, net->ipv4.tcp_death_row.hashinfo,
 				       iph->saddr, th->source,
 				       iph->daddr, ntohs(th->dest),
diff --git a/net/ipv4/udp_offload.c b/net/ipv4/udp_offload.c
index a5be6e4ed326fbdc6a9b3889db4da903f7f25d37..c1a85b300ee87758ee683a834248a600a3e7f18d 100644
--- a/net/ipv4/udp_offload.c
+++ b/net/ipv4/udp_offload.c
@@ -630,7 +630,7 @@ static struct sock *udp4_gro_lookup_skb(struct sk_buff *skb, __be16 sport,
 					__be16 dport)
 {
 	const struct iphdr *iph = skb_gro_network_header(skb);
-	struct net *net = dev_net(skb->dev);
+	struct net *net = dev_net_rcu(skb->dev);
 	int iif, sdif;
 
 	inet_get_iif_sdif(skb, &iif, &sdif);
diff --git a/net/ipv6/tcpv6_offload.c b/net/ipv6/tcpv6_offload.c
index a45bf17cb2a172d4612cb42f51481b97bbf364cd..91b88daa5b555cb1af591db7680b7d829ce7b1b7 100644
--- a/net/ipv6/tcpv6_offload.c
+++ b/net/ipv6/tcpv6_offload.c
@@ -35,7 +35,7 @@ static void tcp6_check_fraglist_gro(struct list_head *head, struct sk_buff *skb,
 
 	inet6_get_iif_sdif(skb, &iif, &sdif);
 	hdr = skb_gro_network_header(skb);
-	net = dev_net(skb->dev);
+	net = dev_net_rcu(skb->dev);
 	sk = __inet6_lookup_established(net, net->ipv4.tcp_death_row.hashinfo,
 					&hdr->saddr, th->source,
 					&hdr->daddr, ntohs(th->dest),
diff --git a/net/ipv6/udp_offload.c b/net/ipv6/udp_offload.c
index b41152dd424697a9fc3cef13fbb430de49dcb913..404212dfc99abba4d48fc27a574b48ab53731d39 100644
--- a/net/ipv6/udp_offload.c
+++ b/net/ipv6/udp_offload.c
@@ -117,7 +117,7 @@ static struct sock *udp6_gro_lookup_skb(struct sk_buff *skb, __be16 sport,
 					__be16 dport)
 {
 	const struct ipv6hdr *iph = skb_gro_network_header(skb);
-	struct net *net = dev_net(skb->dev);
+	struct net *net = dev_net_rcu(skb->dev);
 	int iif, sdif;
 
 	inet6_get_iif_sdif(skb, &iif, &sdif);
-- 
2.48.1.362.g079036d154-goog


^ permalink raw reply related	[flat|nested] 35+ messages in thread

* [PATCH net 08/16] udp: convert to dev_net_rcu()
  2025-01-31 17:13 [PATCH net 00/16] net: first round to use dev_net_rcu() Eric Dumazet
                   ` (6 preceding siblings ...)
  2025-01-31 17:13 ` [PATCH net 07/16] net: gro: convert four dev_net() calls Eric Dumazet
@ 2025-01-31 17:13 ` Eric Dumazet
  2025-01-31 19:10   ` Kuniyuki Iwashima
  2025-01-31 17:13 ` [PATCH net 09/16] ipv4: icmp: " Eric Dumazet
                   ` (7 subsequent siblings)
  15 siblings, 1 reply; 35+ messages in thread
From: Eric Dumazet @ 2025-01-31 17:13 UTC (permalink / raw)
  To: David S . Miller, Jakub Kicinski, Paolo Abeni
  Cc: netdev, Kuniyuki Iwashima, Simon Horman, eric.dumazet,
	Eric Dumazet

TCP uses of dev_net() are safe, change them to dev_net_rcu()
to get LOCKDEP support.

Signed-off-by: Eric Dumazet <edumazet@google.com>
---
 net/ipv4/udp.c | 19 ++++++++++---------
 net/ipv6/udp.c | 18 +++++++++---------
 2 files changed, 19 insertions(+), 18 deletions(-)

diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
index c472c9a57cf68880a277603b4a771152c6f79ff6..54912b31f57ce340dbaffc3e80719140f4e85ecd 100644
--- a/net/ipv4/udp.c
+++ b/net/ipv4/udp.c
@@ -750,7 +750,7 @@ static inline struct sock *__udp4_lib_lookup_skb(struct sk_buff *skb,
 {
 	const struct iphdr *iph = ip_hdr(skb);
 
-	return __udp4_lib_lookup(dev_net(skb->dev), iph->saddr, sport,
+	return __udp4_lib_lookup(dev_net_rcu(skb->dev), iph->saddr, sport,
 				 iph->daddr, dport, inet_iif(skb),
 				 inet_sdif(skb), udptable, skb);
 }
@@ -760,7 +760,7 @@ struct sock *udp4_lib_lookup_skb(const struct sk_buff *skb,
 {
 	const u16 offset = NAPI_GRO_CB(skb)->network_offsets[skb->encapsulation];
 	const struct iphdr *iph = (struct iphdr *)(skb->data + offset);
-	struct net *net = dev_net(skb->dev);
+	struct net *net = dev_net_rcu(skb->dev);
 	int iif, sdif;
 
 	inet_get_iif_sdif(skb, &iif, &sdif);
@@ -934,13 +934,13 @@ int __udp4_lib_err(struct sk_buff *skb, u32 info, struct udp_table *udptable)
 	struct inet_sock *inet;
 	const struct iphdr *iph = (const struct iphdr *)skb->data;
 	struct udphdr *uh = (struct udphdr *)(skb->data+(iph->ihl<<2));
+	struct net *net = dev_net_rcu(skb->dev);
 	const int type = icmp_hdr(skb)->type;
 	const int code = icmp_hdr(skb)->code;
 	bool tunnel = false;
 	struct sock *sk;
 	int harderr;
 	int err;
-	struct net *net = dev_net(skb->dev);
 
 	sk = __udp4_lib_lookup(net, iph->daddr, uh->dest,
 			       iph->saddr, uh->source, skb->dev->ifindex,
@@ -1025,7 +1025,7 @@ int __udp4_lib_err(struct sk_buff *skb, u32 info, struct udp_table *udptable)
 
 int udp_err(struct sk_buff *skb, u32 info)
 {
-	return __udp4_lib_err(skb, info, dev_net(skb->dev)->ipv4.udp_table);
+	return __udp4_lib_err(skb, info, dev_net_rcu(skb->dev)->ipv4.udp_table);
 }
 
 /*
@@ -2466,7 +2466,7 @@ static int udp_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
 		udp_post_segment_fix_csum(skb);
 		ret = udp_queue_rcv_one_skb(sk, skb);
 		if (ret > 0)
-			ip_protocol_deliver_rcu(dev_net(skb->dev), skb, ret);
+			ip_protocol_deliver_rcu(dev_net_rcu(skb->dev), skb, ret);
 	}
 	return 0;
 }
@@ -2632,12 +2632,12 @@ static int udp_unicast_rcv_skb(struct sock *sk, struct sk_buff *skb,
 int __udp4_lib_rcv(struct sk_buff *skb, struct udp_table *udptable,
 		   int proto)
 {
+	struct net *net = dev_net_rcu(skb->dev);
+	struct rtable *rt = skb_rtable(skb);
 	struct sock *sk = NULL;
 	struct udphdr *uh;
 	unsigned short ulen;
-	struct rtable *rt = skb_rtable(skb);
 	__be32 saddr, daddr;
-	struct net *net = dev_net(skb->dev);
 	bool refcounted;
 	int drop_reason;
 
@@ -2804,7 +2804,7 @@ static struct sock *__udp4_lib_demux_lookup(struct net *net,
 
 int udp_v4_early_demux(struct sk_buff *skb)
 {
-	struct net *net = dev_net(skb->dev);
+	struct net *net = dev_net_rcu(skb->dev);
 	struct in_device *in_dev = NULL;
 	const struct iphdr *iph;
 	const struct udphdr *uh;
@@ -2873,7 +2873,8 @@ int udp_v4_early_demux(struct sk_buff *skb)
 
 int udp_rcv(struct sk_buff *skb)
 {
-	return __udp4_lib_rcv(skb, dev_net(skb->dev)->ipv4.udp_table, IPPROTO_UDP);
+	return __udp4_lib_rcv(skb, dev_net_rcu(skb->dev)->ipv4.udp_table,
+			      IPPROTO_UDP);
 }
 
 void udp_destroy_sock(struct sock *sk)
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c
index 6671daa67f4fab28f847bd4d8475ef752a63f05d..1972a0f9c9c39c8b311d536a60fa7d6e79f74c29 100644
--- a/net/ipv6/udp.c
+++ b/net/ipv6/udp.c
@@ -410,7 +410,7 @@ static struct sock *__udp6_lib_lookup_skb(struct sk_buff *skb,
 {
 	const struct ipv6hdr *iph = ipv6_hdr(skb);
 
-	return __udp6_lib_lookup(dev_net(skb->dev), &iph->saddr, sport,
+	return __udp6_lib_lookup(dev_net_rcu(skb->dev), &iph->saddr, sport,
 				 &iph->daddr, dport, inet6_iif(skb),
 				 inet6_sdif(skb), udptable, skb);
 }
@@ -420,7 +420,7 @@ struct sock *udp6_lib_lookup_skb(const struct sk_buff *skb,
 {
 	const u16 offset = NAPI_GRO_CB(skb)->network_offsets[skb->encapsulation];
 	const struct ipv6hdr *iph = (struct ipv6hdr *)(skb->data + offset);
-	struct net *net = dev_net(skb->dev);
+	struct net *net = dev_net_rcu(skb->dev);
 	int iif, sdif;
 
 	inet6_get_iif_sdif(skb, &iif, &sdif);
@@ -702,16 +702,16 @@ int __udp6_lib_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
 		   u8 type, u8 code, int offset, __be32 info,
 		   struct udp_table *udptable)
 {
-	struct ipv6_pinfo *np;
 	const struct ipv6hdr *hdr = (const struct ipv6hdr *)skb->data;
 	const struct in6_addr *saddr = &hdr->saddr;
 	const struct in6_addr *daddr = seg6_get_daddr(skb, opt) ? : &hdr->daddr;
 	struct udphdr *uh = (struct udphdr *)(skb->data+offset);
+	struct net *net = dev_net_rcu(skb->dev);
+	struct ipv6_pinfo *np;
 	bool tunnel = false;
 	struct sock *sk;
 	int harderr;
 	int err;
-	struct net *net = dev_net(skb->dev);
 
 	sk = __udp6_lib_lookup(net, daddr, uh->dest, saddr, uh->source,
 			       inet6_iif(skb), inet6_sdif(skb), udptable, NULL);
@@ -818,7 +818,7 @@ static __inline__ int udpv6_err(struct sk_buff *skb,
 				u8 code, int offset, __be32 info)
 {
 	return __udp6_lib_err(skb, opt, type, code, offset, info,
-			      dev_net(skb->dev)->ipv4.udp_table);
+			      dev_net_rcu(skb->dev)->ipv4.udp_table);
 }
 
 static int udpv6_queue_rcv_one_skb(struct sock *sk, struct sk_buff *skb)
@@ -929,7 +929,7 @@ static int udpv6_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
 		udp_post_segment_fix_csum(skb);
 		ret = udpv6_queue_rcv_one_skb(sk, skb);
 		if (ret > 0)
-			ip6_protocol_deliver_rcu(dev_net(skb->dev), skb, ret,
+			ip6_protocol_deliver_rcu(dev_net_rcu(skb->dev), skb, ret,
 						 true);
 	}
 	return 0;
@@ -1072,7 +1072,7 @@ int __udp6_lib_rcv(struct sk_buff *skb, struct udp_table *udptable,
 {
 	enum skb_drop_reason reason = SKB_DROP_REASON_NOT_SPECIFIED;
 	const struct in6_addr *saddr, *daddr;
-	struct net *net = dev_net(skb->dev);
+	struct net *net = dev_net_rcu(skb->dev);
 	struct sock *sk = NULL;
 	struct udphdr *uh;
 	bool refcounted;
@@ -1220,7 +1220,7 @@ static struct sock *__udp6_lib_demux_lookup(struct net *net,
 
 void udp_v6_early_demux(struct sk_buff *skb)
 {
-	struct net *net = dev_net(skb->dev);
+	struct net *net = dev_net_rcu(skb->dev);
 	const struct udphdr *uh;
 	struct sock *sk;
 	struct dst_entry *dst;
@@ -1262,7 +1262,7 @@ void udp_v6_early_demux(struct sk_buff *skb)
 
 INDIRECT_CALLABLE_SCOPE int udpv6_rcv(struct sk_buff *skb)
 {
-	return __udp6_lib_rcv(skb, dev_net(skb->dev)->ipv4.udp_table, IPPROTO_UDP);
+	return __udp6_lib_rcv(skb, dev_net_rcu(skb->dev)->ipv4.udp_table, IPPROTO_UDP);
 }
 
 /*
-- 
2.48.1.362.g079036d154-goog


^ permalink raw reply related	[flat|nested] 35+ messages in thread

* [PATCH net 09/16] ipv4: icmp: convert to dev_net_rcu()
  2025-01-31 17:13 [PATCH net 00/16] net: first round to use dev_net_rcu() Eric Dumazet
                   ` (7 preceding siblings ...)
  2025-01-31 17:13 ` [PATCH net 08/16] udp: convert to dev_net_rcu() Eric Dumazet
@ 2025-01-31 17:13 ` Eric Dumazet
  2025-01-31 19:12   ` Kuniyuki Iwashima
  2025-01-31 17:13 ` [PATCH net 10/16] ipv6: " Eric Dumazet
                   ` (6 subsequent siblings)
  15 siblings, 1 reply; 35+ messages in thread
From: Eric Dumazet @ 2025-01-31 17:13 UTC (permalink / raw)
  To: David S . Miller, Jakub Kicinski, Paolo Abeni
  Cc: netdev, Kuniyuki Iwashima, Simon Horman, eric.dumazet,
	Eric Dumazet

ICMP uses of dev_net() are safe, change them to dev_net_rcu()
to get LOCKDEP support.

Signed-off-by: Eric Dumazet <edumazet@google.com>
---
 net/ipv4/icmp.c | 22 +++++++++++-----------
 1 file changed, 11 insertions(+), 11 deletions(-)

diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c
index 094084b61bff8a17c4e85c99019b84e9cba21599..19bf8edd6759872fe667af82790b77b01212271b 100644
--- a/net/ipv4/icmp.c
+++ b/net/ipv4/icmp.c
@@ -401,7 +401,7 @@ static void icmp_reply(struct icmp_bxm *icmp_param, struct sk_buff *skb)
 {
 	struct ipcm_cookie ipc;
 	struct rtable *rt = skb_rtable(skb);
-	struct net *net = dev_net(rt->dst.dev);
+	struct net *net = dev_net_rcu(rt->dst.dev);
 	bool apply_ratelimit = false;
 	struct flowi4 fl4;
 	struct sock *sk;
@@ -611,9 +611,9 @@ void __icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info,
 		goto out;
 
 	if (rt->dst.dev)
-		net = dev_net(rt->dst.dev);
+		net = dev_net_rcu(rt->dst.dev);
 	else if (skb_in->dev)
-		net = dev_net(skb_in->dev);
+		net = dev_net_rcu(skb_in->dev);
 	else
 		goto out;
 
@@ -834,7 +834,7 @@ static void icmp_socket_deliver(struct sk_buff *skb, u32 info)
 	 * avoid additional coding at protocol handlers.
 	 */
 	if (!pskb_may_pull(skb, iph->ihl * 4 + 8)) {
-		__ICMP_INC_STATS(dev_net(skb->dev), ICMP_MIB_INERRORS);
+		__ICMP_INC_STATS(dev_net_rcu(skb->dev), ICMP_MIB_INERRORS);
 		return;
 	}
 
@@ -868,7 +868,7 @@ static enum skb_drop_reason icmp_unreach(struct sk_buff *skb)
 	struct net *net;
 	u32 info = 0;
 
-	net = dev_net(skb_dst(skb)->dev);
+	net = dev_net_rcu(skb_dst(skb)->dev);
 
 	/*
 	 *	Incomplete header ?
@@ -979,7 +979,7 @@ static enum skb_drop_reason icmp_unreach(struct sk_buff *skb)
 static enum skb_drop_reason icmp_redirect(struct sk_buff *skb)
 {
 	if (skb->len < sizeof(struct iphdr)) {
-		__ICMP_INC_STATS(dev_net(skb->dev), ICMP_MIB_INERRORS);
+		__ICMP_INC_STATS(dev_net_rcu(skb->dev), ICMP_MIB_INERRORS);
 		return SKB_DROP_REASON_PKT_TOO_SMALL;
 	}
 
@@ -1011,7 +1011,7 @@ static enum skb_drop_reason icmp_echo(struct sk_buff *skb)
 	struct icmp_bxm icmp_param;
 	struct net *net;
 
-	net = dev_net(skb_dst(skb)->dev);
+	net = dev_net_rcu(skb_dst(skb)->dev);
 	/* should there be an ICMP stat for ignored echos? */
 	if (READ_ONCE(net->ipv4.sysctl_icmp_echo_ignore_all))
 		return SKB_NOT_DROPPED_YET;
@@ -1040,9 +1040,9 @@ static enum skb_drop_reason icmp_echo(struct sk_buff *skb)
 
 bool icmp_build_probe(struct sk_buff *skb, struct icmphdr *icmphdr)
 {
+	struct net *net = dev_net_rcu(skb->dev);
 	struct icmp_ext_hdr *ext_hdr, _ext_hdr;
 	struct icmp_ext_echo_iio *iio, _iio;
-	struct net *net = dev_net(skb->dev);
 	struct inet6_dev *in6_dev;
 	struct in_device *in_dev;
 	struct net_device *dev;
@@ -1181,7 +1181,7 @@ static enum skb_drop_reason icmp_timestamp(struct sk_buff *skb)
 	return SKB_NOT_DROPPED_YET;
 
 out_err:
-	__ICMP_INC_STATS(dev_net(skb_dst(skb)->dev), ICMP_MIB_INERRORS);
+	__ICMP_INC_STATS(dev_net_rcu(skb_dst(skb)->dev), ICMP_MIB_INERRORS);
 	return SKB_DROP_REASON_PKT_TOO_SMALL;
 }
 
@@ -1198,7 +1198,7 @@ int icmp_rcv(struct sk_buff *skb)
 {
 	enum skb_drop_reason reason = SKB_DROP_REASON_NOT_SPECIFIED;
 	struct rtable *rt = skb_rtable(skb);
-	struct net *net = dev_net(rt->dst.dev);
+	struct net *net = dev_net_rcu(rt->dst.dev);
 	struct icmphdr *icmph;
 
 	if (!xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb)) {
@@ -1371,9 +1371,9 @@ int icmp_err(struct sk_buff *skb, u32 info)
 	struct iphdr *iph = (struct iphdr *)skb->data;
 	int offset = iph->ihl<<2;
 	struct icmphdr *icmph = (struct icmphdr *)(skb->data + offset);
+	struct net *net = dev_net_rcu(skb->dev);
 	int type = icmp_hdr(skb)->type;
 	int code = icmp_hdr(skb)->code;
-	struct net *net = dev_net(skb->dev);
 
 	/*
 	 * Use ping_err to handle all icmp errors except those
-- 
2.48.1.362.g079036d154-goog


^ permalink raw reply related	[flat|nested] 35+ messages in thread

* [PATCH net 10/16] ipv6: icmp: convert to dev_net_rcu()
  2025-01-31 17:13 [PATCH net 00/16] net: first round to use dev_net_rcu() Eric Dumazet
                   ` (8 preceding siblings ...)
  2025-01-31 17:13 ` [PATCH net 09/16] ipv4: icmp: " Eric Dumazet
@ 2025-01-31 17:13 ` Eric Dumazet
  2025-01-31 19:15   ` Kuniyuki Iwashima
  2025-01-31 17:13 ` [PATCH net 11/16] ipv6: input: " Eric Dumazet
                   ` (5 subsequent siblings)
  15 siblings, 1 reply; 35+ messages in thread
From: Eric Dumazet @ 2025-01-31 17:13 UTC (permalink / raw)
  To: David S . Miller, Jakub Kicinski, Paolo Abeni
  Cc: netdev, Kuniyuki Iwashima, Simon Horman, eric.dumazet,
	Eric Dumazet

ICMP uses of dev_net() are safe, change them to dev_net_rcu()
to get LOCKDEP support.

Signed-off-by: Eric Dumazet <edumazet@google.com>
---
 net/ipv6/icmp.c | 22 +++++++++++-----------
 1 file changed, 11 insertions(+), 11 deletions(-)

diff --git a/net/ipv6/icmp.c b/net/ipv6/icmp.c
index a6984a29fdb9dd972a11ca9f8d5e794c443bac6f..cb9ba5d8b6bab340fd4900f2fa99baa1ebeacb0f 100644
--- a/net/ipv6/icmp.c
+++ b/net/ipv6/icmp.c
@@ -76,7 +76,7 @@ static int icmpv6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
 {
 	/* icmpv6_notify checks 8 bytes can be pulled, icmp6hdr is 8 bytes */
 	struct icmp6hdr *icmp6 = (struct icmp6hdr *) (skb->data + offset);
-	struct net *net = dev_net(skb->dev);
+	struct net *net = dev_net_rcu(skb->dev);
 
 	if (type == ICMPV6_PKT_TOOBIG)
 		ip6_update_pmtu(skb, net, info, skb->dev->ifindex, 0, sock_net_uid(net, NULL));
@@ -473,7 +473,7 @@ void icmp6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info,
 
 	if (!skb->dev)
 		return;
-	net = dev_net(skb->dev);
+	net = dev_net_rcu(skb->dev);
 	mark = IP6_REPLY_MARK(net, skb->mark);
 	/*
 	 *	Make sure we respect the rules
@@ -679,8 +679,8 @@ int ip6_err_gen_icmpv6_unreach(struct sk_buff *skb, int nhs, int type,
 	skb_pull(skb2, nhs);
 	skb_reset_network_header(skb2);
 
-	rt = rt6_lookup(dev_net(skb->dev), &ipv6_hdr(skb2)->saddr, NULL, 0,
-			skb, 0);
+	rt = rt6_lookup(dev_net_rcu(skb->dev), &ipv6_hdr(skb2)->saddr,
+			NULL, 0, skb, 0);
 
 	if (rt && rt->dst.dev)
 		skb2->dev = rt->dst.dev;
@@ -717,7 +717,7 @@ EXPORT_SYMBOL(ip6_err_gen_icmpv6_unreach);
 
 static enum skb_drop_reason icmpv6_echo_reply(struct sk_buff *skb)
 {
-	struct net *net = dev_net(skb->dev);
+	struct net *net = dev_net_rcu(skb->dev);
 	struct sock *sk;
 	struct inet6_dev *idev;
 	struct ipv6_pinfo *np;
@@ -832,7 +832,7 @@ enum skb_drop_reason icmpv6_notify(struct sk_buff *skb, u8 type,
 				   u8 code, __be32 info)
 {
 	struct inet6_skb_parm *opt = IP6CB(skb);
-	struct net *net = dev_net(skb->dev);
+	struct net *net = dev_net_rcu(skb->dev);
 	const struct inet6_protocol *ipprot;
 	enum skb_drop_reason reason;
 	int inner_offset;
@@ -889,7 +889,7 @@ enum skb_drop_reason icmpv6_notify(struct sk_buff *skb, u8 type,
 static int icmpv6_rcv(struct sk_buff *skb)
 {
 	enum skb_drop_reason reason = SKB_DROP_REASON_NOT_SPECIFIED;
-	struct net *net = dev_net(skb->dev);
+	struct net *net = dev_net_rcu(skb->dev);
 	struct net_device *dev = icmp6_dev(skb);
 	struct inet6_dev *idev = __in6_dev_get(dev);
 	const struct in6_addr *saddr, *daddr;
@@ -921,7 +921,7 @@ static int icmpv6_rcv(struct sk_buff *skb)
 		skb_set_network_header(skb, nh);
 	}
 
-	__ICMP6_INC_STATS(dev_net(dev), idev, ICMP6_MIB_INMSGS);
+	__ICMP6_INC_STATS(dev_net_rcu(dev), idev, ICMP6_MIB_INMSGS);
 
 	saddr = &ipv6_hdr(skb)->saddr;
 	daddr = &ipv6_hdr(skb)->daddr;
@@ -939,7 +939,7 @@ static int icmpv6_rcv(struct sk_buff *skb)
 
 	type = hdr->icmp6_type;
 
-	ICMP6MSGIN_INC_STATS(dev_net(dev), idev, type);
+	ICMP6MSGIN_INC_STATS(dev_net_rcu(dev), idev, type);
 
 	switch (type) {
 	case ICMPV6_ECHO_REQUEST:
@@ -1034,9 +1034,9 @@ static int icmpv6_rcv(struct sk_buff *skb)
 
 csum_error:
 	reason = SKB_DROP_REASON_ICMP_CSUM;
-	__ICMP6_INC_STATS(dev_net(dev), idev, ICMP6_MIB_CSUMERRORS);
+	__ICMP6_INC_STATS(dev_net_rcu(dev), idev, ICMP6_MIB_CSUMERRORS);
 discard_it:
-	__ICMP6_INC_STATS(dev_net(dev), idev, ICMP6_MIB_INERRORS);
+	__ICMP6_INC_STATS(dev_net_rcu(dev), idev, ICMP6_MIB_INERRORS);
 drop_no_count:
 	kfree_skb_reason(skb, reason);
 	return 0;
-- 
2.48.1.362.g079036d154-goog


^ permalink raw reply related	[flat|nested] 35+ messages in thread

* [PATCH net 11/16] ipv6: input: convert to dev_net_rcu()
  2025-01-31 17:13 [PATCH net 00/16] net: first round to use dev_net_rcu() Eric Dumazet
                   ` (9 preceding siblings ...)
  2025-01-31 17:13 ` [PATCH net 10/16] ipv6: " Eric Dumazet
@ 2025-01-31 17:13 ` Eric Dumazet
  2025-01-31 19:21   ` Kuniyuki Iwashima
  2025-01-31 17:13 ` [PATCH net 12/16] ipv6: output: " Eric Dumazet
                   ` (4 subsequent siblings)
  15 siblings, 1 reply; 35+ messages in thread
From: Eric Dumazet @ 2025-01-31 17:13 UTC (permalink / raw)
  To: David S . Miller, Jakub Kicinski, Paolo Abeni
  Cc: netdev, Kuniyuki Iwashima, Simon Horman, eric.dumazet,
	Eric Dumazet

dev_net() calls from net/ipv6/ip6_input.c seem to
happen under RCU protection.

Convert them to dev_net_rcu() to ensure LOCKDEP support.

Signed-off-by: Eric Dumazet <edumazet@google.com>
---
 net/ipv6/ip6_input.c | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/net/ipv6/ip6_input.c b/net/ipv6/ip6_input.c
index 70c0e16c0ae6837d1c64d0036829c8b61799578b..4030527ebe098e86764f37c9068d2f2f9af2d183 100644
--- a/net/ipv6/ip6_input.c
+++ b/net/ipv6/ip6_input.c
@@ -301,7 +301,7 @@ static struct sk_buff *ip6_rcv_core(struct sk_buff *skb, struct net_device *dev,
 
 int ipv6_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev)
 {
-	struct net *net = dev_net(skb->dev);
+	struct net *net = dev_net_rcu(skb->dev);
 
 	skb = ip6_rcv_core(skb, dev, net);
 	if (skb == NULL)
@@ -330,7 +330,7 @@ void ipv6_list_rcv(struct list_head *head, struct packet_type *pt,
 
 	list_for_each_entry_safe(skb, next, head, list) {
 		struct net_device *dev = skb->dev;
-		struct net *net = dev_net(dev);
+		struct net *net = dev_net_rcu(dev);
 
 		skb_list_del_init(skb);
 		skb = ip6_rcv_core(skb, dev, net);
@@ -488,7 +488,7 @@ static int ip6_input_finish(struct net *net, struct sock *sk, struct sk_buff *sk
 int ip6_input(struct sk_buff *skb)
 {
 	return NF_HOOK(NFPROTO_IPV6, NF_INET_LOCAL_IN,
-		       dev_net(skb->dev), NULL, skb, skb->dev, NULL,
+		       dev_net_rcu(skb->dev), NULL, skb, skb->dev, NULL,
 		       ip6_input_finish);
 }
 EXPORT_SYMBOL_GPL(ip6_input);
@@ -500,14 +500,14 @@ int ip6_mc_input(struct sk_buff *skb)
 	struct net_device *dev;
 	bool deliver;
 
-	__IP6_UPD_PO_STATS(dev_net(skb_dst(skb)->dev),
+	__IP6_UPD_PO_STATS(dev_net_rcu(skb_dst(skb)->dev),
 			 __in6_dev_get_safely(skb->dev), IPSTATS_MIB_INMCAST,
 			 skb->len);
 
 	/* skb->dev passed may be master dev for vrfs. */
 	if (sdif) {
 		rcu_read_lock();
-		dev = dev_get_by_index_rcu(dev_net(skb->dev), sdif);
+		dev = dev_get_by_index_rcu(dev_net_rcu(skb->dev), sdif);
 		if (!dev) {
 			rcu_read_unlock();
 			kfree_skb(skb);
@@ -526,7 +526,7 @@ int ip6_mc_input(struct sk_buff *skb)
 	/*
 	 *      IPv6 multicast router mode is now supported ;)
 	 */
-	if (atomic_read(&dev_net(skb->dev)->ipv6.devconf_all->mc_forwarding) &&
+	if (atomic_read(&dev_net_rcu(skb->dev)->ipv6.devconf_all->mc_forwarding) &&
 	    !(ipv6_addr_type(&hdr->daddr) &
 	      (IPV6_ADDR_LOOPBACK|IPV6_ADDR_LINKLOCAL)) &&
 	    likely(!(IP6CB(skb)->flags & IP6SKB_FORWARDED))) {
-- 
2.48.1.362.g079036d154-goog


^ permalink raw reply related	[flat|nested] 35+ messages in thread

* [PATCH net 12/16] ipv6: output: convert to dev_net_rcu()
  2025-01-31 17:13 [PATCH net 00/16] net: first round to use dev_net_rcu() Eric Dumazet
                   ` (10 preceding siblings ...)
  2025-01-31 17:13 ` [PATCH net 11/16] ipv6: input: " Eric Dumazet
@ 2025-01-31 17:13 ` Eric Dumazet
  2025-01-31 19:26   ` Kuniyuki Iwashima
  2025-01-31 17:13 ` [PATCH net 13/16] ipv6: use RCU protection in ip6_default_advmss() Eric Dumazet
                   ` (3 subsequent siblings)
  15 siblings, 1 reply; 35+ messages in thread
From: Eric Dumazet @ 2025-01-31 17:13 UTC (permalink / raw)
  To: David S . Miller, Jakub Kicinski, Paolo Abeni
  Cc: netdev, Kuniyuki Iwashima, Simon Horman, eric.dumazet,
	Eric Dumazet

dev_net() calls from net/ipv6/ip6_output.c
and net/ipv6/output_core.c are happening under RCU
protection.

Convert them to dev_net_rcu() to ensure LOCKDEP support.

Signed-off-by: Eric Dumazet <edumazet@google.com>
---
 net/ipv6/ip6_output.c  | 4 ++--
 net/ipv6/output_core.c | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c
index d577bf2f3053873d27b241029592cdbb0a124ad7..4c73a4cdcb23f76d81e572d5b1bd0f6902447c0e 100644
--- a/net/ipv6/ip6_output.c
+++ b/net/ipv6/ip6_output.c
@@ -393,7 +393,7 @@ static int ip6_call_ra_chain(struct sk_buff *skb, int sel)
 		     sk->sk_bound_dev_if == skb->dev->ifindex)) {
 
 			if (inet6_test_bit(RTALERT_ISOLATE, sk) &&
-			    !net_eq(sock_net(sk), dev_net(skb->dev))) {
+			    !net_eq(sock_net(sk), dev_net_rcu(skb->dev))) {
 				continue;
 			}
 			if (last) {
@@ -503,7 +503,7 @@ int ip6_forward(struct sk_buff *skb)
 	struct dst_entry *dst = skb_dst(skb);
 	struct ipv6hdr *hdr = ipv6_hdr(skb);
 	struct inet6_skb_parm *opt = IP6CB(skb);
-	struct net *net = dev_net(dst->dev);
+	struct net *net = dev_net_rcu(dst->dev);
 	struct inet6_dev *idev;
 	SKB_DR(reason);
 	u32 mtu;
diff --git a/net/ipv6/output_core.c b/net/ipv6/output_core.c
index 806d4b5dd1e60b27726facbb59bbef97d6fee7f5..94438fd4f0e833bb8f5ea4822c7312376ea79304 100644
--- a/net/ipv6/output_core.c
+++ b/net/ipv6/output_core.c
@@ -113,7 +113,7 @@ int ip6_dst_hoplimit(struct dst_entry *dst)
 		if (idev)
 			hoplimit = READ_ONCE(idev->cnf.hop_limit);
 		else
-			hoplimit = READ_ONCE(dev_net(dev)->ipv6.devconf_all->hop_limit);
+			hoplimit = READ_ONCE(dev_net_rcu(dev)->ipv6.devconf_all->hop_limit);
 		rcu_read_unlock();
 	}
 	return hoplimit;
-- 
2.48.1.362.g079036d154-goog


^ permalink raw reply related	[flat|nested] 35+ messages in thread

* [PATCH net 13/16] ipv6: use RCU protection in ip6_default_advmss()
  2025-01-31 17:13 [PATCH net 00/16] net: first round to use dev_net_rcu() Eric Dumazet
                   ` (11 preceding siblings ...)
  2025-01-31 17:13 ` [PATCH net 12/16] ipv6: output: " Eric Dumazet
@ 2025-01-31 17:13 ` Eric Dumazet
  2025-01-31 19:35   ` Kuniyuki Iwashima
  2025-01-31 17:13 ` [PATCH net 14/16] net: filter: convert to dev_net_rcu() Eric Dumazet
                   ` (2 subsequent siblings)
  15 siblings, 1 reply; 35+ messages in thread
From: Eric Dumazet @ 2025-01-31 17:13 UTC (permalink / raw)
  To: David S . Miller, Jakub Kicinski, Paolo Abeni
  Cc: netdev, Kuniyuki Iwashima, Simon Horman, eric.dumazet,
	Eric Dumazet

ip6_default_advmss() needs rcu protection to make
sure the net structure it reads does not disappear.

Signed-off-by: Eric Dumazet <edumazet@google.com>
---
 net/ipv6/route.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/net/ipv6/route.c b/net/ipv6/route.c
index 78362822b9070df138a0724dc76003b63026f9e2..ef2d23a1e3d532f5db37ca94ca482c5522dddffc 100644
--- a/net/ipv6/route.c
+++ b/net/ipv6/route.c
@@ -3196,13 +3196,18 @@ static unsigned int ip6_default_advmss(const struct dst_entry *dst)
 {
 	struct net_device *dev = dst->dev;
 	unsigned int mtu = dst_mtu(dst);
-	struct net *net = dev_net(dev);
+	struct net *net;
 
 	mtu -= sizeof(struct ipv6hdr) + sizeof(struct tcphdr);
 
+	rcu_read_lock();
+
+	net = dev_net_rcu(dev);
 	if (mtu < net->ipv6.sysctl.ip6_rt_min_advmss)
 		mtu = net->ipv6.sysctl.ip6_rt_min_advmss;
 
+	rcu_read_unlock();
+
 	/*
 	 * Maximal non-jumbo IPv6 payload is IPV6_MAXPLEN and
 	 * corresponding MSS is IPV6_MAXPLEN - tcp_header_size.
-- 
2.48.1.362.g079036d154-goog


^ permalink raw reply related	[flat|nested] 35+ messages in thread

* [PATCH net 14/16] net: filter: convert to dev_net_rcu()
  2025-01-31 17:13 [PATCH net 00/16] net: first round to use dev_net_rcu() Eric Dumazet
                   ` (12 preceding siblings ...)
  2025-01-31 17:13 ` [PATCH net 13/16] ipv6: use RCU protection in ip6_default_advmss() Eric Dumazet
@ 2025-01-31 17:13 ` Eric Dumazet
  2025-01-31 19:37   ` Kuniyuki Iwashima
  2025-01-31 17:13 ` [PATCH net 15/16] flow_dissector: use rcu protection to fetch dev_net() Eric Dumazet
  2025-02-02  2:18 ` [PATCH net 00/16] net: first round to use dev_net_rcu() Jakub Kicinski
  15 siblings, 1 reply; 35+ messages in thread
From: Eric Dumazet @ 2025-01-31 17:13 UTC (permalink / raw)
  To: David S . Miller, Jakub Kicinski, Paolo Abeni
  Cc: netdev, Kuniyuki Iwashima, Simon Horman, eric.dumazet,
	Eric Dumazet

All calls to dev_net() from net/core/filter.c are currently
done under rcu_read_lock().

Convert them to dev_net_rcu() to ensure LOCKDEP support.

Signed-off-by: Eric Dumazet <edumazet@google.com>
---
 net/core/filter.c | 40 ++++++++++++++++++++--------------------
 1 file changed, 20 insertions(+), 20 deletions(-)

diff --git a/net/core/filter.c b/net/core/filter.c
index 2ec162dd83c463640dcf3c151327206f519b217a..4db537a982d55fa9b42aaa70820cb337d5283299 100644
--- a/net/core/filter.c
+++ b/net/core/filter.c
@@ -2244,7 +2244,7 @@ static int __bpf_redirect_neigh_v6(struct sk_buff *skb, struct net_device *dev,
 				   struct bpf_nh_params *nh)
 {
 	const struct ipv6hdr *ip6h = ipv6_hdr(skb);
-	struct net *net = dev_net(dev);
+	struct net *net = dev_net_rcu(dev);
 	int err, ret = NET_XMIT_DROP;
 
 	if (!nh) {
@@ -2348,7 +2348,7 @@ static int __bpf_redirect_neigh_v4(struct sk_buff *skb, struct net_device *dev,
 				   struct bpf_nh_params *nh)
 {
 	const struct iphdr *ip4h = ip_hdr(skb);
-	struct net *net = dev_net(dev);
+	struct net *net = dev_net_rcu(dev);
 	int err, ret = NET_XMIT_DROP;
 
 	if (!nh) {
@@ -2438,7 +2438,7 @@ BPF_CALL_3(bpf_clone_redirect, struct sk_buff *, skb, u32, ifindex, u64, flags)
 	if (unlikely(flags & (~(BPF_F_INGRESS) | BPF_F_REDIRECT_INTERNAL)))
 		return -EINVAL;
 
-	dev = dev_get_by_index_rcu(dev_net(skb->dev), ifindex);
+	dev = dev_get_by_index_rcu(dev_net_rcu(skb->dev), ifindex);
 	if (unlikely(!dev))
 		return -EINVAL;
 
@@ -2482,7 +2482,7 @@ static struct net_device *skb_get_peer_dev(struct net_device *dev)
 int skb_do_redirect(struct sk_buff *skb)
 {
 	struct bpf_redirect_info *ri = bpf_net_ctx_get_ri();
-	struct net *net = dev_net(skb->dev);
+	struct net *net = dev_net_rcu(skb->dev);
 	struct net_device *dev;
 	u32 flags = ri->flags;
 
@@ -2497,7 +2497,7 @@ int skb_do_redirect(struct sk_buff *skb)
 		dev = skb_get_peer_dev(dev);
 		if (unlikely(!dev ||
 			     !(dev->flags & IFF_UP) ||
-			     net_eq(net, dev_net(dev))))
+			     net_eq(net, dev_net_rcu(dev))))
 			goto out_drop;
 		skb->dev = dev;
 		dev_sw_netstats_rx_add(dev, skb->len);
@@ -4425,7 +4425,7 @@ __xdp_do_redirect_frame(struct bpf_redirect_info *ri, struct net_device *dev,
 		break;
 	case BPF_MAP_TYPE_UNSPEC:
 		if (map_id == INT_MAX) {
-			fwd = dev_get_by_index_rcu(dev_net(dev), ri->tgt_index);
+			fwd = dev_get_by_index_rcu(dev_net_rcu(dev), ri->tgt_index);
 			if (unlikely(!fwd)) {
 				err = -EINVAL;
 				break;
@@ -4550,7 +4550,7 @@ int xdp_do_generic_redirect(struct net_device *dev, struct sk_buff *skb,
 	ri->map_type = BPF_MAP_TYPE_UNSPEC;
 
 	if (map_type == BPF_MAP_TYPE_UNSPEC && map_id == INT_MAX) {
-		fwd = dev_get_by_index_rcu(dev_net(dev), ri->tgt_index);
+		fwd = dev_get_by_index_rcu(dev_net_rcu(dev), ri->tgt_index);
 		if (unlikely(!fwd)) {
 			err = -EINVAL;
 			goto err;
@@ -6203,12 +6203,12 @@ BPF_CALL_4(bpf_xdp_fib_lookup, struct xdp_buff *, ctx,
 	switch (params->family) {
 #if IS_ENABLED(CONFIG_INET)
 	case AF_INET:
-		return bpf_ipv4_fib_lookup(dev_net(ctx->rxq->dev), params,
+		return bpf_ipv4_fib_lookup(dev_net_rcu(ctx->rxq->dev), params,
 					   flags, true);
 #endif
 #if IS_ENABLED(CONFIG_IPV6)
 	case AF_INET6:
-		return bpf_ipv6_fib_lookup(dev_net(ctx->rxq->dev), params,
+		return bpf_ipv6_fib_lookup(dev_net_rcu(ctx->rxq->dev), params,
 					   flags, true);
 #endif
 	}
@@ -6228,7 +6228,7 @@ static const struct bpf_func_proto bpf_xdp_fib_lookup_proto = {
 BPF_CALL_4(bpf_skb_fib_lookup, struct sk_buff *, skb,
 	   struct bpf_fib_lookup *, params, int, plen, u32, flags)
 {
-	struct net *net = dev_net(skb->dev);
+	struct net *net = dev_net_rcu(skb->dev);
 	int rc = -EAFNOSUPPORT;
 	bool check_mtu = false;
 
@@ -6283,7 +6283,7 @@ static const struct bpf_func_proto bpf_skb_fib_lookup_proto = {
 static struct net_device *__dev_via_ifindex(struct net_device *dev_curr,
 					    u32 ifindex)
 {
-	struct net *netns = dev_net(dev_curr);
+	struct net *netns = dev_net_rcu(dev_curr);
 
 	/* Non-redirect use-cases can use ifindex=0 and save ifindex lookup */
 	if (ifindex == 0)
@@ -6806,7 +6806,7 @@ bpf_skc_lookup(struct sk_buff *skb, struct bpf_sock_tuple *tuple, u32 len,
 	int ifindex;
 
 	if (skb->dev) {
-		caller_net = dev_net(skb->dev);
+		caller_net = dev_net_rcu(skb->dev);
 		ifindex = skb->dev->ifindex;
 	} else {
 		caller_net = sock_net(skb->sk);
@@ -6906,7 +6906,7 @@ BPF_CALL_5(bpf_tc_skc_lookup_tcp, struct sk_buff *, skb,
 {
 	struct net_device *dev = skb->dev;
 	int ifindex = dev->ifindex, sdif = dev_sdif(dev);
-	struct net *caller_net = dev_net(dev);
+	struct net *caller_net = dev_net_rcu(dev);
 
 	return (unsigned long)__bpf_skc_lookup(skb, tuple, len, caller_net,
 					       ifindex, IPPROTO_TCP, netns_id,
@@ -6930,7 +6930,7 @@ BPF_CALL_5(bpf_tc_sk_lookup_tcp, struct sk_buff *, skb,
 {
 	struct net_device *dev = skb->dev;
 	int ifindex = dev->ifindex, sdif = dev_sdif(dev);
-	struct net *caller_net = dev_net(dev);
+	struct net *caller_net = dev_net_rcu(dev);
 
 	return (unsigned long)__bpf_sk_lookup(skb, tuple, len, caller_net,
 					      ifindex, IPPROTO_TCP, netns_id,
@@ -6954,7 +6954,7 @@ BPF_CALL_5(bpf_tc_sk_lookup_udp, struct sk_buff *, skb,
 {
 	struct net_device *dev = skb->dev;
 	int ifindex = dev->ifindex, sdif = dev_sdif(dev);
-	struct net *caller_net = dev_net(dev);
+	struct net *caller_net = dev_net_rcu(dev);
 
 	return (unsigned long)__bpf_sk_lookup(skb, tuple, len, caller_net,
 					      ifindex, IPPROTO_UDP, netns_id,
@@ -6992,7 +6992,7 @@ BPF_CALL_5(bpf_xdp_sk_lookup_udp, struct xdp_buff *, ctx,
 {
 	struct net_device *dev = ctx->rxq->dev;
 	int ifindex = dev->ifindex, sdif = dev_sdif(dev);
-	struct net *caller_net = dev_net(dev);
+	struct net *caller_net = dev_net_rcu(dev);
 
 	return (unsigned long)__bpf_sk_lookup(NULL, tuple, len, caller_net,
 					      ifindex, IPPROTO_UDP, netns_id,
@@ -7016,7 +7016,7 @@ BPF_CALL_5(bpf_xdp_skc_lookup_tcp, struct xdp_buff *, ctx,
 {
 	struct net_device *dev = ctx->rxq->dev;
 	int ifindex = dev->ifindex, sdif = dev_sdif(dev);
-	struct net *caller_net = dev_net(dev);
+	struct net *caller_net = dev_net_rcu(dev);
 
 	return (unsigned long)__bpf_skc_lookup(NULL, tuple, len, caller_net,
 					       ifindex, IPPROTO_TCP, netns_id,
@@ -7040,7 +7040,7 @@ BPF_CALL_5(bpf_xdp_sk_lookup_tcp, struct xdp_buff *, ctx,
 {
 	struct net_device *dev = ctx->rxq->dev;
 	int ifindex = dev->ifindex, sdif = dev_sdif(dev);
-	struct net *caller_net = dev_net(dev);
+	struct net *caller_net = dev_net_rcu(dev);
 
 	return (unsigned long)__bpf_sk_lookup(NULL, tuple, len, caller_net,
 					      ifindex, IPPROTO_TCP, netns_id,
@@ -7510,7 +7510,7 @@ BPF_CALL_3(bpf_sk_assign, struct sk_buff *, skb, struct sock *, sk, u64, flags)
 		return -EINVAL;
 	if (!skb_at_tc_ingress(skb))
 		return -EOPNOTSUPP;
-	if (unlikely(dev_net(skb->dev) != sock_net(sk)))
+	if (unlikely(dev_net_rcu(skb->dev) != sock_net(sk)))
 		return -ENETUNREACH;
 	if (sk_unhashed(sk))
 		return -EOPNOTSUPP;
@@ -11985,7 +11985,7 @@ __bpf_kfunc int bpf_sk_assign_tcp_reqsk(struct __sk_buff *s, struct sock *sk,
 	if (!skb_at_tc_ingress(skb))
 		return -EINVAL;
 
-	net = dev_net(skb->dev);
+	net = dev_net_rcu(skb->dev);
 	if (net != sock_net(sk))
 		return -ENETUNREACH;
 
-- 
2.48.1.362.g079036d154-goog


^ permalink raw reply related	[flat|nested] 35+ messages in thread

* [PATCH net 15/16] flow_dissector: use rcu protection to fetch dev_net()
  2025-01-31 17:13 [PATCH net 00/16] net: first round to use dev_net_rcu() Eric Dumazet
                   ` (13 preceding siblings ...)
  2025-01-31 17:13 ` [PATCH net 14/16] net: filter: convert to dev_net_rcu() Eric Dumazet
@ 2025-01-31 17:13 ` Eric Dumazet
  2025-01-31 19:46   ` Kuniyuki Iwashima
  2025-02-02  2:18 ` [PATCH net 00/16] net: first round to use dev_net_rcu() Jakub Kicinski
  15 siblings, 1 reply; 35+ messages in thread
From: Eric Dumazet @ 2025-01-31 17:13 UTC (permalink / raw)
  To: David S . Miller, Jakub Kicinski, Paolo Abeni
  Cc: netdev, Kuniyuki Iwashima, Simon Horman, eric.dumazet,
	Eric Dumazet

__skb_flow_dissect() can be called from arbitrary contexts.

It must extend its rcu protection section to include
the call to dev_net(), which can become dev_net_rcu().

This makes sure the net structure can not disappear under us.

Fixes: 3cbf4ffba5ee ("net: plumb network namespace into __skb_flow_dissect")
Signed-off-by: Eric Dumazet <edumazet@google.com>
---
 net/core/flow_dissector.c | 21 +++++++++++----------
 1 file changed, 11 insertions(+), 10 deletions(-)

diff --git a/net/core/flow_dissector.c b/net/core/flow_dissector.c
index 0e638a37aa0961de6281deeed227b3e7ef70e546..5db41bf2ed93e0df721c216ca4557dad16aa5f83 100644
--- a/net/core/flow_dissector.c
+++ b/net/core/flow_dissector.c
@@ -1108,10 +1108,12 @@ bool __skb_flow_dissect(const struct net *net,
 					      FLOW_DISSECTOR_KEY_BASIC,
 					      target_container);
 
+	rcu_read_lock();
+
 	if (skb) {
 		if (!net) {
 			if (skb->dev)
-				net = dev_net(skb->dev);
+				net = dev_net_rcu(skb->dev);
 			else if (skb->sk)
 				net = sock_net(skb->sk);
 		}
@@ -1122,7 +1124,6 @@ bool __skb_flow_dissect(const struct net *net,
 		enum netns_bpf_attach_type type = NETNS_BPF_FLOW_DISSECTOR;
 		struct bpf_prog_array *run_array;
 
-		rcu_read_lock();
 		run_array = rcu_dereference(init_net.bpf.run_array[type]);
 		if (!run_array)
 			run_array = rcu_dereference(net->bpf.run_array[type]);
@@ -1150,17 +1151,17 @@ bool __skb_flow_dissect(const struct net *net,
 			prog = READ_ONCE(run_array->items[0].prog);
 			result = bpf_flow_dissect(prog, &ctx, n_proto, nhoff,
 						  hlen, flags);
-			if (result == BPF_FLOW_DISSECTOR_CONTINUE)
-				goto dissect_continue;
-			__skb_flow_bpf_to_target(&flow_keys, flow_dissector,
-						 target_container);
-			rcu_read_unlock();
-			return result == BPF_OK;
+			if (result != BPF_FLOW_DISSECTOR_CONTINUE) {
+				__skb_flow_bpf_to_target(&flow_keys, flow_dissector,
+							 target_container);
+				rcu_read_unlock();
+				return result == BPF_OK;
+			}
 		}
-dissect_continue:
-		rcu_read_unlock();
 	}
 
+	rcu_read_unlock();
+
 	if (dissector_uses_key(flow_dissector,
 			       FLOW_DISSECTOR_KEY_ETH_ADDRS)) {
 		struct ethhdr *eth = eth_hdr(skb);
-- 
2.48.1.362.g079036d154-goog


^ permalink raw reply related	[flat|nested] 35+ messages in thread

* Re: [PATCH net 01/16] net: add dev_net_rcu() helper
  2025-01-31 17:13 ` [PATCH net 01/16] net: add dev_net_rcu() helper Eric Dumazet
@ 2025-01-31 18:29   ` Kuniyuki Iwashima
  0 siblings, 0 replies; 35+ messages in thread
From: Kuniyuki Iwashima @ 2025-01-31 18:29 UTC (permalink / raw)
  To: edumazet; +Cc: davem, eric.dumazet, horms, kuba, kuniyu, netdev, pabeni

From: Eric Dumazet <edumazet@google.com>
Date: Fri, 31 Jan 2025 17:13:19 +0000
> dev->nd_net can change, readers should either
> use rcu_read_lock() or RTNL.
> 
> We currently use a generic helper, dev_net() with
> no debugging support. We probably have many hidden bugs.
> 
> Add dev_net_rcu() helper for callers using rcu_read_lock()
> protection.
> 
> Signed-off-by: Eric Dumazet <edumazet@google.com>

Reviewed-by: Kuniyuki Iwashima <kuniyu@amazon.com>

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: [PATCH net 02/16] ipv4: add RCU protection to ip4_dst_hoplimit()
  2025-01-31 17:13 ` [PATCH net 02/16] ipv4: add RCU protection to ip4_dst_hoplimit() Eric Dumazet
@ 2025-01-31 18:34   ` Kuniyuki Iwashima
  0 siblings, 0 replies; 35+ messages in thread
From: Kuniyuki Iwashima @ 2025-01-31 18:34 UTC (permalink / raw)
  To: edumazet; +Cc: davem, eric.dumazet, horms, kuba, kuniyu, netdev, pabeni

From: Eric Dumazet <edumazet@google.com>
Date: Fri, 31 Jan 2025 17:13:20 +0000
> ip4_dst_hoplimit() must use RCU protection to make
> sure the net structure it reads does not disappear.
> 
> Fixes: fa50d974d104 ("ipv4: Namespaceify ip_default_ttl sysctl knob")
> Signed-off-by: Eric Dumazet <edumazet@google.com>

Reviewed-by: Kuniyuki Iwashima <kuniyu@amazon.com>

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: [PATCH net 03/16] ipv4: use RCU protection in ip_dst_mtu_maybe_forward()
  2025-01-31 17:13 ` [PATCH net 03/16] ipv4: use RCU protection in ip_dst_mtu_maybe_forward() Eric Dumazet
@ 2025-01-31 18:47   ` Kuniyuki Iwashima
  0 siblings, 0 replies; 35+ messages in thread
From: Kuniyuki Iwashima @ 2025-01-31 18:47 UTC (permalink / raw)
  To: edumazet; +Cc: davem, eric.dumazet, horms, kuba, kuniyu, netdev, pabeni

From: Eric Dumazet <edumazet@google.com>
Date: Fri, 31 Jan 2025 17:13:21 +0000
> ip_dst_mtu_maybe_forward() must use RCU protection to make
> sure the net structure it reads does not disappear.
> 
> Fixes: f87c10a8aa1e8 ("ipv4: introduce ip_dst_mtu_maybe_forward and protect forwarding path against pmtu spoofing")
> Signed-off-by: Eric Dumazet <edumazet@google.com>

Reviewed-by: Kuniyuki Iwashima <kuniyu@amazon.com>

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: [PATCH net 04/16] ipv4: use RCU protection in ipv4_default_advmss()
  2025-01-31 17:13 ` [PATCH net 04/16] ipv4: use RCU protection in ipv4_default_advmss() Eric Dumazet
@ 2025-01-31 18:51   ` Kuniyuki Iwashima
  0 siblings, 0 replies; 35+ messages in thread
From: Kuniyuki Iwashima @ 2025-01-31 18:51 UTC (permalink / raw)
  To: edumazet; +Cc: davem, eric.dumazet, horms, kuba, kuniyu, netdev, pabeni

From: Eric Dumazet <edumazet@google.com>
Date: Fri, 31 Jan 2025 17:13:22 +0000
> ipv4_default_advmss() must use RCU protection to make
> sure the net structure it reads does not disappear.
> 
> Fixes: 2e9589ff809e ("ipv4: Namespaceify min_adv_mss sysctl knob")
> Signed-off-by: Eric Dumazet <edumazet@google.com>

Reviewed-by: Kuniyuki Iwashima <kuniyu@amazon.com>

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: [PATCH net 05/16] ipv4: use RCU protection in rt_is_expired()
  2025-01-31 17:13 ` [PATCH net 05/16] ipv4: use RCU protection in rt_is_expired() Eric Dumazet
@ 2025-01-31 19:00   ` Kuniyuki Iwashima
  0 siblings, 0 replies; 35+ messages in thread
From: Kuniyuki Iwashima @ 2025-01-31 19:00 UTC (permalink / raw)
  To: edumazet; +Cc: davem, eric.dumazet, horms, kuba, kuniyu, netdev, pabeni

From: Eric Dumazet <edumazet@google.com>
Date: Fri, 31 Jan 2025 17:13:23 +0000
> rt_is_expired() must use RCU protection to make
> sure the net structure it reads does not disappear.
> 
> Signed-off-by: Eric Dumazet <edumazet@google.com>

Reviewed-by: Kuniyuki Iwashima <kuniyu@amazon.com>

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: [PATCH net 06/16] tcp: convert to dev_net_rcu()
  2025-01-31 17:13 ` [PATCH net 06/16] tcp: convert to dev_net_rcu() Eric Dumazet
@ 2025-01-31 19:03   ` Kuniyuki Iwashima
  0 siblings, 0 replies; 35+ messages in thread
From: Kuniyuki Iwashima @ 2025-01-31 19:03 UTC (permalink / raw)
  To: edumazet; +Cc: davem, eric.dumazet, horms, kuba, kuniyu, netdev, pabeni

From: Eric Dumazet <edumazet@google.com>
Date: Fri, 31 Jan 2025 17:13:24 +0000
> TCP uses of dev_net() are safe, change them to dev_net_rcu()
> to get LOCKDEP support.
> 
> Signed-off-by: Eric Dumazet <edumazet@google.com>

Reviewed-by: Kuniyuki Iwashima <kuniyu@amazon.com>

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: [PATCH net 07/16] net: gro: convert four dev_net() calls
  2025-01-31 17:13 ` [PATCH net 07/16] net: gro: convert four dev_net() calls Eric Dumazet
@ 2025-01-31 19:05   ` Kuniyuki Iwashima
  0 siblings, 0 replies; 35+ messages in thread
From: Kuniyuki Iwashima @ 2025-01-31 19:05 UTC (permalink / raw)
  To: edumazet; +Cc: davem, eric.dumazet, horms, kuba, kuniyu, netdev, pabeni

From: Eric Dumazet <edumazet@google.com>
Date: Fri, 31 Jan 2025 17:13:25 +0000
> tcp4_check_fraglist_gro(), tcp6_check_fraglist_gro(),
> udp4_gro_lookup_skb() and udp6_gro_lookup_skb()
> assume RCU is held so that the net structure does not disappear.
> 
> Use dev_net_rcu() instead of dev_net() to get LOCKDEP support.
> 
> Signed-off-by: Eric Dumazet <edumazet@google.com>

Reviewed-by: Kuniyuki Iwashima <kuniyu@amazon.com>

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: [PATCH net 08/16] udp: convert to dev_net_rcu()
  2025-01-31 17:13 ` [PATCH net 08/16] udp: convert to dev_net_rcu() Eric Dumazet
@ 2025-01-31 19:10   ` Kuniyuki Iwashima
  2025-02-03  9:33     ` Eric Dumazet
  0 siblings, 1 reply; 35+ messages in thread
From: Kuniyuki Iwashima @ 2025-01-31 19:10 UTC (permalink / raw)
  To: edumazet; +Cc: davem, eric.dumazet, horms, kuba, kuniyu, netdev, pabeni

From: Eric Dumazet <edumazet@google.com>
Date: Fri, 31 Jan 2025 17:13:26 +0000
> TCP uses of dev_net() are safe, change them to dev_net_rcu()

s/TCP/UDP/

> to get LOCKDEP support.
> 
> Signed-off-by: Eric Dumazet <edumazet@google.com>

Reviewed-by: Kuniyuki Iwashima <kuniyu@amazon.com>


[...]
> @@ -1072,7 +1072,7 @@ int __udp6_lib_rcv(struct sk_buff *skb, struct udp_table *udptable,
>  {
>  	enum skb_drop_reason reason = SKB_DROP_REASON_NOT_SPECIFIED;
>  	const struct in6_addr *saddr, *daddr;
> -	struct net *net = dev_net(skb->dev);
> +	struct net *net = dev_net_rcu(skb->dev);

if v2 is needed for chagelog, this line is longer than saddr/daddr one.


>  	struct sock *sk = NULL;
>  	struct udphdr *uh;
>  	bool refcounted;

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: [PATCH net 09/16] ipv4: icmp: convert to dev_net_rcu()
  2025-01-31 17:13 ` [PATCH net 09/16] ipv4: icmp: " Eric Dumazet
@ 2025-01-31 19:12   ` Kuniyuki Iwashima
  0 siblings, 0 replies; 35+ messages in thread
From: Kuniyuki Iwashima @ 2025-01-31 19:12 UTC (permalink / raw)
  To: edumazet; +Cc: davem, eric.dumazet, horms, kuba, kuniyu, netdev, pabeni

From: Eric Dumazet <edumazet@google.com>
Date: Fri, 31 Jan 2025 17:13:27 +0000
> ICMP uses of dev_net() are safe, change them to dev_net_rcu()
> to get LOCKDEP support.
> 
> Signed-off-by: Eric Dumazet <edumazet@google.com>

Reviewed-by: Kuniyuki Iwashima <kuniyu@amazon.com>

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: [PATCH net 10/16] ipv6: icmp: convert to dev_net_rcu()
  2025-01-31 17:13 ` [PATCH net 10/16] ipv6: " Eric Dumazet
@ 2025-01-31 19:15   ` Kuniyuki Iwashima
  0 siblings, 0 replies; 35+ messages in thread
From: Kuniyuki Iwashima @ 2025-01-31 19:15 UTC (permalink / raw)
  To: edumazet; +Cc: davem, eric.dumazet, horms, kuba, kuniyu, netdev, pabeni

From: Eric Dumazet <edumazet@google.com>
Date: Fri, 31 Jan 2025 17:13:28 +0000
> ICMP uses of dev_net() are safe, change them to dev_net_rcu()
> to get LOCKDEP support.
> 
> Signed-off-by: Eric Dumazet <edumazet@google.com>

Reviewed-by: Kuniyuki Iwashima <kuniyu@amazon.com>

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: [PATCH net 11/16] ipv6: input: convert to dev_net_rcu()
  2025-01-31 17:13 ` [PATCH net 11/16] ipv6: input: " Eric Dumazet
@ 2025-01-31 19:21   ` Kuniyuki Iwashima
  0 siblings, 0 replies; 35+ messages in thread
From: Kuniyuki Iwashima @ 2025-01-31 19:21 UTC (permalink / raw)
  To: edumazet; +Cc: davem, eric.dumazet, horms, kuba, kuniyu, netdev, pabeni

From: Eric Dumazet <edumazet@google.com>
Date: Fri, 31 Jan 2025 17:13:29 +0000
> dev_net() calls from net/ipv6/ip6_input.c seem to
> happen under RCU protection.
> 
> Convert them to dev_net_rcu() to ensure LOCKDEP support.
> 
> Signed-off-by: Eric Dumazet <edumazet@google.com>

Reviewed-by: Kuniyuki Iwashima <kuniyu@amazon.com>

^ permalink raw reply	[flat|nested] 35+ messages in thread

* [PATCH net 12/16] ipv6: output: convert to dev_net_rcu()
  2025-01-31 17:13 ` [PATCH net 12/16] ipv6: output: " Eric Dumazet
@ 2025-01-31 19:26   ` Kuniyuki Iwashima
  0 siblings, 0 replies; 35+ messages in thread
From: Kuniyuki Iwashima @ 2025-01-31 19:26 UTC (permalink / raw)
  To: edumazet; +Cc: davem, eric.dumazet, horms, kuba, kuniyu, netdev, pabeni

From: Eric Dumazet <edumazet@google.com>
Date: Fri, 31 Jan 2025 17:13:30 +0000
> dev_net() calls from net/ipv6/ip6_output.c
> and net/ipv6/output_core.c are happening under RCU
> protection.
> 
> Convert them to dev_net_rcu() to ensure LOCKDEP support.
> 
> Signed-off-by: Eric Dumazet <edumazet@google.com>

Reviewed-by: Kuniyuki Iwashima <kuniyu@amazon.com>

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: [PATCH net 13/16] ipv6: use RCU protection in ip6_default_advmss()
  2025-01-31 17:13 ` [PATCH net 13/16] ipv6: use RCU protection in ip6_default_advmss() Eric Dumazet
@ 2025-01-31 19:35   ` Kuniyuki Iwashima
  0 siblings, 0 replies; 35+ messages in thread
From: Kuniyuki Iwashima @ 2025-01-31 19:35 UTC (permalink / raw)
  To: edumazet; +Cc: davem, eric.dumazet, horms, kuba, kuniyu, netdev, pabeni

From: Eric Dumazet <edumazet@google.com>
Date: Fri, 31 Jan 2025 17:13:31 +0000
> ip6_default_advmss() needs rcu protection to make
> sure the net structure it reads does not disappear.
> 
> Signed-off-by: Eric Dumazet <edumazet@google.com>

Reviewed-by: Kuniyuki Iwashima <kuniyu@amazon.com>

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: [PATCH net 14/16] net: filter: convert to dev_net_rcu()
  2025-01-31 17:13 ` [PATCH net 14/16] net: filter: convert to dev_net_rcu() Eric Dumazet
@ 2025-01-31 19:37   ` Kuniyuki Iwashima
  0 siblings, 0 replies; 35+ messages in thread
From: Kuniyuki Iwashima @ 2025-01-31 19:37 UTC (permalink / raw)
  To: edumazet; +Cc: davem, eric.dumazet, horms, kuba, kuniyu, netdev, pabeni

From: Eric Dumazet <edumazet@google.com>
Date: Fri, 31 Jan 2025 17:13:32 +0000
> 
> All calls to dev_net() from net/core/filter.c are currently
> done under rcu_read_lock().
> 
> Convert them to dev_net_rcu() to ensure LOCKDEP support.
> 
> Signed-off-by: Eric Dumazet <edumazet@google.com>

Reviewed-by: Kuniyuki Iwashima <kuniyu@amazon.com>

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: [PATCH net 15/16] flow_dissector: use rcu protection to fetch dev_net()
  2025-01-31 17:13 ` [PATCH net 15/16] flow_dissector: use rcu protection to fetch dev_net() Eric Dumazet
@ 2025-01-31 19:46   ` Kuniyuki Iwashima
  2025-02-03 10:09     ` Eric Dumazet
  0 siblings, 1 reply; 35+ messages in thread
From: Kuniyuki Iwashima @ 2025-01-31 19:46 UTC (permalink / raw)
  To: edumazet; +Cc: davem, eric.dumazet, horms, kuba, kuniyu, netdev, pabeni

From: Eric Dumazet <edumazet@google.com>
Date: Fri, 31 Jan 2025 17:13:33 +0000
> __skb_flow_dissect() can be called from arbitrary contexts.
> 
> It must extend its rcu protection section to include
> the call to dev_net(), which can become dev_net_rcu().
> 
> This makes sure the net structure can not disappear under us.
> 
> Fixes: 3cbf4ffba5ee ("net: plumb network namespace into __skb_flow_dissect")

The correct tag seems to be

  Fixes: 9b52e3f267a6 ("flow_dissector: handle no-skb use case")

, which moves dev_net() out of rcu_read_lock().

otherwise looks good to me

Reviewed-by: Kuniyuki Iwashima <kuniyu@amazon.com>


^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: [PATCH net 00/16] net: first round to use dev_net_rcu()
  2025-01-31 17:13 [PATCH net 00/16] net: first round to use dev_net_rcu() Eric Dumazet
                   ` (14 preceding siblings ...)
  2025-01-31 17:13 ` [PATCH net 15/16] flow_dissector: use rcu protection to fetch dev_net() Eric Dumazet
@ 2025-02-02  2:18 ` Jakub Kicinski
  2025-02-03 10:12   ` Eric Dumazet
  15 siblings, 1 reply; 35+ messages in thread
From: Jakub Kicinski @ 2025-02-02  2:18 UTC (permalink / raw)
  To: Eric Dumazet
  Cc: David S . Miller, Paolo Abeni, netdev, Kuniyuki Iwashima,
	Simon Horman, eric.dumazet

On Fri, 31 Jan 2025 17:13:18 +0000 Eric Dumazet wrote:
>   ipv4: use RCU protection in inet_select_addr()

patchwork thinks it's an incomplete series due to lack of this patch 
on the list. I'm afraid a repost will be needed :(
-- 
pw-bot: cr

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: [PATCH net 08/16] udp: convert to dev_net_rcu()
  2025-01-31 19:10   ` Kuniyuki Iwashima
@ 2025-02-03  9:33     ` Eric Dumazet
  0 siblings, 0 replies; 35+ messages in thread
From: Eric Dumazet @ 2025-02-03  9:33 UTC (permalink / raw)
  To: Kuniyuki Iwashima; +Cc: davem, eric.dumazet, horms, kuba, netdev, pabeni

On Fri, Jan 31, 2025 at 8:10 PM Kuniyuki Iwashima <kuniyu@amazon.com> wrote:
>
> From: Eric Dumazet <edumazet@google.com>
> Date: Fri, 31 Jan 2025 17:13:26 +0000
> > TCP uses of dev_net() are safe, change them to dev_net_rcu()
>
> s/TCP/UDP/
>
> > to get LOCKDEP support.
> >
> > Signed-off-by: Eric Dumazet <edumazet@google.com>
>
> Reviewed-by: Kuniyuki Iwashima <kuniyu@amazon.com>
>
>
> [...]
> > @@ -1072,7 +1072,7 @@ int __udp6_lib_rcv(struct sk_buff *skb, struct udp_table *udptable,
> >  {
> >       enum skb_drop_reason reason = SKB_DROP_REASON_NOT_SPECIFIED;
> >       const struct in6_addr *saddr, *daddr;
> > -     struct net *net = dev_net(skb->dev);
> > +     struct net *net = dev_net_rcu(skb->dev);
>
> if v2 is needed for chagelog, this line is longer than saddr/daddr one.

ACK, I will change this in v2.

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: [PATCH net 15/16] flow_dissector: use rcu protection to fetch dev_net()
  2025-01-31 19:46   ` Kuniyuki Iwashima
@ 2025-02-03 10:09     ` Eric Dumazet
  0 siblings, 0 replies; 35+ messages in thread
From: Eric Dumazet @ 2025-02-03 10:09 UTC (permalink / raw)
  To: Kuniyuki Iwashima; +Cc: davem, eric.dumazet, horms, kuba, netdev, pabeni

On Fri, Jan 31, 2025 at 8:46 PM Kuniyuki Iwashima <kuniyu@amazon.com> wrote:
>
> From: Eric Dumazet <edumazet@google.com>
> Date: Fri, 31 Jan 2025 17:13:33 +0000
> > __skb_flow_dissect() can be called from arbitrary contexts.
> >
> > It must extend its rcu protection section to include
> > the call to dev_net(), which can become dev_net_rcu().
> >
> > This makes sure the net structure can not disappear under us.
> >
> > Fixes: 3cbf4ffba5ee ("net: plumb network namespace into __skb_flow_dissect")
>
> The correct tag seems to be
>
>   Fixes: 9b52e3f267a6 ("flow_dissector: handle no-skb use case")

Yes, you are correct, thanks !

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: [PATCH net 00/16] net: first round to use dev_net_rcu()
  2025-02-02  2:18 ` [PATCH net 00/16] net: first round to use dev_net_rcu() Jakub Kicinski
@ 2025-02-03 10:12   ` Eric Dumazet
  0 siblings, 0 replies; 35+ messages in thread
From: Eric Dumazet @ 2025-02-03 10:12 UTC (permalink / raw)
  To: Jakub Kicinski
  Cc: David S . Miller, Paolo Abeni, netdev, Kuniyuki Iwashima,
	Simon Horman, eric.dumazet

On Sun, Feb 2, 2025 at 3:18 AM Jakub Kicinski <kuba@kernel.org> wrote:
>
> On Fri, 31 Jan 2025 17:13:18 +0000 Eric Dumazet wrote:
> >   ipv4: use RCU protection in inet_select_addr()
>
> patchwork thinks it's an incomplete series due to lack of this patch
> on the list. I'm afraid a repost will be needed :(

Interesting, I wonder what happened...

I will send a v2, here what it looks like:

commit 52a1dc65d01230876fbacc7f8fe63ee7a758603f (HEAD)
Author: Eric Dumazet <edumazet@google.com>
Date:   Fri Jan 31 16:47:50 2025 +0000

    ipv4: use RCU protection in inet_select_addr()

    inet_select_addr() must use RCU protection to make
    sure the net structure it reads does not disappear.

    Fixes: c4544c724322 ("[NETNS]: Process inet_select_addr inside a
namespace.")
    Signed-off-by: Eric Dumazet <edumazet@google.com>

diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c
index c8b3cf5fba4c02941b919687a6a657cf68f5f99a..55b8151759bc9f76ebdbfae27544d6ee666a4809
100644
--- a/net/ipv4/devinet.c
+++ b/net/ipv4/devinet.c
@@ -1371,10 +1371,11 @@ __be32 inet_select_addr(const struct
net_device *dev, __be32 dst, int scope)
        __be32 addr = 0;
        unsigned char localnet_scope = RT_SCOPE_HOST;
        struct in_device *in_dev;
-       struct net *net = dev_net(dev);
+       struct net *net;
        int master_idx;

        rcu_read_lock();
+       net = dev_net_rcu(dev);
        in_dev = __in_dev_get_rcu(dev);
        if (!in_dev)
                goto no_in_dev;

^ permalink raw reply	[flat|nested] 35+ messages in thread

end of thread, other threads:[~2025-02-03 10:12 UTC | newest]

Thread overview: 35+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-01-31 17:13 [PATCH net 00/16] net: first round to use dev_net_rcu() Eric Dumazet
2025-01-31 17:13 ` [PATCH net 01/16] net: add dev_net_rcu() helper Eric Dumazet
2025-01-31 18:29   ` Kuniyuki Iwashima
2025-01-31 17:13 ` [PATCH net 02/16] ipv4: add RCU protection to ip4_dst_hoplimit() Eric Dumazet
2025-01-31 18:34   ` Kuniyuki Iwashima
2025-01-31 17:13 ` [PATCH net 03/16] ipv4: use RCU protection in ip_dst_mtu_maybe_forward() Eric Dumazet
2025-01-31 18:47   ` Kuniyuki Iwashima
2025-01-31 17:13 ` [PATCH net 04/16] ipv4: use RCU protection in ipv4_default_advmss() Eric Dumazet
2025-01-31 18:51   ` Kuniyuki Iwashima
2025-01-31 17:13 ` [PATCH net 05/16] ipv4: use RCU protection in rt_is_expired() Eric Dumazet
2025-01-31 19:00   ` Kuniyuki Iwashima
2025-01-31 17:13 ` [PATCH net 06/16] tcp: convert to dev_net_rcu() Eric Dumazet
2025-01-31 19:03   ` Kuniyuki Iwashima
2025-01-31 17:13 ` [PATCH net 07/16] net: gro: convert four dev_net() calls Eric Dumazet
2025-01-31 19:05   ` Kuniyuki Iwashima
2025-01-31 17:13 ` [PATCH net 08/16] udp: convert to dev_net_rcu() Eric Dumazet
2025-01-31 19:10   ` Kuniyuki Iwashima
2025-02-03  9:33     ` Eric Dumazet
2025-01-31 17:13 ` [PATCH net 09/16] ipv4: icmp: " Eric Dumazet
2025-01-31 19:12   ` Kuniyuki Iwashima
2025-01-31 17:13 ` [PATCH net 10/16] ipv6: " Eric Dumazet
2025-01-31 19:15   ` Kuniyuki Iwashima
2025-01-31 17:13 ` [PATCH net 11/16] ipv6: input: " Eric Dumazet
2025-01-31 19:21   ` Kuniyuki Iwashima
2025-01-31 17:13 ` [PATCH net 12/16] ipv6: output: " Eric Dumazet
2025-01-31 19:26   ` Kuniyuki Iwashima
2025-01-31 17:13 ` [PATCH net 13/16] ipv6: use RCU protection in ip6_default_advmss() Eric Dumazet
2025-01-31 19:35   ` Kuniyuki Iwashima
2025-01-31 17:13 ` [PATCH net 14/16] net: filter: convert to dev_net_rcu() Eric Dumazet
2025-01-31 19:37   ` Kuniyuki Iwashima
2025-01-31 17:13 ` [PATCH net 15/16] flow_dissector: use rcu protection to fetch dev_net() Eric Dumazet
2025-01-31 19:46   ` Kuniyuki Iwashima
2025-02-03 10:09     ` Eric Dumazet
2025-02-02  2:18 ` [PATCH net 00/16] net: first round to use dev_net_rcu() Jakub Kicinski
2025-02-03 10:12   ` Eric Dumazet

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).