Message ID | 20120109163654.GC2114@minipsycho.brq.redhat.com |
---|---|
State | Accepted, archived |
Delegated to: | David Miller |
Headers | show |
On Mon, 2012-01-09 at 17:36 +0100, Jiri Pirko wrote: > 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 depmod deathlock > warning. [...] I think you mean '...lockdep deadlock warning'? Ben.
From: Ben Hutchings <bhutchings@solarflare.com> Date: Mon, 9 Jan 2012 19:07:08 +0000 > On Mon, 2012-01-09 at 17:36 +0100, Jiri Pirko wrote: >> 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 depmod deathlock >> warning. > [...] > > I think you mean '...lockdep deadlock warning'? Applied with this wording fixed. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Mon, Jan 09, 2012 at 08:07:08PM CET, bhutchings@solarflare.com wrote: >On Mon, 2012-01-09 at 17:36 +0100, Jiri Pirko wrote: >> 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 depmod deathlock >> warning. >[...] > >I think you mean '...lockdep deadlock warning'? That's him :) I mixed that up a bit. Sorry :( Jirka > >Ben. > >-- >Ben Hutchings, Staff Engineer, Solarflare >Not speaking for my employer; that's the marketing department's job. >They asked us to note that Solarflare product names are trademarked. > -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index a1d1095..d0522bb 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -2450,6 +2450,11 @@ static inline void netif_addr_lock(struct net_device *dev) 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) { spin_lock_bh(&dev->addr_list_lock); diff --git a/net/core/dev_addr_lists.c b/net/core/dev_addr_lists.c index c34ce9f..29c07fe 100644 --- a/net/core/dev_addr_lists.c +++ b/net/core/dev_addr_lists.c @@ -439,11 +439,11 @@ int dev_uc_sync(struct net_device *to, struct net_device *from) if (to->addr_len != from->addr_len) return -EINVAL; - netif_addr_lock_bh(to); + netif_addr_lock_nested(to); err = __hw_addr_sync(&to->uc, &from->uc, to->addr_len); if (!err) __dev_set_rx_mode(to); - netif_addr_unlock_bh(to); + netif_addr_unlock(to); return err; } EXPORT_SYMBOL(dev_uc_sync); @@ -463,7 +463,7 @@ void dev_uc_unsync(struct net_device *to, struct net_device *from) return; netif_addr_lock_bh(from); - netif_addr_lock(to); + netif_addr_lock_nested(to); __hw_addr_unsync(&to->uc, &from->uc, to->addr_len); __dev_set_rx_mode(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) return -EINVAL; - netif_addr_lock_bh(to); + netif_addr_lock_nested(to); err = __hw_addr_sync(&to->mc, &from->mc, to->addr_len); if (!err) __dev_set_rx_mode(to); - netif_addr_unlock_bh(to); + netif_addr_unlock(to); return err; } EXPORT_SYMBOL(dev_mc_sync); @@ -626,7 +626,7 @@ void dev_mc_unsync(struct net_device *to, struct net_device *from) return; netif_addr_lock_bh(from); - netif_addr_lock(to); + netif_addr_lock_nested(to); __hw_addr_unsync(&to->mc, &from->mc, to->addr_len); __dev_set_rx_mode(to); netif_addr_unlock(to);
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 depmod deathlock warning. There's no way this deathlock can happen so use spin_lock_nested() to silence the warning. Signed-off-by: Jiri Pirko <jpirko@redhat.com> v1->v2: use SINGLE_DEPTH_NESTING instead of wrongly c&p'ed DENTRY_D_LOCK_NESTED --- include/linux/netdevice.h | 5 +++++ net/core/dev_addr_lists.c | 12 ++++++------ 2 files changed, 11 insertions(+), 6 deletions(-)