Patch "ipv6: release nexthop on device removal" has been added to the 6.1-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    ipv6: release nexthop on device removal

to the 6.1-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     ipv6-release-nexthop-on-device-removal.patch
and it can be found in the queue-6.1 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit e3abbf4d2061eb533413e017c706af2065889519
Author: Paolo Abeni <pabeni@xxxxxxxxxx>
Date:   Tue Nov 5 19:23:50 2024 +0100

    ipv6: release nexthop on device removal
    
    [ Upstream commit eb02688c5c45c3e7af7e71f036a7144f5639cbfe ]
    
    The CI is hitting some aperiodic hangup at device removal time in the
    pmtu.sh self-test:
    
    unregister_netdevice: waiting for veth_A-R1 to become free. Usage count = 6
    ref_tracker: veth_A-R1@ffff888013df15d8 has 1/5 users at
            dst_init+0x84/0x4a0
            dst_alloc+0x97/0x150
            ip6_dst_alloc+0x23/0x90
            ip6_rt_pcpu_alloc+0x1e6/0x520
            ip6_pol_route+0x56f/0x840
            fib6_rule_lookup+0x334/0x630
            ip6_route_output_flags+0x259/0x480
            ip6_dst_lookup_tail.constprop.0+0x5c2/0x940
            ip6_dst_lookup_flow+0x88/0x190
            udp_tunnel6_dst_lookup+0x2a7/0x4c0
            vxlan_xmit_one+0xbde/0x4a50 [vxlan]
            vxlan_xmit+0x9ad/0xf20 [vxlan]
            dev_hard_start_xmit+0x10e/0x360
            __dev_queue_xmit+0xf95/0x18c0
            arp_solicit+0x4a2/0xe00
            neigh_probe+0xaa/0xf0
    
    While the first suspect is the dst_cache, explicitly tracking the dst
    owing the last device reference via probes proved such dst is held by
    the nexthop in the originating fib6_info.
    
    Similar to commit f5b51fe804ec ("ipv6: route: purge exception on
    removal"), we need to explicitly release the originating fib info when
    disconnecting a to-be-removed device from a live ipv6 dst: move the
    fib6_info cleanup into ip6_dst_ifdown().
    
    Tested running:
    
    ./pmtu.sh cleanup_ipv6_exception
    
    in a tight loop for more than 400 iterations with no spat, running an
    unpatched kernel  I observed a splat every ~10 iterations.
    
    Fixes: f88d8ea67fbd ("ipv6: Plumb support for nexthop object in a fib6_info")
    Signed-off-by: Paolo Abeni <pabeni@xxxxxxxxxx>
    Reviewed-by: Eric Dumazet <edumazet@xxxxxxxxxx>
    Reviewed-by: David Ahern <dsahern@xxxxxxxxxx>
    Link: https://patch.msgid.link/604c45c188c609b732286b47ac2a451a40f6cf6d.1730828007.git.pabeni@xxxxxxxxxx
    Signed-off-by: Jakub Kicinski <kuba@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/net/ipv6/route.c b/net/ipv6/route.c
index 10e7517d126d9..5da0c83a3ee8f 100644
--- a/net/ipv6/route.c
+++ b/net/ipv6/route.c
@@ -378,6 +378,7 @@ static void ip6_dst_ifdown(struct dst_entry *dst, struct net_device *dev,
 {
 	struct rt6_info *rt = (struct rt6_info *)dst;
 	struct inet6_dev *idev = rt->rt6i_idev;
+	struct fib6_info *from;
 
 	if (idev && idev->dev != blackhole_netdev) {
 		struct inet6_dev *blackhole_idev = in6_dev_get(blackhole_netdev);
@@ -387,6 +388,8 @@ static void ip6_dst_ifdown(struct dst_entry *dst, struct net_device *dev,
 			in6_dev_put(idev);
 		}
 	}
+	from = unrcu_pointer(xchg(&rt->from, NULL));
+	fib6_info_release(from);
 }
 
 static bool __rt6_check_expired(const struct rt6_info *rt)
@@ -1449,7 +1452,6 @@ static DEFINE_SPINLOCK(rt6_exception_lock);
 static void rt6_remove_exception(struct rt6_exception_bucket *bucket,
 				 struct rt6_exception *rt6_ex)
 {
-	struct fib6_info *from;
 	struct net *net;
 
 	if (!bucket || !rt6_ex)
@@ -1461,8 +1463,6 @@ static void rt6_remove_exception(struct rt6_exception_bucket *bucket,
 	/* purge completely the exception to allow releasing the held resources:
 	 * some [sk] cache may keep the dst around for unlimited time
 	 */
-	from = unrcu_pointer(xchg(&rt6_ex->rt6i->from, NULL));
-	fib6_info_release(from);
 	dst_dev_put(&rt6_ex->rt6i->dst);
 
 	hlist_del_rcu(&rt6_ex->hlist);




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux