diff --git a/drivers/infiniband/sw/rxe/rxe_net.c b/drivers/infiniband/sw/rxe/rxe_net.c index 50a2cb5405e2..92847e955ca2 100644 --- a/drivers/infiniband/sw/rxe/rxe_net.c +++ b/drivers/infiniband/sw/rxe/rxe_net.c @@ -642,6 +642,8 @@ static void rxe_sock_put(struct sock *sk, } } +static DEFINE_MUTEX(rxe_net_del_mutex); + void rxe_net_del(struct ib_device *dev) { struct rxe_dev *rxe = container_of(dev, struct rxe_dev, ib_dev); @@ -649,9 +651,10 @@ void rxe_net_del(struct ib_device *dev) struct sock *sk; struct net *net; + mutex_lock(&rxe_net_del_mutex); ndev = rxe_ib_device_get_netdev(&rxe->ib_dev); if (!ndev) - return; + goto out; net = dev_net(ndev); @@ -664,6 +667,8 @@ void rxe_net_del(struct ib_device *dev) rxe_sock_put(sk, rxe_ns_pernet_set_sk6, net); dev_put(ndev); +out: + mutex_unlock(&rxe_net_del_mutex); } static void rxe_port_event(struct rxe_dev *rxe,