IB/IPoIB: Disable bottom half when dealing with device address
Align locking usage when touching device address with rest
of the kernel. Lock the bottom half when doing so using
netif_addr_lock_bh.
This also solves the following case as reported by lockdep:
CPU0 CPU1
---- ----
lock(_xmit_INFINIBAND);
local_irq_disable();
lock(&(&mc->mca_lock)->rlock);
lock(_xmit_INFINIBAND);
<Interrupt>
lock(&(&mc->mca_lock)->rlock);
*** DEADLOCK ***
Fixes: 492a7e67ff
("IB/IPoIB: Allow setting the device address")
Signed-off-by: Mark Bloch <markb@mellanox.com>
Signed-off-by: Leon Romanovsky <leon@kernel.org>
Signed-off-by: Doug Ledford <dledford@redhat.com>
This commit is contained in:
@@ -582,13 +582,13 @@ void ipoib_mcast_join_task(struct work_struct *work)
|
||||
return;
|
||||
}
|
||||
priv->local_lid = port_attr.lid;
|
||||
netif_addr_lock(dev);
|
||||
netif_addr_lock_bh(dev);
|
||||
|
||||
if (!test_bit(IPOIB_FLAG_DEV_ADDR_SET, &priv->flags)) {
|
||||
netif_addr_unlock(dev);
|
||||
netif_addr_unlock_bh(dev);
|
||||
return;
|
||||
}
|
||||
netif_addr_unlock(dev);
|
||||
netif_addr_unlock_bh(dev);
|
||||
|
||||
spin_lock_irq(&priv->lock);
|
||||
if (!test_bit(IPOIB_FLAG_OPER_UP, &priv->flags))
|
||||
|
Reference in New Issue
Block a user