* [PATCH v4 net 00/12] net: first round to use dev_net_rcu()
@ 2025-02-05 15:51 Eric Dumazet
2025-02-05 15:51 ` [PATCH v4 net 01/12] net: add dev_net_rcu() helper Eric Dumazet
` (12 more replies)
0 siblings, 13 replies; 14+ messages in thread
From: Eric Dumazet @ 2025-02-05 15:51 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() for rcu_read_lock() contexts
and start to use it to fix bugs and clearly document the
safety requirements.
v4: Shrink the series to limit number of potential iterations.
Fix ip6_input() in a separate patch.
Link: https://lore.kernel.org/netdev/CANn89i+AozhFhZNK0Y4e_EqXV1=yKjGuvf43Wa6JJKWMOixWQQ@mail.gmail.com/
v3: Rework patches 9 and 10 after Jakub feedback.
Link: https://lore.kernel.org/netdev/20250203153633.46ce0337@kernel.org/
Added some missing Fixes tags.
v2: Resend (one patch missed v1 train), plus minor fixes.
Eric Dumazet (12):
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()
ipv4: use RCU protection in inet_select_addr()
ipv4: use RCU protection in __ip_rt_update_pmtu()
ipv4: icmp: convert to dev_net_rcu()
flow_dissector: use RCU protection to fetch dev_net()
ipv6: use RCU protection in ip6_default_advmss()
ipv6: icmp: convert to dev_net_rcu()
ipv6: Use RCU in ip6_input()
include/linux/netdevice.h | 6 ++++++
include/net/ip.h | 13 +++++++++---
include/net/net_namespace.h | 2 +-
include/net/route.h | 9 ++++++--
net/core/flow_dissector.c | 21 ++++++++++---------
net/ipv4/devinet.c | 3 ++-
net/ipv4/icmp.c | 31 ++++++++++++++-------------
net/ipv4/route.c | 30 ++++++++++++++++++--------
net/ipv6/icmp.c | 42 ++++++++++++++++++++-----------------
net/ipv6/ip6_input.c | 14 ++++++++-----
net/ipv6/route.c | 7 ++++++-
11 files changed, 113 insertions(+), 65 deletions(-)
--
2.48.1.362.g079036d154-goog
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v4 net 01/12] net: add dev_net_rcu() helper
2025-02-05 15:51 [PATCH v4 net 00/12] net: first round to use dev_net_rcu() Eric Dumazet
@ 2025-02-05 15:51 ` Eric Dumazet
2025-02-05 15:51 ` [PATCH v4 net 02/12] ipv4: add RCU protection to ip4_dst_hoplimit() Eric Dumazet
` (11 subsequent siblings)
12 siblings, 0 replies; 14+ messages in thread
From: Eric Dumazet @ 2025-02-05 15:51 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>
Reviewed-by: Kuniyuki Iwashima <kuniyu@amazon.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 03bb584c62cf8a920b12c673dcc438eb1cc41499..c0a86afb85daa2b50e26a1ca238707a24a1842ad 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] 14+ messages in thread
* [PATCH v4 net 02/12] ipv4: add RCU protection to ip4_dst_hoplimit()
2025-02-05 15:51 [PATCH v4 net 00/12] net: first round to use dev_net_rcu() Eric Dumazet
2025-02-05 15:51 ` [PATCH v4 net 01/12] net: add dev_net_rcu() helper Eric Dumazet
@ 2025-02-05 15:51 ` Eric Dumazet
2025-02-05 15:51 ` [PATCH v4 net 03/12] ipv4: use RCU protection in ip_dst_mtu_maybe_forward() Eric Dumazet
` (10 subsequent siblings)
12 siblings, 0 replies; 14+ messages in thread
From: Eric Dumazet @ 2025-02-05 15:51 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>
Reviewed-by: Kuniyuki Iwashima <kuniyu@amazon.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] 14+ messages in thread
* [PATCH v4 net 03/12] ipv4: use RCU protection in ip_dst_mtu_maybe_forward()
2025-02-05 15:51 [PATCH v4 net 00/12] net: first round to use dev_net_rcu() Eric Dumazet
2025-02-05 15:51 ` [PATCH v4 net 01/12] net: add dev_net_rcu() helper Eric Dumazet
2025-02-05 15:51 ` [PATCH v4 net 02/12] ipv4: add RCU protection to ip4_dst_hoplimit() Eric Dumazet
@ 2025-02-05 15:51 ` Eric Dumazet
2025-02-05 15:51 ` [PATCH v4 net 04/12] ipv4: use RCU protection in ipv4_default_advmss() Eric Dumazet
` (9 subsequent siblings)
12 siblings, 0 replies; 14+ messages in thread
From: Eric Dumazet @ 2025-02-05 15:51 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>
Reviewed-by: Kuniyuki Iwashima <kuniyu@amazon.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] 14+ messages in thread
* [PATCH v4 net 04/12] ipv4: use RCU protection in ipv4_default_advmss()
2025-02-05 15:51 [PATCH v4 net 00/12] net: first round to use dev_net_rcu() Eric Dumazet
` (2 preceding siblings ...)
2025-02-05 15:51 ` [PATCH v4 net 03/12] ipv4: use RCU protection in ip_dst_mtu_maybe_forward() Eric Dumazet
@ 2025-02-05 15:51 ` Eric Dumazet
2025-02-05 15:51 ` [PATCH v4 net 05/12] ipv4: use RCU protection in rt_is_expired() Eric Dumazet
` (8 subsequent siblings)
12 siblings, 0 replies; 14+ messages in thread
From: Eric Dumazet @ 2025-02-05 15:51 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>
Reviewed-by: Kuniyuki Iwashima <kuniyu@amazon.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] 14+ messages in thread
* [PATCH v4 net 05/12] ipv4: use RCU protection in rt_is_expired()
2025-02-05 15:51 [PATCH v4 net 00/12] net: first round to use dev_net_rcu() Eric Dumazet
` (3 preceding siblings ...)
2025-02-05 15:51 ` [PATCH v4 net 04/12] ipv4: use RCU protection in ipv4_default_advmss() Eric Dumazet
@ 2025-02-05 15:51 ` Eric Dumazet
2025-02-05 15:51 ` [PATCH v4 net 06/12] ipv4: use RCU protection in inet_select_addr() Eric Dumazet
` (7 subsequent siblings)
12 siblings, 0 replies; 14+ messages in thread
From: Eric Dumazet @ 2025-02-05 15:51 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.
Fixes: e84f84f27647 ("netns: place rt_genid into struct net")
Signed-off-by: Eric Dumazet <edumazet@google.com>
Reviewed-by: Kuniyuki Iwashima <kuniyu@amazon.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] 14+ messages in thread
* [PATCH v4 net 06/12] ipv4: use RCU protection in inet_select_addr()
2025-02-05 15:51 [PATCH v4 net 00/12] net: first round to use dev_net_rcu() Eric Dumazet
` (4 preceding siblings ...)
2025-02-05 15:51 ` [PATCH v4 net 05/12] ipv4: use RCU protection in rt_is_expired() Eric Dumazet
@ 2025-02-05 15:51 ` Eric Dumazet
2025-02-05 15:51 ` [PATCH v4 net 07/12] ipv4: use RCU protection in __ip_rt_update_pmtu() Eric Dumazet
` (6 subsequent siblings)
12 siblings, 0 replies; 14+ messages in thread
From: Eric Dumazet @ 2025-02-05 15:51 UTC (permalink / raw)
To: David S . Miller, Jakub Kicinski, Paolo Abeni
Cc: netdev, Kuniyuki Iwashima, Simon Horman, eric.dumazet,
Eric Dumazet
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>
---
net/ipv4/devinet.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
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;
--
2.48.1.362.g079036d154-goog
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v4 net 07/12] ipv4: use RCU protection in __ip_rt_update_pmtu()
2025-02-05 15:51 [PATCH v4 net 00/12] net: first round to use dev_net_rcu() Eric Dumazet
` (5 preceding siblings ...)
2025-02-05 15:51 ` [PATCH v4 net 06/12] ipv4: use RCU protection in inet_select_addr() Eric Dumazet
@ 2025-02-05 15:51 ` Eric Dumazet
2025-02-05 15:51 ` [PATCH v4 net 08/12] ipv4: icmp: convert to dev_net_rcu() Eric Dumazet
` (5 subsequent siblings)
12 siblings, 0 replies; 14+ messages in thread
From: Eric Dumazet @ 2025-02-05 15:51 UTC (permalink / raw)
To: David S . Miller, Jakub Kicinski, Paolo Abeni
Cc: netdev, Kuniyuki Iwashima, Simon Horman, eric.dumazet,
Eric Dumazet
__ip_rt_update_pmtu() must use RCU protection to make
sure the net structure it reads does not disappear.
Fixes: 2fbc6e89b2f1 ("ipv4: Update exception handling for multipath routes via same device")
Fixes: 1de6b15a434c ("Namespaceify min_pmtu sysctl")
Signed-off-by: Eric Dumazet <edumazet@google.com>
---
net/ipv4/route.c | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/net/ipv4/route.c b/net/ipv4/route.c
index e959327c0ba8979ce5c7ca8c46ae41068824edc6..753704f75b2c65d79c9c4dc19a329de5cdbd8514 100644
--- a/net/ipv4/route.c
+++ b/net/ipv4/route.c
@@ -1008,9 +1008,9 @@ out: kfree_skb_reason(skb, reason);
static void __ip_rt_update_pmtu(struct rtable *rt, struct flowi4 *fl4, u32 mtu)
{
struct dst_entry *dst = &rt->dst;
- struct net *net = dev_net(dst->dev);
struct fib_result res;
bool lock = false;
+ struct net *net;
u32 old_mtu;
if (ip_mtu_locked(dst))
@@ -1020,6 +1020,8 @@ static void __ip_rt_update_pmtu(struct rtable *rt, struct flowi4 *fl4, u32 mtu)
if (old_mtu < mtu)
return;
+ rcu_read_lock();
+ net = dev_net_rcu(dst->dev);
if (mtu < net->ipv4.ip_rt_min_pmtu) {
lock = true;
mtu = min(old_mtu, net->ipv4.ip_rt_min_pmtu);
@@ -1027,9 +1029,8 @@ static void __ip_rt_update_pmtu(struct rtable *rt, struct flowi4 *fl4, u32 mtu)
if (rt->rt_pmtu == mtu && !lock &&
time_before(jiffies, dst->expires - net->ipv4.ip_rt_mtu_expires / 2))
- return;
+ goto out;
- rcu_read_lock();
if (fib_lookup(net, fl4, &res, 0) == 0) {
struct fib_nh_common *nhc;
@@ -1043,14 +1044,14 @@ static void __ip_rt_update_pmtu(struct rtable *rt, struct flowi4 *fl4, u32 mtu)
update_or_create_fnhe(nhc, fl4->daddr, 0, mtu, lock,
jiffies + net->ipv4.ip_rt_mtu_expires);
}
- rcu_read_unlock();
- return;
+ goto out;
}
#endif /* CONFIG_IP_ROUTE_MULTIPATH */
nhc = FIB_RES_NHC(res);
update_or_create_fnhe(nhc, fl4->daddr, 0, mtu, lock,
jiffies + net->ipv4.ip_rt_mtu_expires);
}
+out:
rcu_read_unlock();
}
--
2.48.1.362.g079036d154-goog
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v4 net 08/12] ipv4: icmp: convert to dev_net_rcu()
2025-02-05 15:51 [PATCH v4 net 00/12] net: first round to use dev_net_rcu() Eric Dumazet
` (6 preceding siblings ...)
2025-02-05 15:51 ` [PATCH v4 net 07/12] ipv4: use RCU protection in __ip_rt_update_pmtu() Eric Dumazet
@ 2025-02-05 15:51 ` Eric Dumazet
2025-02-05 15:51 ` [PATCH v4 net 09/12] flow_dissector: use RCU protection to fetch dev_net() Eric Dumazet
` (4 subsequent siblings)
12 siblings, 0 replies; 14+ messages in thread
From: Eric Dumazet @ 2025-02-05 15:51 UTC (permalink / raw)
To: David S . Miller, Jakub Kicinski, Paolo Abeni
Cc: netdev, Kuniyuki Iwashima, Simon Horman, eric.dumazet,
Eric Dumazet
__icmp_send() must ensure rcu_read_lock() is held, as spotted
by Jakub.
Other ICMP uses of dev_net() seem safe, change them to dev_net_rcu()
to get LOCKDEP support.
Fixes: dde1bc0e6f86 ("[NETNS]: Add namespace for ICMP replying code.")
Closes: https://lore.kernel.org/netdev/20250203153633.46ce0337@kernel.org/
Reported-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Eric Dumazet <edumazet@google.com>
---
net/ipv4/icmp.c | 31 +++++++++++++++++--------------
1 file changed, 17 insertions(+), 14 deletions(-)
diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c
index 094084b61bff8a17c4e85c99019b84e9cba21599..5482edb5aade2bc25a39d75ab16feba476bb08ac 100644
--- a/net/ipv4/icmp.c
+++ b/net/ipv4/icmp.c
@@ -399,10 +399,10 @@ static void icmp_push_reply(struct sock *sk,
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 ipcm_cookie ipc;
struct flowi4 fl4;
struct sock *sk;
struct inet_sock *inet;
@@ -608,12 +608,14 @@ void __icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info,
struct sock *sk;
if (!rt)
- goto out;
+ return;
+
+ rcu_read_lock();
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;
@@ -785,7 +787,8 @@ void __icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info,
icmp_xmit_unlock(sk);
out_bh_enable:
local_bh_enable();
-out:;
+out:
+ rcu_read_unlock();
}
EXPORT_SYMBOL(__icmp_send);
@@ -834,7 +837,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 +871,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 +982,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 +1014,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 +1043,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 +1184,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 +1201,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 +1374,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] 14+ messages in thread
* [PATCH v4 net 09/12] flow_dissector: use RCU protection to fetch dev_net()
2025-02-05 15:51 [PATCH v4 net 00/12] net: first round to use dev_net_rcu() Eric Dumazet
` (7 preceding siblings ...)
2025-02-05 15:51 ` [PATCH v4 net 08/12] ipv4: icmp: convert to dev_net_rcu() Eric Dumazet
@ 2025-02-05 15:51 ` Eric Dumazet
2025-02-05 15:51 ` [PATCH v4 net 10/12] ipv6: use RCU protection in ip6_default_advmss() Eric Dumazet
` (3 subsequent siblings)
12 siblings, 0 replies; 14+ messages in thread
From: Eric Dumazet @ 2025-02-05 15:51 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: 9b52e3f267a6 ("flow_dissector: handle no-skb use case")
Signed-off-by: Eric Dumazet <edumazet@google.com>
Reviewed-by: Kuniyuki Iwashima <kuniyu@amazon.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] 14+ messages in thread
* [PATCH v4 net 10/12] ipv6: use RCU protection in ip6_default_advmss()
2025-02-05 15:51 [PATCH v4 net 00/12] net: first round to use dev_net_rcu() Eric Dumazet
` (8 preceding siblings ...)
2025-02-05 15:51 ` [PATCH v4 net 09/12] flow_dissector: use RCU protection to fetch dev_net() Eric Dumazet
@ 2025-02-05 15:51 ` Eric Dumazet
2025-02-05 15:51 ` [PATCH v4 net 11/12] ipv6: icmp: convert to dev_net_rcu() Eric Dumazet
` (2 subsequent siblings)
12 siblings, 0 replies; 14+ messages in thread
From: Eric Dumazet @ 2025-02-05 15:51 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.
Fixes: 5578689a4e3c ("[NETNS][IPV6] route6 - make route6 per namespace")
Signed-off-by: Eric Dumazet <edumazet@google.com>
Reviewed-by: Kuniyuki Iwashima <kuniyu@amazon.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] 14+ messages in thread
* [PATCH v4 net 11/12] ipv6: icmp: convert to dev_net_rcu()
2025-02-05 15:51 [PATCH v4 net 00/12] net: first round to use dev_net_rcu() Eric Dumazet
` (9 preceding siblings ...)
2025-02-05 15:51 ` [PATCH v4 net 10/12] ipv6: use RCU protection in ip6_default_advmss() Eric Dumazet
@ 2025-02-05 15:51 ` Eric Dumazet
2025-02-05 15:51 ` [PATCH v4 net 12/12] ipv6: Use RCU in ip6_input() Eric Dumazet
2025-02-07 0:30 ` [PATCH v4 net 00/12] net: first round to use dev_net_rcu() patchwork-bot+netdevbpf
12 siblings, 0 replies; 14+ messages in thread
From: Eric Dumazet @ 2025-02-05 15:51 UTC (permalink / raw)
To: David S . Miller, Jakub Kicinski, Paolo Abeni
Cc: netdev, Kuniyuki Iwashima, Simon Horman, eric.dumazet,
Eric Dumazet
icmp6_send() must acquire rcu_read_lock() sooner to ensure
the dev_net() call done from a safe context.
Other ICMPv6 uses of dev_net() seem safe, change them to
dev_net_rcu() to get LOCKDEP support to catch bugs.
Fixes: 9a43b709a230 ("[NETNS][IPV6] icmp6 - make icmpv6_socket per namespace")
Signed-off-by: Eric Dumazet <edumazet@google.com>
---
net/ipv6/icmp.c | 42 +++++++++++++++++++++++-------------------
1 file changed, 23 insertions(+), 19 deletions(-)
diff --git a/net/ipv6/icmp.c b/net/ipv6/icmp.c
index a6984a29fdb9dd972a11ca9f8d5e794c443bac6f..4d14ab7f7e99f152cd5f5adaa023f0280957f275 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,10 @@ void icmp6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info,
if (!skb->dev)
return;
- net = dev_net(skb->dev);
+
+ rcu_read_lock();
+
+ net = dev_net_rcu(skb->dev);
mark = IP6_REPLY_MARK(net, skb->mark);
/*
* Make sure we respect the rules
@@ -496,7 +499,7 @@ void icmp6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info,
!(type == ICMPV6_PARAMPROB &&
code == ICMPV6_UNK_OPTION &&
(opt_unrec(skb, info))))
- return;
+ goto out;
saddr = NULL;
}
@@ -526,7 +529,7 @@ void icmp6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info,
if ((addr_type == IPV6_ADDR_ANY) || (addr_type & IPV6_ADDR_MULTICAST)) {
net_dbg_ratelimited("icmp6_send: addr_any/mcast source [%pI6c > %pI6c]\n",
&hdr->saddr, &hdr->daddr);
- return;
+ goto out;
}
/*
@@ -535,7 +538,7 @@ void icmp6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info,
if (is_ineligible(skb)) {
net_dbg_ratelimited("icmp6_send: no reply to icmp error [%pI6c > %pI6c]\n",
&hdr->saddr, &hdr->daddr);
- return;
+ goto out;
}
/* Needed by both icmpv6_global_allow and icmpv6_xmit_lock */
@@ -582,7 +585,7 @@ void icmp6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info,
np = inet6_sk(sk);
if (!icmpv6_xrlim_allow(sk, type, &fl6, apply_ratelimit))
- goto out;
+ goto out_unlock;
tmp_hdr.icmp6_type = type;
tmp_hdr.icmp6_code = code;
@@ -600,7 +603,7 @@ void icmp6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info,
dst = icmpv6_route_lookup(net, skb, sk, &fl6);
if (IS_ERR(dst))
- goto out;
+ goto out_unlock;
ipc6.hlimit = ip6_sk_dst_hoplimit(np, &fl6, dst);
@@ -616,7 +619,6 @@ void icmp6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info,
goto out_dst_release;
}
- rcu_read_lock();
idev = __in6_dev_get(skb->dev);
if (ip6_append_data(sk, icmpv6_getfrag, &msg,
@@ -630,13 +632,15 @@ void icmp6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info,
icmpv6_push_pending_frames(sk, &fl6, &tmp_hdr,
len + sizeof(struct icmp6hdr));
}
- rcu_read_unlock();
+
out_dst_release:
dst_release(dst);
-out:
+out_unlock:
icmpv6_xmit_unlock(sk);
out_bh_enable:
local_bh_enable();
+out:
+ rcu_read_unlock();
}
EXPORT_SYMBOL(icmp6_send);
@@ -679,8 +683,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 +721,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 +836,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 +893,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 +925,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 +943,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 +1038,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] 14+ messages in thread
* [PATCH v4 net 12/12] ipv6: Use RCU in ip6_input()
2025-02-05 15:51 [PATCH v4 net 00/12] net: first round to use dev_net_rcu() Eric Dumazet
` (10 preceding siblings ...)
2025-02-05 15:51 ` [PATCH v4 net 11/12] ipv6: icmp: convert to dev_net_rcu() Eric Dumazet
@ 2025-02-05 15:51 ` Eric Dumazet
2025-02-07 0:30 ` [PATCH v4 net 00/12] net: first round to use dev_net_rcu() patchwork-bot+netdevbpf
12 siblings, 0 replies; 14+ messages in thread
From: Eric Dumazet @ 2025-02-05 15:51 UTC (permalink / raw)
To: David S . Miller, Jakub Kicinski, Paolo Abeni
Cc: netdev, Kuniyuki Iwashima, Simon Horman, eric.dumazet,
Eric Dumazet
Instead of grabbing rcu_read_lock() from ip6_input_finish(),
do it earlier in is caller, so that ip6_input() access
to dev_net() can be validated by LOCKDEP.
Signed-off-by: Eric Dumazet <edumazet@google.com>
---
net/ipv6/ip6_input.c | 14 +++++++++-----
1 file changed, 9 insertions(+), 5 deletions(-)
diff --git a/net/ipv6/ip6_input.c b/net/ipv6/ip6_input.c
index 70c0e16c0ae6837d1c64d0036829c8b61799578b..39da6a7ce5f1245145dd74d4ac4eae63dd970939 100644
--- a/net/ipv6/ip6_input.c
+++ b/net/ipv6/ip6_input.c
@@ -477,9 +477,7 @@ void ip6_protocol_deliver_rcu(struct net *net, struct sk_buff *skb, int nexthdr,
static int ip6_input_finish(struct net *net, struct sock *sk, struct sk_buff *skb)
{
skb_clear_delivery_time(skb);
- rcu_read_lock();
ip6_protocol_deliver_rcu(net, skb, 0, false);
- rcu_read_unlock();
return 0;
}
@@ -487,9 +485,15 @@ 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,
- ip6_input_finish);
+ int res;
+
+ rcu_read_lock();
+ res = NF_HOOK(NFPROTO_IPV6, NF_INET_LOCAL_IN,
+ dev_net_rcu(skb->dev), NULL, skb, skb->dev, NULL,
+ ip6_input_finish);
+ rcu_read_unlock();
+
+ return res;
}
EXPORT_SYMBOL_GPL(ip6_input);
--
2.48.1.362.g079036d154-goog
^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCH v4 net 00/12] net: first round to use dev_net_rcu()
2025-02-05 15:51 [PATCH v4 net 00/12] net: first round to use dev_net_rcu() Eric Dumazet
` (11 preceding siblings ...)
2025-02-05 15:51 ` [PATCH v4 net 12/12] ipv6: Use RCU in ip6_input() Eric Dumazet
@ 2025-02-07 0:30 ` patchwork-bot+netdevbpf
12 siblings, 0 replies; 14+ messages in thread
From: patchwork-bot+netdevbpf @ 2025-02-07 0:30 UTC (permalink / raw)
To: Eric Dumazet; +Cc: davem, kuba, pabeni, netdev, kuniyu, horms, eric.dumazet
Hello:
This series was applied to netdev/net.git (main)
by Jakub Kicinski <kuba@kernel.org>:
On Wed, 5 Feb 2025 15:51:08 +0000 you wrote:
> 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() for rcu_read_lock() contexts
> and start to use it to fix bugs and clearly document the
> safety requirements.
>
> [...]
Here is the summary with links:
- [v4,net,01/12] net: add dev_net_rcu() helper
https://git.kernel.org/netdev/net/c/482ad2a4ace2
- [v4,net,02/12] ipv4: add RCU protection to ip4_dst_hoplimit()
https://git.kernel.org/netdev/net/c/469308552ca4
- [v4,net,03/12] ipv4: use RCU protection in ip_dst_mtu_maybe_forward()
https://git.kernel.org/netdev/net/c/071d8012869b
- [v4,net,04/12] ipv4: use RCU protection in ipv4_default_advmss()
https://git.kernel.org/netdev/net/c/71b8471c93fa
- [v4,net,05/12] ipv4: use RCU protection in rt_is_expired()
https://git.kernel.org/netdev/net/c/dd205fcc33d9
- [v4,net,06/12] ipv4: use RCU protection in inet_select_addr()
https://git.kernel.org/netdev/net/c/719817cd293e
- [v4,net,07/12] ipv4: use RCU protection in __ip_rt_update_pmtu()
https://git.kernel.org/netdev/net/c/139512191bd0
- [v4,net,08/12] ipv4: icmp: convert to dev_net_rcu()
https://git.kernel.org/netdev/net/c/4b8474a0951e
- [v4,net,09/12] flow_dissector: use RCU protection to fetch dev_net()
https://git.kernel.org/netdev/net/c/afec62cd0a41
- [v4,net,10/12] ipv6: use RCU protection in ip6_default_advmss()
https://git.kernel.org/netdev/net/c/3c8ffcd248da
- [v4,net,11/12] ipv6: icmp: convert to dev_net_rcu()
https://git.kernel.org/netdev/net/c/34aef2b0ce3a
- [v4,net,12/12] ipv6: Use RCU in ip6_input()
https://git.kernel.org/netdev/net/c/b768294d449d
You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html
^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2025-02-07 0:30 UTC | newest]
Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-02-05 15:51 [PATCH v4 net 00/12] net: first round to use dev_net_rcu() Eric Dumazet
2025-02-05 15:51 ` [PATCH v4 net 01/12] net: add dev_net_rcu() helper Eric Dumazet
2025-02-05 15:51 ` [PATCH v4 net 02/12] ipv4: add RCU protection to ip4_dst_hoplimit() Eric Dumazet
2025-02-05 15:51 ` [PATCH v4 net 03/12] ipv4: use RCU protection in ip_dst_mtu_maybe_forward() Eric Dumazet
2025-02-05 15:51 ` [PATCH v4 net 04/12] ipv4: use RCU protection in ipv4_default_advmss() Eric Dumazet
2025-02-05 15:51 ` [PATCH v4 net 05/12] ipv4: use RCU protection in rt_is_expired() Eric Dumazet
2025-02-05 15:51 ` [PATCH v4 net 06/12] ipv4: use RCU protection in inet_select_addr() Eric Dumazet
2025-02-05 15:51 ` [PATCH v4 net 07/12] ipv4: use RCU protection in __ip_rt_update_pmtu() Eric Dumazet
2025-02-05 15:51 ` [PATCH v4 net 08/12] ipv4: icmp: convert to dev_net_rcu() Eric Dumazet
2025-02-05 15:51 ` [PATCH v4 net 09/12] flow_dissector: use RCU protection to fetch dev_net() Eric Dumazet
2025-02-05 15:51 ` [PATCH v4 net 10/12] ipv6: use RCU protection in ip6_default_advmss() Eric Dumazet
2025-02-05 15:51 ` [PATCH v4 net 11/12] ipv6: icmp: convert to dev_net_rcu() Eric Dumazet
2025-02-05 15:51 ` [PATCH v4 net 12/12] ipv6: Use RCU in ip6_input() Eric Dumazet
2025-02-07 0:30 ` [PATCH v4 net 00/12] net: first round to use dev_net_rcu() patchwork-bot+netdevbpf
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).