aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2013-12-14 01:58:19 -0500
committerDavid S. Miller <davem@davemloft.net>2013-12-14 01:58:19 -0500
commitdf012169da29f77989b3dec9a7c4dd1f7bb9785f (patch)
tree3f219542a49b94e7120a1ce0201cdf61a65232f0
parente57a784d8cae429f5b697fe55abf420181d9ff09 (diff)
parentf23691095b3c2c05b3ee4ab03cb8e90cfe245ea8 (diff)
Merge branch 'bonding_rcu'
Ding Tianhong says: ==================== bonding: rebuild the lock use for bond monitor Now the bond slave list is not protected by bond lock, only by RTNL, but the monitor still use the bond lock to protect the slave list, it is useless, according to the Veaceslav's opinion, there were three way to fix the protect problem: 1. add bond_master_upper_dev_link() and bond_upper_dev_unlink() in bond->lock, but it is unsafe to call call_netdevice_notifiers() in write lock. 2. remove unused bond->lock for monitor function, only use the exist rtnl lock(), it will take performance loss in fast path. 3. use RCU to protect the slave list, of course, performance is better, but in slow path, it is ignored. obviously the solution 1 is not fit here, I will consider the 2 and 3 solution. My principle is simple, if in fast path, RCU is better, otherwise in slow path, both is well, but according to the Jay Vosburgh's opinion, the monitor will loss performace if use RTNL to protect the all slave list, so remove the bond lock and replace with RCU. The second problem is the curr_slave_lock for bond, it is too old and unwanted in many place, because the curr_active_slave would only be changed in 3 place: 1. enslave slave. 2. release slave. 3. change active slave. all above were already holding bond lock, RTNL and curr_slave_lock together, it is tedious and no need to add so mach lock, when change the curr_active_slave, you have to hold the RTNL and curr_slave_lock together, and when you read the curr_active_slave, RTNL or curr_slave_lock, any one of them is no problem. for the stability, I did not change the logic for the monitor, all change is clear and simple, I have test the patch set for lockdep, it work well and stability. v2. accept the Jay Vosburgh's opinion, remove the RTNL and replace with RCU, also add some rcu function for bond use, so the patch set reach 10. v3. accept the Nikolay Aleksandrov's opinion, remove no needed bond_has_slave_rcu(), add protection for several 3ad mode handler functions and current_arp_slave. rebuild the bond_first_slave_rcu(), make it more clear. v4. because the struct netdev_adjacent should not be exist in netdevice.h, so I have to make a new function to support micro bond_first_slave_rcu(). also add a new patch to simplify the bond_resend_igmp_join_requests_delayed(). v5. according the Jay Vosburgh's opinion, in patch 2 and 6, the calling of notify peer is hardly to happen with the bond_xxx_commit() when the monitoring is running, so the performance impact about make two round trips to one trip on RTNL is minimal, no need to do that,the reason is very clear, so modify the patch 2 and 6, recover the notify peer in RTNL alone. ==================== Signed-off-by: Jay Vosburgh <fubar@us.ibm.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/bonding/bond_3ad.c54
-rw-r--r--drivers/net/bonding/bond_alb.c34
-rw-r--r--drivers/net/bonding/bond_main.c157
-rw-r--r--drivers/net/bonding/bond_options.c2
-rw-r--r--drivers/net/bonding/bond_sysfs.c4
-rw-r--r--drivers/net/bonding/bonding.h4
-rw-r--r--include/linux/netdevice.h1
-rw-r--r--net/core/dev.c21
8 files changed, 130 insertions, 147 deletions
diff --git a/drivers/net/bonding/bond_3ad.c b/drivers/net/bonding/bond_3ad.c
index 187b1b7772ef..58c2249a3324 100644
--- a/drivers/net/bonding/bond_3ad.c
+++ b/drivers/net/bonding/bond_3ad.c
@@ -147,11 +147,12 @@ static inline struct aggregator *__get_first_agg(struct port *port)
147 struct bonding *bond = __get_bond_by_port(port); 147 struct bonding *bond = __get_bond_by_port(port);
148 struct slave *first_slave; 148 struct slave *first_slave;
149 149
150 // If there's no bond for this port, or bond has no slaves 150 /* If there's no bond for this port, or bond has no slaves */
151 if (bond == NULL) 151 if (bond == NULL)
152 return NULL; 152 return NULL;
153 first_slave = bond_first_slave(bond); 153 rcu_read_lock();
154 154 first_slave = bond_first_slave_rcu(bond);
155 rcu_read_unlock();
155 return first_slave ? &(SLAVE_AD_INFO(first_slave).aggregator) : NULL; 156 return first_slave ? &(SLAVE_AD_INFO(first_slave).aggregator) : NULL;
156} 157}
157 158
@@ -702,9 +703,13 @@ static struct aggregator *__get_active_agg(struct aggregator *aggregator)
702 struct list_head *iter; 703 struct list_head *iter;
703 struct slave *slave; 704 struct slave *slave;
704 705
705 bond_for_each_slave(bond, slave, iter) 706 rcu_read_lock();
706 if (SLAVE_AD_INFO(slave).aggregator.is_active) 707 bond_for_each_slave_rcu(bond, slave, iter)
708 if (SLAVE_AD_INFO(slave).aggregator.is_active) {
709 rcu_read_unlock();
707 return &(SLAVE_AD_INFO(slave).aggregator); 710 return &(SLAVE_AD_INFO(slave).aggregator);
711 }
712 rcu_read_unlock();
708 713
709 return NULL; 714 return NULL;
710} 715}
@@ -1471,7 +1476,8 @@ static void ad_agg_selection_logic(struct aggregator *agg)
1471 active = __get_active_agg(agg); 1476 active = __get_active_agg(agg);
1472 best = (active && agg_device_up(active)) ? active : NULL; 1477 best = (active && agg_device_up(active)) ? active : NULL;
1473 1478
1474 bond_for_each_slave(bond, slave, iter) { 1479 rcu_read_lock();
1480 bond_for_each_slave_rcu(bond, slave, iter) {
1475 agg = &(SLAVE_AD_INFO(slave).aggregator); 1481 agg = &(SLAVE_AD_INFO(slave).aggregator);
1476 1482
1477 agg->is_active = 0; 1483 agg->is_active = 0;
@@ -1505,7 +1511,7 @@ static void ad_agg_selection_logic(struct aggregator *agg)
1505 active->is_active = 1; 1511 active->is_active = 1;
1506 } 1512 }
1507 1513
1508 // if there is new best aggregator, activate it 1514 /* if there is new best aggregator, activate it */
1509 if (best) { 1515 if (best) {
1510 pr_debug("best Agg=%d; P=%d; a k=%d; p k=%d; Ind=%d; Act=%d\n", 1516 pr_debug("best Agg=%d; P=%d; a k=%d; p k=%d; Ind=%d; Act=%d\n",
1511 best->aggregator_identifier, best->num_of_ports, 1517 best->aggregator_identifier, best->num_of_ports,
@@ -1516,7 +1522,7 @@ static void ad_agg_selection_logic(struct aggregator *agg)
1516 best->lag_ports, best->slave, 1522 best->lag_ports, best->slave,
1517 best->slave ? best->slave->dev->name : "NULL"); 1523 best->slave ? best->slave->dev->name : "NULL");
1518 1524
1519 bond_for_each_slave(bond, slave, iter) { 1525 bond_for_each_slave_rcu(bond, slave, iter) {
1520 agg = &(SLAVE_AD_INFO(slave).aggregator); 1526 agg = &(SLAVE_AD_INFO(slave).aggregator);
1521 1527
1522 pr_debug("Agg=%d; P=%d; a k=%d; p k=%d; Ind=%d; Act=%d\n", 1528 pr_debug("Agg=%d; P=%d; a k=%d; p k=%d; Ind=%d; Act=%d\n",
@@ -1526,10 +1532,11 @@ static void ad_agg_selection_logic(struct aggregator *agg)
1526 agg->is_individual, agg->is_active); 1532 agg->is_individual, agg->is_active);
1527 } 1533 }
1528 1534
1529 // check if any partner replys 1535 /* check if any partner replys */
1530 if (best->is_individual) { 1536 if (best->is_individual) {
1531 pr_warning("%s: Warning: No 802.3ad response from the link partner for any adapters in the bond\n", 1537 pr_warning("%s: Warning: No 802.3ad response from the link partner for any adapters in the bond\n",
1532 best->slave ? best->slave->bond->dev->name : "NULL"); 1538 best->slave ?
1539 best->slave->bond->dev->name : "NULL");
1533 } 1540 }
1534 1541
1535 best->is_active = 1; 1542 best->is_active = 1;
@@ -1541,7 +1548,7 @@ static void ad_agg_selection_logic(struct aggregator *agg)
1541 best->partner_oper_aggregator_key, 1548 best->partner_oper_aggregator_key,
1542 best->is_individual, best->is_active); 1549 best->is_individual, best->is_active);
1543 1550
1544 // disable the ports that were related to the former active_aggregator 1551 /* disable the ports that were related to the former active_aggregator */
1545 if (active) { 1552 if (active) {
1546 for (port = active->lag_ports; port; 1553 for (port = active->lag_ports; port;
1547 port = port->next_port_in_aggregator) { 1554 port = port->next_port_in_aggregator) {
@@ -1565,6 +1572,8 @@ static void ad_agg_selection_logic(struct aggregator *agg)
1565 } 1572 }
1566 } 1573 }
1567 1574
1575 rcu_read_unlock();
1576
1568 bond_3ad_set_carrier(bond); 1577 bond_3ad_set_carrier(bond);
1569} 1578}
1570 1579
@@ -2069,17 +2078,18 @@ void bond_3ad_state_machine_handler(struct work_struct *work)
2069 struct port *port; 2078 struct port *port;
2070 2079
2071 read_lock(&bond->lock); 2080 read_lock(&bond->lock);
2081 rcu_read_lock();
2072 2082
2073 //check if there are any slaves 2083 /* check if there are any slaves */
2074 if (!bond_has_slaves(bond)) 2084 if (!bond_has_slaves(bond))
2075 goto re_arm; 2085 goto re_arm;
2076 2086
2077 // check if agg_select_timer timer after initialize is timed out 2087 /* check if agg_select_timer timer after initialize is timed out */
2078 if (BOND_AD_INFO(bond).agg_select_timer && !(--BOND_AD_INFO(bond).agg_select_timer)) { 2088 if (BOND_AD_INFO(bond).agg_select_timer && !(--BOND_AD_INFO(bond).agg_select_timer)) {
2079 slave = bond_first_slave(bond); 2089 slave = bond_first_slave_rcu(bond);
2080 port = slave ? &(SLAVE_AD_INFO(slave).port) : NULL; 2090 port = slave ? &(SLAVE_AD_INFO(slave).port) : NULL;
2081 2091
2082 // select the active aggregator for the bond 2092 /* select the active aggregator for the bond */
2083 if (port) { 2093 if (port) {
2084 if (!port->slave) { 2094 if (!port->slave) {
2085 pr_warning("%s: Warning: bond's first port is uninitialized\n", 2095 pr_warning("%s: Warning: bond's first port is uninitialized\n",
@@ -2093,8 +2103,8 @@ void bond_3ad_state_machine_handler(struct work_struct *work)
2093 bond_3ad_set_carrier(bond); 2103 bond_3ad_set_carrier(bond);
2094 } 2104 }
2095 2105
2096 // for each port run the state machines 2106 /* for each port run the state machines */
2097 bond_for_each_slave(bond, slave, iter) { 2107 bond_for_each_slave_rcu(bond, slave, iter) {
2098 port = &(SLAVE_AD_INFO(slave).port); 2108 port = &(SLAVE_AD_INFO(slave).port);
2099 if (!port->slave) { 2109 if (!port->slave) {
2100 pr_warning("%s: Warning: Found an uninitialized port\n", 2110 pr_warning("%s: Warning: Found an uninitialized port\n",
@@ -2114,7 +2124,7 @@ void bond_3ad_state_machine_handler(struct work_struct *work)
2114 ad_mux_machine(port); 2124 ad_mux_machine(port);
2115 ad_tx_machine(port); 2125 ad_tx_machine(port);
2116 2126
2117 // turn off the BEGIN bit, since we already handled it 2127 /* turn off the BEGIN bit, since we already handled it */
2118 if (port->sm_vars & AD_PORT_BEGIN) 2128 if (port->sm_vars & AD_PORT_BEGIN)
2119 port->sm_vars &= ~AD_PORT_BEGIN; 2129 port->sm_vars &= ~AD_PORT_BEGIN;
2120 2130
@@ -2122,9 +2132,9 @@ void bond_3ad_state_machine_handler(struct work_struct *work)
2122 } 2132 }
2123 2133
2124re_arm: 2134re_arm:
2125 queue_delayed_work(bond->wq, &bond->ad_work, ad_delta_in_ticks); 2135 rcu_read_unlock();
2126
2127 read_unlock(&bond->lock); 2136 read_unlock(&bond->lock);
2137 queue_delayed_work(bond->wq, &bond->ad_work, ad_delta_in_ticks);
2128} 2138}
2129 2139
2130/** 2140/**
@@ -2303,7 +2313,9 @@ int bond_3ad_set_carrier(struct bonding *bond)
2303 struct aggregator *active; 2313 struct aggregator *active;
2304 struct slave *first_slave; 2314 struct slave *first_slave;
2305 2315
2306 first_slave = bond_first_slave(bond); 2316 rcu_read_lock();
2317 first_slave = bond_first_slave_rcu(bond);
2318 rcu_read_unlock();
2307 if (!first_slave) 2319 if (!first_slave)
2308 return 0; 2320 return 0;
2309 active = __get_active_agg(&(SLAVE_AD_INFO(first_slave).aggregator)); 2321 active = __get_active_agg(&(SLAVE_AD_INFO(first_slave).aggregator));
diff --git a/drivers/net/bonding/bond_alb.c b/drivers/net/bonding/bond_alb.c
index 2250b063ab89..759ddeebe390 100644
--- a/drivers/net/bonding/bond_alb.c
+++ b/drivers/net/bonding/bond_alb.c
@@ -469,7 +469,7 @@ static void rlb_teach_disabled_mac_on_primary(struct bonding *bond, u8 addr[])
469 469
470/* slave being removed should not be active at this point 470/* slave being removed should not be active at this point
471 * 471 *
472 * Caller must hold bond lock for read 472 * Caller must hold rtnl.
473 */ 473 */
474static void rlb_clear_slave(struct bonding *bond, struct slave *slave) 474static void rlb_clear_slave(struct bonding *bond, struct slave *slave)
475{ 475{
@@ -815,7 +815,7 @@ static void rlb_rebalance(struct bonding *bond)
815 for (; hash_index != RLB_NULL_INDEX; 815 for (; hash_index != RLB_NULL_INDEX;
816 hash_index = client_info->used_next) { 816 hash_index = client_info->used_next) {
817 client_info = &(bond_info->rx_hashtbl[hash_index]); 817 client_info = &(bond_info->rx_hashtbl[hash_index]);
818 assigned_slave = rlb_next_rx_slave(bond); 818 assigned_slave = __rlb_next_rx_slave(bond);
819 if (assigned_slave && (client_info->slave != assigned_slave)) { 819 if (assigned_slave && (client_info->slave != assigned_slave)) {
820 client_info->slave = assigned_slave; 820 client_info->slave = assigned_slave;
821 client_info->ntt = 1; 821 client_info->ntt = 1;
@@ -1494,14 +1494,14 @@ void bond_alb_monitor(struct work_struct *work)
1494 struct list_head *iter; 1494 struct list_head *iter;
1495 struct slave *slave; 1495 struct slave *slave;
1496 1496
1497 read_lock(&bond->lock);
1498
1499 if (!bond_has_slaves(bond)) { 1497 if (!bond_has_slaves(bond)) {
1500 bond_info->tx_rebalance_counter = 0; 1498 bond_info->tx_rebalance_counter = 0;
1501 bond_info->lp_counter = 0; 1499 bond_info->lp_counter = 0;
1502 goto re_arm; 1500 goto re_arm;
1503 } 1501 }
1504 1502
1503 rcu_read_lock();
1504
1505 bond_info->tx_rebalance_counter++; 1505 bond_info->tx_rebalance_counter++;
1506 bond_info->lp_counter++; 1506 bond_info->lp_counter++;
1507 1507
@@ -1514,7 +1514,7 @@ void bond_alb_monitor(struct work_struct *work)
1514 */ 1514 */
1515 read_lock(&bond->curr_slave_lock); 1515 read_lock(&bond->curr_slave_lock);
1516 1516
1517 bond_for_each_slave(bond, slave, iter) 1517 bond_for_each_slave_rcu(bond, slave, iter)
1518 alb_send_learning_packets(slave, slave->dev->dev_addr); 1518 alb_send_learning_packets(slave, slave->dev->dev_addr);
1519 1519
1520 read_unlock(&bond->curr_slave_lock); 1520 read_unlock(&bond->curr_slave_lock);
@@ -1527,7 +1527,7 @@ void bond_alb_monitor(struct work_struct *work)
1527 1527
1528 read_lock(&bond->curr_slave_lock); 1528 read_lock(&bond->curr_slave_lock);
1529 1529
1530 bond_for_each_slave(bond, slave, iter) { 1530 bond_for_each_slave_rcu(bond, slave, iter) {
1531 tlb_clear_slave(bond, slave, 1); 1531 tlb_clear_slave(bond, slave, 1);
1532 if (slave == bond->curr_active_slave) { 1532 if (slave == bond->curr_active_slave) {
1533 SLAVE_TLB_INFO(slave).load = 1533 SLAVE_TLB_INFO(slave).load =
@@ -1551,11 +1551,9 @@ void bond_alb_monitor(struct work_struct *work)
1551 * dev_set_promiscuity requires rtnl and 1551 * dev_set_promiscuity requires rtnl and
1552 * nothing else. Avoid race with bond_close. 1552 * nothing else. Avoid race with bond_close.
1553 */ 1553 */
1554 read_unlock(&bond->lock); 1554 rcu_read_unlock();
1555 if (!rtnl_trylock()) { 1555 if (!rtnl_trylock())
1556 read_lock(&bond->lock);
1557 goto re_arm; 1556 goto re_arm;
1558 }
1559 1557
1560 bond_info->rlb_promisc_timeout_counter = 0; 1558 bond_info->rlb_promisc_timeout_counter = 0;
1561 1559
@@ -1567,7 +1565,7 @@ void bond_alb_monitor(struct work_struct *work)
1567 bond_info->primary_is_promisc = 0; 1565 bond_info->primary_is_promisc = 0;
1568 1566
1569 rtnl_unlock(); 1567 rtnl_unlock();
1570 read_lock(&bond->lock); 1568 rcu_read_lock();
1571 } 1569 }
1572 1570
1573 if (bond_info->rlb_rebalance) { 1571 if (bond_info->rlb_rebalance) {
@@ -1589,11 +1587,9 @@ void bond_alb_monitor(struct work_struct *work)
1589 } 1587 }
1590 } 1588 }
1591 } 1589 }
1592 1590 rcu_read_unlock();
1593re_arm: 1591re_arm:
1594 queue_delayed_work(bond->wq, &bond->alb_work, alb_delta_in_ticks); 1592 queue_delayed_work(bond->wq, &bond->alb_work, alb_delta_in_ticks);
1595
1596 read_unlock(&bond->lock);
1597} 1593}
1598 1594
1599/* assumption: called before the slave is attached to the bond 1595/* assumption: called before the slave is attached to the bond
@@ -1679,14 +1675,11 @@ void bond_alb_handle_link_change(struct bonding *bond, struct slave *slave, char
1679 * If new_slave is NULL, caller must hold curr_slave_lock or 1675 * If new_slave is NULL, caller must hold curr_slave_lock or
1680 * bond->lock for write. 1676 * bond->lock for write.
1681 * 1677 *
1682 * If new_slave is not NULL, caller must hold RTNL, bond->lock for 1678 * If new_slave is not NULL, caller must hold RTNL, curr_slave_lock
1683 * read and curr_slave_lock for write. Processing here may sleep, so 1679 * for write. Processing here may sleep, so no other locks may be held.
1684 * no other locks may be held.
1685 */ 1680 */
1686void bond_alb_handle_active_change(struct bonding *bond, struct slave *new_slave) 1681void bond_alb_handle_active_change(struct bonding *bond, struct slave *new_slave)
1687 __releases(&bond->curr_slave_lock) 1682 __releases(&bond->curr_slave_lock)
1688 __releases(&bond->lock)
1689 __acquires(&bond->lock)
1690 __acquires(&bond->curr_slave_lock) 1683 __acquires(&bond->curr_slave_lock)
1691{ 1684{
1692 struct slave *swap_slave; 1685 struct slave *swap_slave;
@@ -1722,7 +1715,6 @@ void bond_alb_handle_active_change(struct bonding *bond, struct slave *new_slave
1722 tlb_clear_slave(bond, new_slave, 1); 1715 tlb_clear_slave(bond, new_slave, 1);
1723 1716
1724 write_unlock_bh(&bond->curr_slave_lock); 1717 write_unlock_bh(&bond->curr_slave_lock);
1725 read_unlock(&bond->lock);
1726 1718
1727 ASSERT_RTNL(); 1719 ASSERT_RTNL();
1728 1720
@@ -1748,11 +1740,9 @@ void bond_alb_handle_active_change(struct bonding *bond, struct slave *new_slave
1748 /* swap mac address */ 1740 /* swap mac address */
1749 alb_swap_mac_addr(swap_slave, new_slave); 1741 alb_swap_mac_addr(swap_slave, new_slave);
1750 alb_fasten_mac_swap(bond, swap_slave, new_slave); 1742 alb_fasten_mac_swap(bond, swap_slave, new_slave);
1751 read_lock(&bond->lock);
1752 } else { 1743 } else {
1753 /* set the new_slave to the bond mac address */ 1744 /* set the new_slave to the bond mac address */
1754 alb_set_slave_mac_addr(new_slave, bond->dev->dev_addr); 1745 alb_set_slave_mac_addr(new_slave, bond->dev->dev_addr);
1755 read_lock(&bond->lock);
1756 alb_send_learning_packets(new_slave, bond->dev->dev_addr); 1746 alb_send_learning_packets(new_slave, bond->dev->dev_addr);
1757 } 1747 }
1758 1748
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
index 398e299ee1bd..c0456cc86610 100644
--- a/drivers/net/bonding/bond_main.c
+++ b/drivers/net/bonding/bond_main.c
@@ -591,33 +591,22 @@ static int bond_set_allmulti(struct bonding *bond, int inc)
591 * device and retransmit an IGMP JOIN request to the current active 591 * device and retransmit an IGMP JOIN request to the current active
592 * slave. 592 * slave.
593 */ 593 */
594static void bond_resend_igmp_join_requests(struct bonding *bond) 594static void bond_resend_igmp_join_requests_delayed(struct work_struct *work)
595{ 595{
596 struct bonding *bond = container_of(work, struct bonding,
597 mcast_work.work);
598
596 if (!rtnl_trylock()) { 599 if (!rtnl_trylock()) {
597 queue_delayed_work(bond->wq, &bond->mcast_work, 1); 600 queue_delayed_work(bond->wq, &bond->mcast_work, 1);
598 return; 601 return;
599 } 602 }
600 call_netdevice_notifiers(NETDEV_RESEND_IGMP, bond->dev); 603 call_netdevice_notifiers(NETDEV_RESEND_IGMP, bond->dev);
601 rtnl_unlock();
602 604
603 /* We use curr_slave_lock to protect against concurrent access to
604 * igmp_retrans from multiple running instances of this function and
605 * bond_change_active_slave
606 */
607 write_lock_bh(&bond->curr_slave_lock);
608 if (bond->igmp_retrans > 1) { 605 if (bond->igmp_retrans > 1) {
609 bond->igmp_retrans--; 606 bond->igmp_retrans--;
610 queue_delayed_work(bond->wq, &bond->mcast_work, HZ/5); 607 queue_delayed_work(bond->wq, &bond->mcast_work, HZ/5);
611 } 608 }
612 write_unlock_bh(&bond->curr_slave_lock); 609 rtnl_unlock();
613}
614
615static void bond_resend_igmp_join_requests_delayed(struct work_struct *work)
616{
617 struct bonding *bond = container_of(work, struct bonding,
618 mcast_work.work);
619
620 bond_resend_igmp_join_requests(bond);
621} 610}
622 611
623/* Flush bond's hardware addresses from slave 612/* Flush bond's hardware addresses from slave
@@ -697,14 +686,12 @@ static void bond_set_dev_addr(struct net_device *bond_dev,
697 * 686 *
698 * Perform special MAC address swapping for fail_over_mac settings 687 * Perform special MAC address swapping for fail_over_mac settings
699 * 688 *
700 * Called with RTNL, bond->lock for read, curr_slave_lock for write_bh. 689 * Called with RTNL, curr_slave_lock for write_bh.
701 */ 690 */
702static void bond_do_fail_over_mac(struct bonding *bond, 691static void bond_do_fail_over_mac(struct bonding *bond,
703 struct slave *new_active, 692 struct slave *new_active,
704 struct slave *old_active) 693 struct slave *old_active)
705 __releases(&bond->curr_slave_lock) 694 __releases(&bond->curr_slave_lock)
706 __releases(&bond->lock)
707 __acquires(&bond->lock)
708 __acquires(&bond->curr_slave_lock) 695 __acquires(&bond->curr_slave_lock)
709{ 696{
710 u8 tmp_mac[ETH_ALEN]; 697 u8 tmp_mac[ETH_ALEN];
@@ -715,9 +702,7 @@ static void bond_do_fail_over_mac(struct bonding *bond,
715 case BOND_FOM_ACTIVE: 702 case BOND_FOM_ACTIVE:
716 if (new_active) { 703 if (new_active) {
717 write_unlock_bh(&bond->curr_slave_lock); 704 write_unlock_bh(&bond->curr_slave_lock);
718 read_unlock(&bond->lock);
719 bond_set_dev_addr(bond->dev, new_active->dev); 705 bond_set_dev_addr(bond->dev, new_active->dev);
720 read_lock(&bond->lock);
721 write_lock_bh(&bond->curr_slave_lock); 706 write_lock_bh(&bond->curr_slave_lock);
722 } 707 }
723 break; 708 break;
@@ -731,7 +716,6 @@ static void bond_do_fail_over_mac(struct bonding *bond,
731 return; 716 return;
732 717
733 write_unlock_bh(&bond->curr_slave_lock); 718 write_unlock_bh(&bond->curr_slave_lock);
734 read_unlock(&bond->lock);
735 719
736 if (old_active) { 720 if (old_active) {
737 memcpy(tmp_mac, new_active->dev->dev_addr, ETH_ALEN); 721 memcpy(tmp_mac, new_active->dev->dev_addr, ETH_ALEN);
@@ -761,7 +745,6 @@ static void bond_do_fail_over_mac(struct bonding *bond,
761 pr_err("%s: Error %d setting MAC of slave %s\n", 745 pr_err("%s: Error %d setting MAC of slave %s\n",
762 bond->dev->name, -rv, new_active->dev->name); 746 bond->dev->name, -rv, new_active->dev->name);
763out: 747out:
764 read_lock(&bond->lock);
765 write_lock_bh(&bond->curr_slave_lock); 748 write_lock_bh(&bond->curr_slave_lock);
766 break; 749 break;
767 default: 750 default:
@@ -821,7 +804,11 @@ static struct slave *bond_find_best_slave(struct bonding *bond)
821 804
822static bool bond_should_notify_peers(struct bonding *bond) 805static bool bond_should_notify_peers(struct bonding *bond)
823{ 806{
824 struct slave *slave = bond->curr_active_slave; 807 struct slave *slave;
808
809 rcu_read_lock();
810 slave = rcu_dereference(bond->curr_active_slave);
811 rcu_read_unlock();
825 812
826 pr_debug("bond_should_notify_peers: bond %s slave %s\n", 813 pr_debug("bond_should_notify_peers: bond %s slave %s\n",
827 bond->dev->name, slave ? slave->dev->name : "NULL"); 814 bond->dev->name, slave ? slave->dev->name : "NULL");
@@ -846,8 +833,7 @@ static bool bond_should_notify_peers(struct bonding *bond)
846 * because it is apparently the best available slave we have, even though its 833 * because it is apparently the best available slave we have, even though its
847 * updelay hasn't timed out yet. 834 * updelay hasn't timed out yet.
848 * 835 *
849 * If new_active is not NULL, caller must hold bond->lock for read and 836 * If new_active is not NULL, caller must hold curr_slave_lock for write_bh.
850 * curr_slave_lock for write_bh.
851 */ 837 */
852void bond_change_active_slave(struct bonding *bond, struct slave *new_active) 838void bond_change_active_slave(struct bonding *bond, struct slave *new_active)
853{ 839{
@@ -916,14 +902,12 @@ void bond_change_active_slave(struct bonding *bond, struct slave *new_active)
916 } 902 }
917 903
918 write_unlock_bh(&bond->curr_slave_lock); 904 write_unlock_bh(&bond->curr_slave_lock);
919 read_unlock(&bond->lock);
920 905
921 call_netdevice_notifiers(NETDEV_BONDING_FAILOVER, bond->dev); 906 call_netdevice_notifiers(NETDEV_BONDING_FAILOVER, bond->dev);
922 if (should_notify_peers) 907 if (should_notify_peers)
923 call_netdevice_notifiers(NETDEV_NOTIFY_PEERS, 908 call_netdevice_notifiers(NETDEV_NOTIFY_PEERS,
924 bond->dev); 909 bond->dev);
925 910
926 read_lock(&bond->lock);
927 write_lock_bh(&bond->curr_slave_lock); 911 write_lock_bh(&bond->curr_slave_lock);
928 } 912 }
929 } 913 }
@@ -949,7 +933,7 @@ void bond_change_active_slave(struct bonding *bond, struct slave *new_active)
949 * - The primary_slave has got its link back. 933 * - The primary_slave has got its link back.
950 * - A slave has got its link back and there's no old curr_active_slave. 934 * - A slave has got its link back and there's no old curr_active_slave.
951 * 935 *
952 * Caller must hold bond->lock for read and curr_slave_lock for write_bh. 936 * Caller must hold curr_slave_lock for write_bh.
953 */ 937 */
954void bond_select_active_slave(struct bonding *bond) 938void bond_select_active_slave(struct bonding *bond)
955{ 939{
@@ -1594,11 +1578,9 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
1594 bond_set_carrier(bond); 1578 bond_set_carrier(bond);
1595 1579
1596 if (USES_PRIMARY(bond->params.mode)) { 1580 if (USES_PRIMARY(bond->params.mode)) {
1597 read_lock(&bond->lock);
1598 write_lock_bh(&bond->curr_slave_lock); 1581 write_lock_bh(&bond->curr_slave_lock);
1599 bond_select_active_slave(bond); 1582 bond_select_active_slave(bond);
1600 write_unlock_bh(&bond->curr_slave_lock); 1583 write_unlock_bh(&bond->curr_slave_lock);
1601 read_unlock(&bond->lock);
1602 } 1584 }
1603 1585
1604 pr_info("%s: enslaving %s as a%s interface with a%s link.\n", 1586 pr_info("%s: enslaving %s as a%s interface with a%s link.\n",
@@ -1618,19 +1600,13 @@ err_detach:
1618 bond_hw_addr_flush(bond_dev, slave_dev); 1600 bond_hw_addr_flush(bond_dev, slave_dev);
1619 1601
1620 vlan_vids_del_by_dev(slave_dev, bond_dev); 1602 vlan_vids_del_by_dev(slave_dev, bond_dev);
1621 write_lock_bh(&bond->lock);
1622 if (bond->primary_slave == new_slave) 1603 if (bond->primary_slave == new_slave)
1623 bond->primary_slave = NULL; 1604 bond->primary_slave = NULL;
1624 if (bond->curr_active_slave == new_slave) { 1605 if (bond->curr_active_slave == new_slave) {
1625 bond_change_active_slave(bond, NULL);
1626 write_unlock_bh(&bond->lock);
1627 read_lock(&bond->lock);
1628 write_lock_bh(&bond->curr_slave_lock); 1606 write_lock_bh(&bond->curr_slave_lock);
1607 bond_change_active_slave(bond, NULL);
1629 bond_select_active_slave(bond); 1608 bond_select_active_slave(bond);
1630 write_unlock_bh(&bond->curr_slave_lock); 1609 write_unlock_bh(&bond->curr_slave_lock);
1631 read_unlock(&bond->lock);
1632 } else {
1633 write_unlock_bh(&bond->lock);
1634 } 1610 }
1635 slave_disable_netpoll(new_slave); 1611 slave_disable_netpoll(new_slave);
1636 1612
@@ -1695,20 +1671,16 @@ static int __bond_release_one(struct net_device *bond_dev,
1695 } 1671 }
1696 1672
1697 block_netpoll_tx(); 1673 block_netpoll_tx();
1698 write_lock_bh(&bond->lock);
1699 1674
1700 slave = bond_get_slave_by_dev(bond, slave_dev); 1675 slave = bond_get_slave_by_dev(bond, slave_dev);
1701 if (!slave) { 1676 if (!slave) {
1702 /* not a slave of this bond */ 1677 /* not a slave of this bond */
1703 pr_info("%s: %s not enslaved\n", 1678 pr_info("%s: %s not enslaved\n",
1704 bond_dev->name, slave_dev->name); 1679 bond_dev->name, slave_dev->name);
1705 write_unlock_bh(&bond->lock);
1706 unblock_netpoll_tx(); 1680 unblock_netpoll_tx();
1707 return -EINVAL; 1681 return -EINVAL;
1708 } 1682 }
1709 1683
1710 write_unlock_bh(&bond->lock);
1711
1712 /* release the slave from its bond */ 1684 /* release the slave from its bond */
1713 bond->slave_cnt--; 1685 bond->slave_cnt--;
1714 1686
@@ -1720,12 +1692,10 @@ static int __bond_release_one(struct net_device *bond_dev,
1720 write_lock_bh(&bond->lock); 1692 write_lock_bh(&bond->lock);
1721 1693
1722 /* Inform AD package of unbinding of slave. */ 1694 /* Inform AD package of unbinding of slave. */
1723 if (bond->params.mode == BOND_MODE_8023AD) { 1695 if (bond->params.mode == BOND_MODE_8023AD)
1724 /* must be called before the slave is
1725 * detached from the list
1726 */
1727 bond_3ad_unbind_slave(slave); 1696 bond_3ad_unbind_slave(slave);
1728 } 1697
1698 write_unlock_bh(&bond->lock);
1729 1699
1730 pr_info("%s: releasing %s interface %s\n", 1700 pr_info("%s: releasing %s interface %s\n",
1731 bond_dev->name, 1701 bond_dev->name,
@@ -1748,8 +1718,11 @@ static int __bond_release_one(struct net_device *bond_dev,
1748 if (bond->primary_slave == slave) 1718 if (bond->primary_slave == slave)
1749 bond->primary_slave = NULL; 1719 bond->primary_slave = NULL;
1750 1720
1751 if (oldcurrent == slave) 1721 if (oldcurrent == slave) {
1722 write_lock_bh(&bond->curr_slave_lock);
1752 bond_change_active_slave(bond, NULL); 1723 bond_change_active_slave(bond, NULL);
1724 write_unlock_bh(&bond->curr_slave_lock);
1725 }
1753 1726
1754 if (bond_is_lb(bond)) { 1727 if (bond_is_lb(bond)) {
1755 /* Must be called only after the slave has been 1728 /* Must be called only after the slave has been
@@ -1757,9 +1730,7 @@ static int __bond_release_one(struct net_device *bond_dev,
1757 * has been cleared (if our_slave == old_current), 1730 * has been cleared (if our_slave == old_current),
1758 * but before a new active slave is selected. 1731 * but before a new active slave is selected.
1759 */ 1732 */
1760 write_unlock_bh(&bond->lock);
1761 bond_alb_deinit_slave(bond, slave); 1733 bond_alb_deinit_slave(bond, slave);
1762 write_lock_bh(&bond->lock);
1763 } 1734 }
1764 1735
1765 if (all) { 1736 if (all) {
@@ -1770,15 +1741,11 @@ static int __bond_release_one(struct net_device *bond_dev,
1770 * is no concern that another slave add/remove event 1741 * is no concern that another slave add/remove event
1771 * will interfere. 1742 * will interfere.
1772 */ 1743 */
1773 write_unlock_bh(&bond->lock);
1774 read_lock(&bond->lock);
1775 write_lock_bh(&bond->curr_slave_lock); 1744 write_lock_bh(&bond->curr_slave_lock);
1776 1745
1777 bond_select_active_slave(bond); 1746 bond_select_active_slave(bond);
1778 1747
1779 write_unlock_bh(&bond->curr_slave_lock); 1748 write_unlock_bh(&bond->curr_slave_lock);
1780 read_unlock(&bond->lock);
1781 write_lock_bh(&bond->lock);
1782 } 1749 }
1783 1750
1784 if (!bond_has_slaves(bond)) { 1751 if (!bond_has_slaves(bond)) {
@@ -1793,7 +1760,6 @@ static int __bond_release_one(struct net_device *bond_dev,
1793 } 1760 }
1794 } 1761 }
1795 1762
1796 write_unlock_bh(&bond->lock);
1797 unblock_netpoll_tx(); 1763 unblock_netpoll_tx();
1798 synchronize_rcu(); 1764 synchronize_rcu();
1799 1765
@@ -1928,7 +1894,7 @@ static int bond_miimon_inspect(struct bonding *bond)
1928 1894
1929 ignore_updelay = !bond->curr_active_slave ? true : false; 1895 ignore_updelay = !bond->curr_active_slave ? true : false;
1930 1896
1931 bond_for_each_slave(bond, slave, iter) { 1897 bond_for_each_slave_rcu(bond, slave, iter) {
1932 slave->new_link = BOND_LINK_NOCHANGE; 1898 slave->new_link = BOND_LINK_NOCHANGE;
1933 1899
1934 link_state = bond_check_dev_link(bond, slave->dev, 0); 1900 link_state = bond_check_dev_link(bond, slave->dev, 0);
@@ -2126,41 +2092,35 @@ void bond_mii_monitor(struct work_struct *work)
2126 bool should_notify_peers = false; 2092 bool should_notify_peers = false;
2127 unsigned long delay; 2093 unsigned long delay;
2128 2094
2129 read_lock(&bond->lock);
2130
2131 delay = msecs_to_jiffies(bond->params.miimon); 2095 delay = msecs_to_jiffies(bond->params.miimon);
2132 2096
2133 if (!bond_has_slaves(bond)) 2097 if (!bond_has_slaves(bond))
2134 goto re_arm; 2098 goto re_arm;
2135 2099
2100 rcu_read_lock();
2101
2136 should_notify_peers = bond_should_notify_peers(bond); 2102 should_notify_peers = bond_should_notify_peers(bond);
2137 2103
2138 if (bond_miimon_inspect(bond)) { 2104 if (bond_miimon_inspect(bond)) {
2139 read_unlock(&bond->lock); 2105 rcu_read_unlock();
2140 2106
2141 /* Race avoidance with bond_close cancel of workqueue */ 2107 /* Race avoidance with bond_close cancel of workqueue */
2142 if (!rtnl_trylock()) { 2108 if (!rtnl_trylock()) {
2143 read_lock(&bond->lock);
2144 delay = 1; 2109 delay = 1;
2145 should_notify_peers = false; 2110 should_notify_peers = false;
2146 goto re_arm; 2111 goto re_arm;
2147 } 2112 }
2148 2113
2149 read_lock(&bond->lock);
2150
2151 bond_miimon_commit(bond); 2114 bond_miimon_commit(bond);
2152 2115
2153 read_unlock(&bond->lock);
2154 rtnl_unlock(); /* might sleep, hold no other locks */ 2116 rtnl_unlock(); /* might sleep, hold no other locks */
2155 read_lock(&bond->lock); 2117 } else
2156 } 2118 rcu_read_unlock();
2157 2119
2158re_arm: 2120re_arm:
2159 if (bond->params.miimon) 2121 if (bond->params.miimon)
2160 queue_delayed_work(bond->wq, &bond->mii_work, delay); 2122 queue_delayed_work(bond->wq, &bond->mii_work, delay);
2161 2123
2162 read_unlock(&bond->lock);
2163
2164 if (should_notify_peers) { 2124 if (should_notify_peers) {
2165 if (!rtnl_trylock()) 2125 if (!rtnl_trylock())
2166 return; 2126 return;
@@ -2422,12 +2382,12 @@ void bond_loadbalance_arp_mon(struct work_struct *work)
2422 struct list_head *iter; 2382 struct list_head *iter;
2423 int do_failover = 0; 2383 int do_failover = 0;
2424 2384
2425 read_lock(&bond->lock);
2426
2427 if (!bond_has_slaves(bond)) 2385 if (!bond_has_slaves(bond))
2428 goto re_arm; 2386 goto re_arm;
2429 2387
2430 oldcurrent = bond->curr_active_slave; 2388 rcu_read_lock();
2389
2390 oldcurrent = ACCESS_ONCE(bond->curr_active_slave);
2431 /* see if any of the previous devices are up now (i.e. they have 2391 /* see if any of the previous devices are up now (i.e. they have
2432 * xmt and rcv traffic). the curr_active_slave does not come into 2392 * xmt and rcv traffic). the curr_active_slave does not come into
2433 * the picture unless it is null. also, slave->jiffies is not needed 2393 * the picture unless it is null. also, slave->jiffies is not needed
@@ -2436,7 +2396,7 @@ void bond_loadbalance_arp_mon(struct work_struct *work)
2436 * TODO: what about up/down delay in arp mode? it wasn't here before 2396 * TODO: what about up/down delay in arp mode? it wasn't here before
2437 * so it can wait 2397 * so it can wait
2438 */ 2398 */
2439 bond_for_each_slave(bond, slave, iter) { 2399 bond_for_each_slave_rcu(bond, slave, iter) {
2440 unsigned long trans_start = dev_trans_start(slave->dev); 2400 unsigned long trans_start = dev_trans_start(slave->dev);
2441 2401
2442 if (slave->link != BOND_LINK_UP) { 2402 if (slave->link != BOND_LINK_UP) {
@@ -2498,7 +2458,14 @@ void bond_loadbalance_arp_mon(struct work_struct *work)
2498 bond_arp_send_all(bond, slave); 2458 bond_arp_send_all(bond, slave);
2499 } 2459 }
2500 2460
2461 rcu_read_unlock();
2462
2501 if (do_failover) { 2463 if (do_failover) {
2464 /* the bond_select_active_slave must hold RTNL
2465 * and curr_slave_lock for write.
2466 */
2467 if (!rtnl_trylock())
2468 goto re_arm;
2502 block_netpoll_tx(); 2469 block_netpoll_tx();
2503 write_lock_bh(&bond->curr_slave_lock); 2470 write_lock_bh(&bond->curr_slave_lock);
2504 2471
@@ -2506,14 +2473,13 @@ void bond_loadbalance_arp_mon(struct work_struct *work)
2506 2473
2507 write_unlock_bh(&bond->curr_slave_lock); 2474 write_unlock_bh(&bond->curr_slave_lock);
2508 unblock_netpoll_tx(); 2475 unblock_netpoll_tx();
2476 rtnl_unlock();
2509 } 2477 }
2510 2478
2511re_arm: 2479re_arm:
2512 if (bond->params.arp_interval) 2480 if (bond->params.arp_interval)
2513 queue_delayed_work(bond->wq, &bond->arp_work, 2481 queue_delayed_work(bond->wq, &bond->arp_work,
2514 msecs_to_jiffies(bond->params.arp_interval)); 2482 msecs_to_jiffies(bond->params.arp_interval));
2515
2516 read_unlock(&bond->lock);
2517} 2483}
2518 2484
2519/* 2485/*
@@ -2522,7 +2488,7 @@ re_arm:
2522 * place for the slave. Returns 0 if no changes are found, >0 if changes 2488 * place for the slave. Returns 0 if no changes are found, >0 if changes
2523 * to link states must be committed. 2489 * to link states must be committed.
2524 * 2490 *
2525 * Called with bond->lock held for read. 2491 * Called with rcu_read_lock hold.
2526 */ 2492 */
2527static int bond_ab_arp_inspect(struct bonding *bond) 2493static int bond_ab_arp_inspect(struct bonding *bond)
2528{ 2494{
@@ -2531,7 +2497,7 @@ static int bond_ab_arp_inspect(struct bonding *bond)
2531 struct slave *slave; 2497 struct slave *slave;
2532 int commit = 0; 2498 int commit = 0;
2533 2499
2534 bond_for_each_slave(bond, slave, iter) { 2500 bond_for_each_slave_rcu(bond, slave, iter) {
2535 slave->new_link = BOND_LINK_NOCHANGE; 2501 slave->new_link = BOND_LINK_NOCHANGE;
2536 last_rx = slave_last_rx(bond, slave); 2502 last_rx = slave_last_rx(bond, slave);
2537 2503
@@ -2593,7 +2559,7 @@ static int bond_ab_arp_inspect(struct bonding *bond)
2593 * Called to commit link state changes noted by inspection step of 2559 * Called to commit link state changes noted by inspection step of
2594 * active-backup mode ARP monitor. 2560 * active-backup mode ARP monitor.
2595 * 2561 *
2596 * Called with RTNL and bond->lock for read. 2562 * Called with RTNL hold.
2597 */ 2563 */
2598static void bond_ab_arp_commit(struct bonding *bond) 2564static void bond_ab_arp_commit(struct bonding *bond)
2599{ 2565{
@@ -2668,19 +2634,20 @@ do_failover:
2668/* 2634/*
2669 * Send ARP probes for active-backup mode ARP monitor. 2635 * Send ARP probes for active-backup mode ARP monitor.
2670 * 2636 *
2671 * Called with bond->lock held for read. 2637 * Called with rcu_read_lock hold.
2672 */ 2638 */
2673static void bond_ab_arp_probe(struct bonding *bond) 2639static void bond_ab_arp_probe(struct bonding *bond)
2674{ 2640{
2675 struct slave *slave, *before = NULL, *new_slave = NULL; 2641 struct slave *slave, *before = NULL, *new_slave = NULL,
2642 *curr_arp_slave = rcu_dereference(bond->current_arp_slave);
2676 struct list_head *iter; 2643 struct list_head *iter;
2677 bool found = false; 2644 bool found = false;
2678 2645
2679 read_lock(&bond->curr_slave_lock); 2646 read_lock(&bond->curr_slave_lock);
2680 2647
2681 if (bond->current_arp_slave && bond->curr_active_slave) 2648 if (curr_arp_slave && bond->curr_active_slave)
2682 pr_info("PROBE: c_arp %s && cas %s BAD\n", 2649 pr_info("PROBE: c_arp %s && cas %s BAD\n",
2683 bond->current_arp_slave->dev->name, 2650 curr_arp_slave->dev->name,
2684 bond->curr_active_slave->dev->name); 2651 bond->curr_active_slave->dev->name);
2685 2652
2686 if (bond->curr_active_slave) { 2653 if (bond->curr_active_slave) {
@@ -2696,15 +2663,15 @@ static void bond_ab_arp_probe(struct bonding *bond)
2696 * for becoming the curr_active_slave 2663 * for becoming the curr_active_slave
2697 */ 2664 */
2698 2665
2699 if (!bond->current_arp_slave) { 2666 if (!curr_arp_slave) {
2700 bond->current_arp_slave = bond_first_slave(bond); 2667 curr_arp_slave = bond_first_slave_rcu(bond);
2701 if (!bond->current_arp_slave) 2668 if (!curr_arp_slave)
2702 return; 2669 return;
2703 } 2670 }
2704 2671
2705 bond_set_slave_inactive_flags(bond->current_arp_slave); 2672 bond_set_slave_inactive_flags(curr_arp_slave);
2706 2673
2707 bond_for_each_slave(bond, slave, iter) { 2674 bond_for_each_slave_rcu(bond, slave, iter) {
2708 if (!found && !before && IS_UP(slave->dev)) 2675 if (!found && !before && IS_UP(slave->dev))
2709 before = slave; 2676 before = slave;
2710 2677
@@ -2727,7 +2694,7 @@ static void bond_ab_arp_probe(struct bonding *bond)
2727 pr_info("%s: backup interface %s is now down.\n", 2694 pr_info("%s: backup interface %s is now down.\n",
2728 bond->dev->name, slave->dev->name); 2695 bond->dev->name, slave->dev->name);
2729 } 2696 }
2730 if (slave == bond->current_arp_slave) 2697 if (slave == curr_arp_slave)
2731 found = true; 2698 found = true;
2732 } 2699 }
2733 2700
@@ -2741,8 +2708,7 @@ static void bond_ab_arp_probe(struct bonding *bond)
2741 bond_set_slave_active_flags(new_slave); 2708 bond_set_slave_active_flags(new_slave);
2742 bond_arp_send_all(bond, new_slave); 2709 bond_arp_send_all(bond, new_slave);
2743 new_slave->jiffies = jiffies; 2710 new_slave->jiffies = jiffies;
2744 bond->current_arp_slave = new_slave; 2711 rcu_assign_pointer(bond->current_arp_slave, new_slave);
2745
2746} 2712}
2747 2713
2748void bond_activebackup_arp_mon(struct work_struct *work) 2714void bond_activebackup_arp_mon(struct work_struct *work)
@@ -2752,43 +2718,38 @@ void bond_activebackup_arp_mon(struct work_struct *work)
2752 bool should_notify_peers = false; 2718 bool should_notify_peers = false;
2753 int delta_in_ticks; 2719 int delta_in_ticks;
2754 2720
2755 read_lock(&bond->lock);
2756
2757 delta_in_ticks = msecs_to_jiffies(bond->params.arp_interval); 2721 delta_in_ticks = msecs_to_jiffies(bond->params.arp_interval);
2758 2722
2759 if (!bond_has_slaves(bond)) 2723 if (!bond_has_slaves(bond))
2760 goto re_arm; 2724 goto re_arm;
2761 2725
2726 rcu_read_lock();
2727
2762 should_notify_peers = bond_should_notify_peers(bond); 2728 should_notify_peers = bond_should_notify_peers(bond);
2763 2729
2764 if (bond_ab_arp_inspect(bond)) { 2730 if (bond_ab_arp_inspect(bond)) {
2765 read_unlock(&bond->lock); 2731 rcu_read_unlock();
2766 2732
2767 /* Race avoidance with bond_close flush of workqueue */ 2733 /* Race avoidance with bond_close flush of workqueue */
2768 if (!rtnl_trylock()) { 2734 if (!rtnl_trylock()) {
2769 read_lock(&bond->lock);
2770 delta_in_ticks = 1; 2735 delta_in_ticks = 1;
2771 should_notify_peers = false; 2736 should_notify_peers = false;
2772 goto re_arm; 2737 goto re_arm;
2773 } 2738 }
2774 2739
2775 read_lock(&bond->lock);
2776
2777 bond_ab_arp_commit(bond); 2740 bond_ab_arp_commit(bond);
2778 2741
2779 read_unlock(&bond->lock);
2780 rtnl_unlock(); 2742 rtnl_unlock();
2781 read_lock(&bond->lock); 2743 rcu_read_lock();
2782 } 2744 }
2783 2745
2784 bond_ab_arp_probe(bond); 2746 bond_ab_arp_probe(bond);
2747 rcu_read_unlock();
2785 2748
2786re_arm: 2749re_arm:
2787 if (bond->params.arp_interval) 2750 if (bond->params.arp_interval)
2788 queue_delayed_work(bond->wq, &bond->arp_work, delta_in_ticks); 2751 queue_delayed_work(bond->wq, &bond->arp_work, delta_in_ticks);
2789 2752
2790 read_unlock(&bond->lock);
2791
2792 if (should_notify_peers) { 2753 if (should_notify_peers) {
2793 if (!rtnl_trylock()) 2754 if (!rtnl_trylock())
2794 return; 2755 return;
diff --git a/drivers/net/bonding/bond_options.c b/drivers/net/bonding/bond_options.c
index dfef673d53d1..600779e5904f 100644
--- a/drivers/net/bonding/bond_options.c
+++ b/drivers/net/bonding/bond_options.c
@@ -107,7 +107,6 @@ int bond_option_active_slave_set(struct bonding *bond,
107 } 107 }
108 108
109 block_netpoll_tx(); 109 block_netpoll_tx();
110 read_lock(&bond->lock);
111 write_lock_bh(&bond->curr_slave_lock); 110 write_lock_bh(&bond->curr_slave_lock);
112 111
113 /* check to see if we are clearing active */ 112 /* check to see if we are clearing active */
@@ -142,7 +141,6 @@ int bond_option_active_slave_set(struct bonding *bond,
142 } 141 }
143 142
144 write_unlock_bh(&bond->curr_slave_lock); 143 write_unlock_bh(&bond->curr_slave_lock);
145 read_unlock(&bond->lock);
146 unblock_netpoll_tx(); 144 unblock_netpoll_tx();
147 return ret; 145 return ret;
148} 146}
diff --git a/drivers/net/bonding/bond_sysfs.c b/drivers/net/bonding/bond_sysfs.c
index dad9bea95122..6368d299d5a6 100644
--- a/drivers/net/bonding/bond_sysfs.c
+++ b/drivers/net/bonding/bond_sysfs.c
@@ -878,7 +878,6 @@ static ssize_t bonding_store_primary(struct device *d,
878 if (!rtnl_trylock()) 878 if (!rtnl_trylock())
879 return restart_syscall(); 879 return restart_syscall();
880 block_netpoll_tx(); 880 block_netpoll_tx();
881 read_lock(&bond->lock);
882 write_lock_bh(&bond->curr_slave_lock); 881 write_lock_bh(&bond->curr_slave_lock);
883 882
884 if (!USES_PRIMARY(bond->params.mode)) { 883 if (!USES_PRIMARY(bond->params.mode)) {
@@ -918,7 +917,6 @@ static ssize_t bonding_store_primary(struct device *d,
918 bond->dev->name, ifname, bond->dev->name); 917 bond->dev->name, ifname, bond->dev->name);
919out: 918out:
920 write_unlock_bh(&bond->curr_slave_lock); 919 write_unlock_bh(&bond->curr_slave_lock);
921 read_unlock(&bond->lock);
922 unblock_netpoll_tx(); 920 unblock_netpoll_tx();
923 rtnl_unlock(); 921 rtnl_unlock();
924 922
@@ -966,11 +964,9 @@ static ssize_t bonding_store_primary_reselect(struct device *d,
966 new_value); 964 new_value);
967 965
968 block_netpoll_tx(); 966 block_netpoll_tx();
969 read_lock(&bond->lock);
970 write_lock_bh(&bond->curr_slave_lock); 967 write_lock_bh(&bond->curr_slave_lock);
971 bond_select_active_slave(bond); 968 bond_select_active_slave(bond);
972 write_unlock_bh(&bond->curr_slave_lock); 969 write_unlock_bh(&bond->curr_slave_lock);
973 read_unlock(&bond->lock);
974 unblock_netpoll_tx(); 970 unblock_netpoll_tx();
975out: 971out:
976 rtnl_unlock(); 972 rtnl_unlock();
diff --git a/drivers/net/bonding/bonding.h b/drivers/net/bonding/bonding.h
index 8283cbdec50a..8f0d6d0c383b 100644
--- a/drivers/net/bonding/bonding.h
+++ b/drivers/net/bonding/bonding.h
@@ -101,6 +101,10 @@
101 netdev_adjacent_get_private(bond_slave_list(bond)->prev) : \ 101 netdev_adjacent_get_private(bond_slave_list(bond)->prev) : \
102 NULL) 102 NULL)
103 103
104/* Caller must have rcu_read_lock */
105#define bond_first_slave_rcu(bond) \
106 netdev_lower_get_first_private_rcu(bond->dev)
107
104#define bond_is_first_slave(bond, pos) (pos == bond_first_slave(bond)) 108#define bond_is_first_slave(bond, pos) (pos == bond_first_slave(bond))
105#define bond_is_last_slave(bond, pos) (pos == bond_last_slave(bond)) 109#define bond_is_last_slave(bond, pos) (pos == bond_last_slave(bond))
106 110
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 5260d2eae2e6..2c74d20dad34 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -2907,6 +2907,7 @@ void *netdev_lower_get_next_private_rcu(struct net_device *dev,
2907 priv = netdev_lower_get_next_private_rcu(dev, &(iter))) 2907 priv = netdev_lower_get_next_private_rcu(dev, &(iter)))
2908 2908
2909void *netdev_adjacent_get_private(struct list_head *adj_list); 2909void *netdev_adjacent_get_private(struct list_head *adj_list);
2910void *netdev_lower_get_first_private_rcu(struct net_device *dev);
2910struct net_device *netdev_master_upper_dev_get(struct net_device *dev); 2911struct net_device *netdev_master_upper_dev_get(struct net_device *dev);
2911struct net_device *netdev_master_upper_dev_get_rcu(struct net_device *dev); 2912struct net_device *netdev_master_upper_dev_get_rcu(struct net_device *dev);
2912int netdev_upper_dev_link(struct net_device *dev, struct net_device *upper_dev); 2913int netdev_upper_dev_link(struct net_device *dev, struct net_device *upper_dev);
diff --git a/net/core/dev.c b/net/core/dev.c
index c95d664b2b42..9d4369ece679 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -4544,6 +4544,27 @@ void *netdev_lower_get_next_private_rcu(struct net_device *dev,
4544EXPORT_SYMBOL(netdev_lower_get_next_private_rcu); 4544EXPORT_SYMBOL(netdev_lower_get_next_private_rcu);
4545 4545
4546/** 4546/**
4547 * netdev_lower_get_first_private_rcu - Get the first ->private from the
4548 * lower neighbour list, RCU
4549 * variant
4550 * @dev: device
4551 *
4552 * Gets the first netdev_adjacent->private from the dev's lower neighbour
4553 * list. The caller must hold RCU read lock.
4554 */
4555void *netdev_lower_get_first_private_rcu(struct net_device *dev)
4556{
4557 struct netdev_adjacent *lower;
4558
4559 lower = list_first_or_null_rcu(&dev->adj_list.lower,
4560 struct netdev_adjacent, list);
4561 if (lower)
4562 return lower->private;
4563 return NULL;
4564}
4565EXPORT_SYMBOL(netdev_lower_get_first_private_rcu);
4566
4567/**
4547 * netdev_master_upper_dev_get_rcu - Get master upper device 4568 * netdev_master_upper_dev_get_rcu - Get master upper device
4548 * @dev: device 4569 * @dev: device
4549 * 4570 *