Commit 2429f7ac authored by Jiri Pirko's avatar Jiri Pirko Committed by David S. Miller

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: default avatarJiri Pirko <jpirko@redhat.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent ab16ebf3
...@@ -2450,6 +2450,11 @@ static inline void netif_addr_lock(struct net_device *dev) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment