From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F2E2F376A19 for ; Tue, 1 Sep 2026 11:11:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788261079; cv=none; b=T2f3LrRJJZan3YIQLAJAs/bmOWlBMejcSm0yWzJCKFm0vqjf7b0n0NsxHHyG8mMGo4zs+TCH/209ZhwVK4xm7enOipzO0lj3lfAgBa+/rED+g2B9czMaPZaWZ8hdm+HojSmQG5KwImavEyhblPFcdup17bNnv+gAM786DHhH31k= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788261079; c=relaxed/simple; bh=09593IHtpPFnypYVi5+KXrGNH24wGcSaNXJISvNf7YE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=jbgKngopuyG+Ztx+Ys+cORObKAf6bV3KZlM2JJZgYObhFCRdwsaFDCxro6rz//ILo+1ERjlA3fPVpLc9Ic1OaXiOQlMktQbq6XEHhtQ8lokm7MeSx+SZ+XCpF1fYkb1cTQe32ilCs7BzlIRt3KVvOEC90l/eCQOfFOOzFPMuQMw= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Ha1uHrcd; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Ha1uHrcd" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 462041F000E9; Tue, 1 Sep 2026 11:11:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1788261077; bh=ydUDyZZzrKWh0+Jn+plmsnACZtB08rOTE+y1DZ1DBZc=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=Ha1uHrcdfsu0zmhOF+Ehh5Ec5+mZfVZARuX9NRDtbcGlGuXm63BQrLAWbWXzPmG0T A/QSC+loS6cbaES9j9hFLVehfWCP+a7xhDsTyvegSDWrB+q6VTQEnsagiSEMjtRdqa HXbV6Z7usR9k1BCXVp/9ffAgiqe/FSs4b33SWD7s8xI+aien69jWh1P8vuPt77VTRr GGaAuTiAcl6onHvMlq9t9V3VdOdUb8On9n6cR0PQROVZWNKAVFwt3M5czZkDS9ZDEx 7yI2k6dkoCXPSU0drJfSL+zDiMYfLvgqLnBM+ALTFrLs9Fxdu3p1i4MDxE89kXp8T9 TrFQRC7jwqzsA== From: Sasha Levin To: stable@vger.kernel.org Cc: Eric Dumazet , David Ahern , Jakub Kicinski , Sasha Levin Subject: [PATCH 6.12.y 1/5] ipv6: start using dst_dev_rcu() Date: Tue, 1 Sep 2026 07:11:11 -0400 Message-ID: <20260901111115.4175900-1-sashal@kernel.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <2026083114-maturing-resize-d958@gregkh> References: <2026083114-maturing-resize-d958@gregkh> Precedence: bulk X-Mailing-List: stable@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit From: Eric Dumazet [ Upstream commit b775ecf1655cedbc465fd6699ab18a2bc4e7a352 ] Refactor icmpv6_xrlim_allow() and ip6_dst_hoplimit() so that we acquire rcu_read_lock() a bit longer to be able to use dst_dev_rcu() instead of dst_dev(). __ip6_rt_update_pmtu() and rt6_do_redirect can directly use dst_dev_rcu() in sections already holding rcu_read_lock(). Small changes to use dst_dev_net_rcu() in ip6_default_advmss(), ipv6_sock_ac_join(), ip6_mc_find_dev() and ndisc_send_skb(). Fixes: 4a6ce2b6f2ec ("net: introduce a new function dst_dev_put()") Signed-off-by: Eric Dumazet Reviewed-by: David Ahern Link: https://patch.msgid.link/20250828195823.3958522-3-edumazet@google.com Signed-off-by: Jakub Kicinski Stable-dep-of: 2640e6419594 ("net: advertise TCP MSS from the configured MTU, not the learned PMTU") Signed-off-by: Sasha Levin --- include/net/ip6_route.h | 3 +++ net/ipv6/anycast.c | 4 +++- net/ipv6/icmp.c | 6 +++--- net/ipv6/mcast.c | 4 +++- net/ipv6/ndisc.c | 2 +- net/ipv6/output_core.c | 8 +++++--- net/ipv6/route.c | 9 ++++----- 7 files changed, 22 insertions(+), 14 deletions(-) diff --git a/include/net/ip6_route.h b/include/net/ip6_route.h index 59f48ca3abdf5..07c87c239511e 100644 --- a/include/net/ip6_route.h +++ b/include/net/ip6_route.h @@ -266,6 +266,9 @@ static inline bool ipv6_anycast_destination(const struct dst_entry *dst, int ip6_fragment(struct net *net, struct sock *sk, struct sk_buff *skb, int (*output)(struct net *, struct sock *, struct sk_buff *)); +/* Compatibility form of the later IPv6-specific dst_mtu() wrapper. */ +#define dst6_mtu(dst) dst_mtu(dst) + static inline unsigned int ip6_skb_dst_mtu(const struct sk_buff *skb) { const struct ipv6_pinfo *np = skb->sk && !dev_recursion_level() ? diff --git a/net/ipv6/anycast.c b/net/ipv6/anycast.c index 0627c4c18d1a5..97c72dc541fd6 100644 --- a/net/ipv6/anycast.c +++ b/net/ipv6/anycast.c @@ -94,7 +94,9 @@ int ipv6_sock_ac_join(struct sock *sk, int ifindex, const struct in6_addr *addr) rt = rt6_lookup(net, addr, NULL, 0, NULL, 0); if (rt) { - dev = rt->dst.dev; + rcu_read_lock(); + dev = dst_dev_rcu(&rt->dst); + rcu_read_unlock(); ip6_rt_put(rt); } else if (ishost) { err = -EADDRNOTAVAIL; diff --git a/net/ipv6/icmp.c b/net/ipv6/icmp.c index 229ae205450d3..e4e40f0694238 100644 --- a/net/ipv6/icmp.c +++ b/net/ipv6/icmp.c @@ -209,7 +209,8 @@ static bool icmpv6_xrlim_allow(struct sock *sk, u8 type, * this lookup should be more aggressive (not longer than timeout). */ dst = ip6_route_output(net, sk, fl6); - dev = dst_dev(dst); + rcu_read_lock(); + dev = dst_dev_rcu(dst); if (dst->error) { IP6_INC_STATS(net, ip6_dst_idev(dst), IPSTATS_MIB_OUTNOROUTES); @@ -224,11 +225,10 @@ static bool icmpv6_xrlim_allow(struct sock *sk, u8 type, if (rt->rt6i_dst.plen < 128) tmo >>= ((128 - rt->rt6i_dst.plen)>>5); - rcu_read_lock(); peer = inet_getpeer_v6(net->ipv6.peers, &fl6->daddr); res = inet_peer_xrlim_allow(peer, tmo); - rcu_read_unlock(); } + rcu_read_unlock(); if (!res) __ICMP6_INC_STATS(net, ip6_dst_idev(dst), ICMP6_MIB_RATELIMITHOST); diff --git a/net/ipv6/mcast.c b/net/ipv6/mcast.c index 92f321635e4ec..335546d77f39c 100644 --- a/net/ipv6/mcast.c +++ b/net/ipv6/mcast.c @@ -201,7 +201,9 @@ static int __ipv6_sock_mc_join(struct sock *sk, int ifindex, struct rt6_info *rt; rt = rt6_lookup(net, addr, NULL, 0, NULL, 0); if (rt) { - dev = rt->dst.dev; + rcu_read_lock(); + dev = dst_dev_rcu(&rt->dst); + rcu_read_unlock(); ip6_rt_put(rt); } } else diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c index 87bed84a00532..26ad7cab0383f 100644 --- a/net/ipv6/ndisc.c +++ b/net/ipv6/ndisc.c @@ -508,7 +508,7 @@ void ndisc_send_skb(struct sk_buff *skb, const struct in6_addr *daddr, ip6_nd_hdr(skb, saddr, daddr, READ_ONCE(inet6_sk(sk)->hop_limit), skb->len); - dev = dst_dev(dst); + dev = dst_dev_rcu(dst); idev = __in6_dev_get(dev); IP6_INC_STATS(net, idev, IPSTATS_MIB_OUTREQUESTS); diff --git a/net/ipv6/output_core.c b/net/ipv6/output_core.c index 90a178dd24aae..5be101401a00e 100644 --- a/net/ipv6/output_core.c +++ b/net/ipv6/output_core.c @@ -104,18 +104,20 @@ EXPORT_SYMBOL(ip6_find_1stfragopt); int ip6_dst_hoplimit(struct dst_entry *dst) { int hoplimit = dst_metric_raw(dst, RTAX_HOPLIMIT); + + rcu_read_lock(); if (hoplimit == 0) { - struct net_device *dev = dst_dev(dst); + struct net_device *dev = dst_dev_rcu(dst); struct inet6_dev *idev; - rcu_read_lock(); idev = __in6_dev_get(dev); if (idev) hoplimit = READ_ONCE(idev->cnf.hop_limit); else hoplimit = READ_ONCE(dev_net(dev)->ipv6.devconf_all->hop_limit); - rcu_read_unlock(); } + rcu_read_unlock(); + return hoplimit; } EXPORT_SYMBOL(ip6_dst_hoplimit); diff --git a/net/ipv6/route.c b/net/ipv6/route.c index e602dd3e7ee39..eb2ba7c34f6f8 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c @@ -2949,7 +2949,7 @@ static void __ip6_rt_update_pmtu(struct dst_entry *dst, const struct sock *sk, if (res.f6i->nh) { struct fib6_nh_match_arg arg = { - .dev = dst_dev(dst), + .dev = dst_dev_rcu(dst), .gw = &rt6->rt6i_gateway, }; @@ -3244,15 +3244,14 @@ EXPORT_SYMBOL_GPL(ip6_sk_redirect); static unsigned int ip6_default_advmss(const struct dst_entry *dst) { - struct net_device *dev = dst_dev(dst); - unsigned int mtu = dst_mtu(dst); + unsigned int mtu = dst6_mtu(dst); struct net *net; mtu -= sizeof(struct ipv6hdr) + sizeof(struct tcphdr); rcu_read_lock(); - net = dev_net_rcu(dev); + net = dst_dev_net_rcu(dst); if (mtu < net->ipv6.sysctl.ip6_rt_min_advmss) mtu = net->ipv6.sysctl.ip6_rt_min_advmss; @@ -4266,7 +4265,7 @@ static void rt6_do_redirect(struct dst_entry *dst, struct sock *sk, struct sk_bu if (res.f6i->nh) { struct fib6_nh_match_arg arg = { - .dev = dst_dev(dst), + .dev = dst_dev_rcu(dst), .gw = &rt->rt6i_gateway, }; -- 2.53.0