struct slave *slave;
 
        /* reset slave->backup and slave->inactive */
-       read_lock(&bond->lock);
        if (bond_has_slaves(bond)) {
                read_lock(&bond->curr_slave_lock);
                bond_for_each_slave(bond, slave, iter) {
                }
                read_unlock(&bond->curr_slave_lock);
        }
-       read_unlock(&bond->lock);
 
        bond_work_init_all(bond);
 
 
        memset(stats, 0, sizeof(*stats));
 
-       read_lock_bh(&bond->lock);
        bond_for_each_slave(bond, slave, iter) {
                const struct rtnl_link_stats64 *sstats =
                        dev_get_stats(slave->dev, &temp);
                stats->tx_heartbeat_errors += sstats->tx_heartbeat_errors;
                stats->tx_window_errors += sstats->tx_window_errors;
        }
-       read_unlock_bh(&bond->lock);
 
        return stats;
 }
 
                if (mii->reg_num == 1) {
                        mii->val_out = 0;
-                       read_lock(&bond->lock);
                        read_lock(&bond->curr_slave_lock);
                        if (netif_carrier_ok(bond->dev))
                                mii->val_out = BMSR_LSTATUS;
 
                        read_unlock(&bond->curr_slave_lock);
-                       read_unlock(&bond->lock);
                }
 
                return 0;
 
        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) {
                netdev_dbg(bond_dev, "s %p c_m %p\n",
                           slave, slave->dev->netdev_ops->ndo_change_mtu);
        if (!is_valid_ether_addr(sa->sa_data))
                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) {
                netdev_dbg(bond_dev, "slave %p %s\n", slave, slave->dev->name);
                res = dev_set_mac_address(slave->dev, addr);
         * the true receive or transmit bandwidth (not all modes are symmetric)
         * this is an accurate maximum.
         */
-       read_lock(&bond->lock);
        bond_for_each_slave(bond, slave, iter) {
                if (bond_slave_can_tx(slave)) {
                        if (slave->speed != SPEED_UNKNOWN)
                }
        }
        ethtool_cmd_speed_set(ecmd, speed ? : SPEED_UNKNOWN);
-       read_unlock(&bond->lock);
 
        return 0;
 }
        struct bonding *bond = netdev_priv(bond_dev);
 
        /* initialize rwlocks */
-       rwlock_init(&bond->lock);
        rwlock_init(&bond->curr_slave_lock);
        bond->params = bonding_defaults;
 
 
  * @pos:       current slave
  * @iter:      list_head * iterator
  *
- * Caller must hold bond->lock
+ * Caller must hold RTNL
  */
 #define bond_for_each_slave(bond, pos, iter) \
        netdev_for_each_lower_private((bond)->dev, pos, iter)
 /*
  * 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.
- *    (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   net_device *dev; /* first - useful for panic debug */
        s32      slave_cnt; /* never change this value outside the attach/detach wrappers */
        int     (*recv_probe)(const struct sk_buff *, struct bonding *,
                              struct slave *);
-       rwlock_t lock;
        rwlock_t curr_slave_lock;
        u8       send_peer_notif;
        u8       igmp_retrans;