Commit 87163ef9 authored by Nikolay Aleksandrov's avatar Nikolay Aleksandrov Committed by David S. Miller

bonding: remove last users of bond->lock and bond->lock itself

The usage of bond->lock in bond_main.c was completely unnecessary as it
didn't help to sync with anything, most of the spots already had RTNL.
Since there're no more users of bond->lock, remove it.
Signed-off-by: default avatarNikolay Aleksandrov <nikolay@redhat.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 246df7b4
...@@ -3105,7 +3105,6 @@ static int bond_open(struct net_device *bond_dev) ...@@ -3105,7 +3105,6 @@ static int bond_open(struct net_device *bond_dev)
struct slave *slave; struct slave *slave;
/* reset slave->backup and slave->inactive */ /* reset slave->backup and slave->inactive */
read_lock(&bond->lock);
if (bond_has_slaves(bond)) { if (bond_has_slaves(bond)) {
read_lock(&bond->curr_slave_lock); read_lock(&bond->curr_slave_lock);
bond_for_each_slave(bond, slave, iter) { bond_for_each_slave(bond, slave, iter) {
...@@ -3120,7 +3119,6 @@ static int bond_open(struct net_device *bond_dev) ...@@ -3120,7 +3119,6 @@ static int bond_open(struct net_device *bond_dev)
} }
read_unlock(&bond->curr_slave_lock); read_unlock(&bond->curr_slave_lock);
} }
read_unlock(&bond->lock);
bond_work_init_all(bond); bond_work_init_all(bond);
...@@ -3175,7 +3173,6 @@ static struct rtnl_link_stats64 *bond_get_stats(struct net_device *bond_dev, ...@@ -3175,7 +3173,6 @@ static struct rtnl_link_stats64 *bond_get_stats(struct net_device *bond_dev,
memset(stats, 0, sizeof(*stats)); memset(stats, 0, sizeof(*stats));
read_lock_bh(&bond->lock);
bond_for_each_slave(bond, slave, iter) { bond_for_each_slave(bond, slave, iter) {
const struct rtnl_link_stats64 *sstats = const struct rtnl_link_stats64 *sstats =
dev_get_stats(slave->dev, &temp); dev_get_stats(slave->dev, &temp);
...@@ -3206,7 +3203,6 @@ static struct rtnl_link_stats64 *bond_get_stats(struct net_device *bond_dev, ...@@ -3206,7 +3203,6 @@ static struct rtnl_link_stats64 *bond_get_stats(struct net_device *bond_dev,
stats->tx_heartbeat_errors += sstats->tx_heartbeat_errors; stats->tx_heartbeat_errors += sstats->tx_heartbeat_errors;
stats->tx_window_errors += sstats->tx_window_errors; stats->tx_window_errors += sstats->tx_window_errors;
} }
read_unlock_bh(&bond->lock);
return stats; return stats;
} }
...@@ -3246,13 +3242,11 @@ static int bond_do_ioctl(struct net_device *bond_dev, struct ifreq *ifr, int cmd ...@@ -3246,13 +3242,11 @@ static int bond_do_ioctl(struct net_device *bond_dev, struct ifreq *ifr, int cmd
if (mii->reg_num == 1) { if (mii->reg_num == 1) {
mii->val_out = 0; mii->val_out = 0;
read_lock(&bond->lock);
read_lock(&bond->curr_slave_lock); read_lock(&bond->curr_slave_lock);
if (netif_carrier_ok(bond->dev)) if (netif_carrier_ok(bond->dev))
mii->val_out = BMSR_LSTATUS; mii->val_out = BMSR_LSTATUS;
read_unlock(&bond->curr_slave_lock); read_unlock(&bond->curr_slave_lock);
read_unlock(&bond->lock);
} }
return 0; return 0;
...@@ -3428,21 +3422,6 @@ static int bond_change_mtu(struct net_device *bond_dev, int new_mtu) ...@@ -3428,21 +3422,6 @@ static int bond_change_mtu(struct net_device *bond_dev, int new_mtu)
netdev_dbg(bond_dev, "bond=%p, new_mtu=%d\n", bond, new_mtu); netdev_dbg(bond_dev, "bond=%p, new_mtu=%d\n", bond, new_mtu);
/* Can't hold bond->lock with bh disabled here since
* some base drivers panic. On the other hand we can't
* hold bond->lock without bh disabled because we'll
* deadlock. The only solution is to rely on the fact
* that we're under rtnl_lock here, and the slaves
* list won't change. This doesn't solve the problem
* of setting the slave's MTU while it is
* transmitting, but the assumption is that the base
* driver can handle that.
*
* TODO: figure out a way to safely iterate the slaves
* list, but without holding a lock around the actual
* call to the base driver.
*/
bond_for_each_slave(bond, slave, iter) { bond_for_each_slave(bond, slave, iter) {
netdev_dbg(bond_dev, "s %p c_m %p\n", netdev_dbg(bond_dev, "s %p c_m %p\n",
slave, slave->dev->netdev_ops->ndo_change_mtu); slave, slave->dev->netdev_ops->ndo_change_mtu);
...@@ -3517,21 +3496,6 @@ static int bond_set_mac_address(struct net_device *bond_dev, void *addr) ...@@ -3517,21 +3496,6 @@ static int bond_set_mac_address(struct net_device *bond_dev, void *addr)
if (!is_valid_ether_addr(sa->sa_data)) if (!is_valid_ether_addr(sa->sa_data))
return -EADDRNOTAVAIL; return -EADDRNOTAVAIL;
/* Can't hold bond->lock with bh disabled here since
* some base drivers panic. On the other hand we can't
* hold bond->lock without bh disabled because we'll
* deadlock. The only solution is to rely on the fact
* that we're under rtnl_lock here, and the slaves
* list won't change. This doesn't solve the problem
* of setting the slave's hw address while it is
* transmitting, but the assumption is that the base
* driver can handle that.
*
* TODO: figure out a way to safely iterate the slaves
* list, but without holding a lock around the actual
* call to the base driver.
*/
bond_for_each_slave(bond, slave, iter) { bond_for_each_slave(bond, slave, iter) {
netdev_dbg(bond_dev, "slave %p %s\n", slave, slave->dev->name); netdev_dbg(bond_dev, "slave %p %s\n", slave, slave->dev->name);
res = dev_set_mac_address(slave->dev, addr); res = dev_set_mac_address(slave->dev, addr);
...@@ -3857,7 +3821,6 @@ static int bond_ethtool_get_settings(struct net_device *bond_dev, ...@@ -3857,7 +3821,6 @@ static int bond_ethtool_get_settings(struct net_device *bond_dev,
* the true receive or transmit bandwidth (not all modes are symmetric) * the true receive or transmit bandwidth (not all modes are symmetric)
* this is an accurate maximum. * this is an accurate maximum.
*/ */
read_lock(&bond->lock);
bond_for_each_slave(bond, slave, iter) { bond_for_each_slave(bond, slave, iter) {
if (bond_slave_can_tx(slave)) { if (bond_slave_can_tx(slave)) {
if (slave->speed != SPEED_UNKNOWN) if (slave->speed != SPEED_UNKNOWN)
...@@ -3868,7 +3831,6 @@ static int bond_ethtool_get_settings(struct net_device *bond_dev, ...@@ -3868,7 +3831,6 @@ static int bond_ethtool_get_settings(struct net_device *bond_dev,
} }
} }
ethtool_cmd_speed_set(ecmd, speed ? : SPEED_UNKNOWN); ethtool_cmd_speed_set(ecmd, speed ? : SPEED_UNKNOWN);
read_unlock(&bond->lock);
return 0; return 0;
} }
...@@ -3931,7 +3893,6 @@ void bond_setup(struct net_device *bond_dev) ...@@ -3931,7 +3893,6 @@ void bond_setup(struct net_device *bond_dev)
struct bonding *bond = netdev_priv(bond_dev); struct bonding *bond = netdev_priv(bond_dev);
/* initialize rwlocks */ /* initialize rwlocks */
rwlock_init(&bond->lock);
rwlock_init(&bond->curr_slave_lock); rwlock_init(&bond->curr_slave_lock);
bond->params = bonding_defaults; bond->params = bonding_defaults;
......
...@@ -83,7 +83,7 @@ ...@@ -83,7 +83,7 @@
* @pos: current slave * @pos: current slave
* @iter: list_head * iterator * @iter: list_head * iterator
* *
* Caller must hold bond->lock * Caller must hold RTNL
*/ */
#define bond_for_each_slave(bond, pos, iter) \ #define bond_for_each_slave(bond, pos, iter) \
netdev_for_each_lower_private((bond)->dev, pos, iter) netdev_for_each_lower_private((bond)->dev, pos, iter)
...@@ -185,11 +185,8 @@ struct slave { ...@@ -185,11 +185,8 @@ struct slave {
/* /*
* Here are the locking policies for the two bonding locks: * Here are the locking policies for the two bonding locks:
* *
* 1) Get bond->lock when reading/writing slave list. * 1) Get rcu_read_lock when reading or RTNL when writing slave list.
* 2) Get bond->curr_slave_lock when reading/writing bond->curr_active_slave. * 2) Get bond->curr_slave_lock when reading/writing bond->curr_active_slave.
* (It is unnecessary when the write-lock is put with bond->lock.)
* 3) When we lock with bond->curr_slave_lock, we must lock with bond->lock
* beforehand.
*/ */
struct bonding { struct bonding {
struct net_device *dev; /* first - useful for panic debug */ struct net_device *dev; /* first - useful for panic debug */
...@@ -200,7 +197,6 @@ struct bonding { ...@@ -200,7 +197,6 @@ struct bonding {
s32 slave_cnt; /* never change this value outside the attach/detach wrappers */ s32 slave_cnt; /* never change this value outside the attach/detach wrappers */
int (*recv_probe)(const struct sk_buff *, struct bonding *, int (*recv_probe)(const struct sk_buff *, struct bonding *,
struct slave *); struct slave *);
rwlock_t lock;
rwlock_t curr_slave_lock; rwlock_t curr_slave_lock;
u8 send_peer_notif; u8 send_peer_notif;
u8 igmp_retrans; u8 igmp_retrans;
......
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