From: dingtianhong Date: Tue, 23 Jul 2013 07:25:27 +0000 (+0800) Subject: bonding: don't call slave_xxx_netpoll under spinlocks X-Git-Tag: v3.12-rc1~132^2~471 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c4cdef9b7183159c23c7302aaf270d64c549f557;p=kernel%2Fkernel-generic.git bonding: don't call slave_xxx_netpoll under spinlocks The slave_xxx_netpoll will call synchronize_rcu_bh(), so the function may schedule and sleep, it should't be called under spinlocks. bond_netpoll_setup() and bond_netpoll_cleanup() are always protected by rtnl lock, it is no need to take the read lock, as the slave list couldn't be changed outside rtnl lock. Signed-off-by: Ding Tianhong Cc: Jay Vosburgh Cc: Andy Gospodarek Signed-off-by: David S. Miller --- diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index ae9864c..5cd8e0a 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c @@ -1219,8 +1219,9 @@ static void bond_poll_controller(struct net_device *bond_dev) { } -static void __bond_netpoll_cleanup(struct bonding *bond) +static void bond_netpoll_cleanup(struct net_device *bond_dev) { + struct bonding *bond = netdev_priv(bond_dev); struct slave *slave; int i; @@ -1228,14 +1229,6 @@ static void __bond_netpoll_cleanup(struct bonding *bond) if (IS_UP(slave->dev)) slave_disable_netpoll(slave); } -static void bond_netpoll_cleanup(struct net_device *bond_dev) -{ - struct bonding *bond = netdev_priv(bond_dev); - - read_lock(&bond->lock); - __bond_netpoll_cleanup(bond); - read_unlock(&bond->lock); -} static int bond_netpoll_setup(struct net_device *dev, struct netpoll_info *ni, gfp_t gfp) { @@ -1243,15 +1236,13 @@ static int bond_netpoll_setup(struct net_device *dev, struct netpoll_info *ni, g struct slave *slave; int i, err = 0; - read_lock(&bond->lock); bond_for_each_slave(bond, slave, i) { err = slave_enable_netpoll(slave); if (err) { - __bond_netpoll_cleanup(bond); + bond_netpoll_cleanup(dev); break; } } - read_unlock(&bond->lock); return err; }