mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-05-24 10:39:52 +00:00
net: introduce netif_addr_lock_nested() and call if when appropriate
dev_uc_sync() and dev_mc_sync() are acquiring netif_addr_lock for destination device of synchronization. Since netif_addr_lock is already held at the time for source device, this triggers lockdep deadlock warning. There's no way this deadlock can happen so use spin_lock_nested() to silence the warning. Signed-off-by: Jiri Pirko <jpirko@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
ab16ebf375
commit
2429f7ac2e
2 changed files with 11 additions and 6 deletions
|
@ -2450,6 +2450,11 @@ static inline void netif_addr_lock(struct net_device *dev)
|
||||||
spin_lock(&dev->addr_list_lock);
|
spin_lock(&dev->addr_list_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void netif_addr_lock_nested(struct net_device *dev)
|
||||||
|
{
|
||||||
|
spin_lock_nested(&dev->addr_list_lock, SINGLE_DEPTH_NESTING);
|
||||||
|
}
|
||||||
|
|
||||||
static inline void netif_addr_lock_bh(struct net_device *dev)
|
static inline void netif_addr_lock_bh(struct net_device *dev)
|
||||||
{
|
{
|
||||||
spin_lock_bh(&dev->addr_list_lock);
|
spin_lock_bh(&dev->addr_list_lock);
|
||||||
|
|
|
@ -439,11 +439,11 @@ int dev_uc_sync(struct net_device *to, struct net_device *from)
|
||||||
if (to->addr_len != from->addr_len)
|
if (to->addr_len != from->addr_len)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
netif_addr_lock_bh(to);
|
netif_addr_lock_nested(to);
|
||||||
err = __hw_addr_sync(&to->uc, &from->uc, to->addr_len);
|
err = __hw_addr_sync(&to->uc, &from->uc, to->addr_len);
|
||||||
if (!err)
|
if (!err)
|
||||||
__dev_set_rx_mode(to);
|
__dev_set_rx_mode(to);
|
||||||
netif_addr_unlock_bh(to);
|
netif_addr_unlock(to);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(dev_uc_sync);
|
EXPORT_SYMBOL(dev_uc_sync);
|
||||||
|
@ -463,7 +463,7 @@ void dev_uc_unsync(struct net_device *to, struct net_device *from)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
netif_addr_lock_bh(from);
|
netif_addr_lock_bh(from);
|
||||||
netif_addr_lock(to);
|
netif_addr_lock_nested(to);
|
||||||
__hw_addr_unsync(&to->uc, &from->uc, to->addr_len);
|
__hw_addr_unsync(&to->uc, &from->uc, to->addr_len);
|
||||||
__dev_set_rx_mode(to);
|
__dev_set_rx_mode(to);
|
||||||
netif_addr_unlock(to);
|
netif_addr_unlock(to);
|
||||||
|
@ -602,11 +602,11 @@ int dev_mc_sync(struct net_device *to, struct net_device *from)
|
||||||
if (to->addr_len != from->addr_len)
|
if (to->addr_len != from->addr_len)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
netif_addr_lock_bh(to);
|
netif_addr_lock_nested(to);
|
||||||
err = __hw_addr_sync(&to->mc, &from->mc, to->addr_len);
|
err = __hw_addr_sync(&to->mc, &from->mc, to->addr_len);
|
||||||
if (!err)
|
if (!err)
|
||||||
__dev_set_rx_mode(to);
|
__dev_set_rx_mode(to);
|
||||||
netif_addr_unlock_bh(to);
|
netif_addr_unlock(to);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(dev_mc_sync);
|
EXPORT_SYMBOL(dev_mc_sync);
|
||||||
|
@ -626,7 +626,7 @@ void dev_mc_unsync(struct net_device *to, struct net_device *from)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
netif_addr_lock_bh(from);
|
netif_addr_lock_bh(from);
|
||||||
netif_addr_lock(to);
|
netif_addr_lock_nested(to);
|
||||||
__hw_addr_unsync(&to->mc, &from->mc, to->addr_len);
|
__hw_addr_unsync(&to->mc, &from->mc, to->addr_len);
|
||||||
__dev_set_rx_mode(to);
|
__dev_set_rx_mode(to);
|
||||||
netif_addr_unlock(to);
|
netif_addr_unlock(to);
|
||||||
|
|
Loading…
Add table
Reference in a new issue