Commit 3545f9b7 authored by Jakub Kicinski's avatar Jakub Kicinski
Browse files

Merge branch 'ipv6-fix-hangup-on-device-removal'

Paolo Abeni says:

====================
ipv6: fix hangup on device removal

This addresses the infamous unregister_netdevice splat in net selftests;
the actual fix is carried by the first patch, while the 2nd one
addresses a related problem in the relevant test that was patially
hiding the problem.

Targeting net-next as the issue is quite old and I feel a little lost
in the fib info/nh jungle.
====================

Link: https://patch.msgid.link/cover.1730828007.git.pabeni@redhat.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents a84e8c05 52ed077a
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -374,6 +374,7 @@ static void ip6_dst_ifdown(struct dst_entry *dst, struct net_device *dev)
{
	struct rt6_info *rt = dst_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);
@@ -383,6 +384,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)
@@ -1455,7 +1458,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)
@@ -1467,8 +1469,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);
+1 −1
Original line number Diff line number Diff line
@@ -2056,7 +2056,7 @@ check_running() {
	pid=${1}
	cmd=${2}

	[ "$(cat /proc/${pid}/cmdline 2>/dev/null | tr -d '\0')" = "{cmd}" ]
	[ "$(cat /proc/${pid}/cmdline 2>/dev/null | tr -d '\0')" = "${cmd}" ]
}

test_cleanup_vxlanX_exception() {