From e0ba1be6d7166b55f0ca8ba31b031d79bf1223fd Mon Sep 17 00:00:00 2001 From: Hans Petter Selasky Date: Fri, 8 Mar 2019 09:16:29 +0000 Subject: [PATCH] Don't hold state lock while detaching network device instance in mlx4en(4). It can happen during shutdown that the lock will recurse when the mlx4en(4) instance is part of a lagg interface. Call ether_ifdetach() unlocked. Backtrace: panic(): _sx_xlock_hard: recursed on non-recursive sx &mdev->state_lock _sx_xlock_hard() _sx_xlock() mlx4_en_ioctl() if_setlladdr() lagg_port_destroy() lagg_port_ifdetach() if_detach() mlx4_en_destroy_netdev() mlx4_en_remove() mlx4_remove_device() mlx4_unregister_device() mlx4_unload_one() mlx4_shutdown() linux_pci_shutdown() bus_generic_shutdown() MFC after: 1 week Sponsored by: Mellanox Technologies --- sys/dev/mlx4/mlx4_en/mlx4_en_netdev.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/sys/dev/mlx4/mlx4_en/mlx4_en_netdev.c b/sys/dev/mlx4/mlx4_en/mlx4_en_netdev.c index ecddc21bec3..9ecc0153165 100644 --- a/sys/dev/mlx4/mlx4_en/mlx4_en_netdev.c +++ b/sys/dev/mlx4/mlx4_en/mlx4_en_netdev.c @@ -1779,11 +1779,8 @@ void mlx4_en_destroy_netdev(struct net_device *dev) EVENTHANDLER_DEREGISTER(vlan_unconfig, priv->vlan_detach); /* Unregister device - this will close the port if it was up */ - if (priv->registered) { - mutex_lock(&mdev->state_lock); + if (priv->registered) ether_ifdetach(dev); - mutex_unlock(&mdev->state_lock); - } mutex_lock(&mdev->state_lock); mlx4_en_stop_port(dev);