mirror of
https://github.com/edk2-porting/linux-next.git
synced 2025-01-03 19:24:02 +08:00
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: Nikolay Aleksandrov <nikolay@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
246df7b423
commit
87163ef9cd
@ -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)
|
|||||||
}
|
}
|
||||||
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,
|
|||||||
|
|
||||||
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,
|
|||||||
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
|
|||||||
|
|
||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
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,
|
|||||||
* 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,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
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)
|
|||||||
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 @@
|
|||||||
* @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 {
|
|||||||
/*
|
/*
|
||||||
* 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 {
|
|||||||
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;
|
||||||
|
Loading…
Reference in New Issue
Block a user