diff options
author | David S. Miller <davem@davemloft.net> | 2013-10-28 00:11:22 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-10-28 00:11:22 -0400 |
commit | 1f2cd845d3827412e82bf26dde0abca332ede402 (patch) | |
tree | 370a0880f1fb5381925f8f602b2ba99f3904856f /drivers/net/bonding/bond_alb.c | |
parent | 6384a4d0dcf9e28f5aa5e0c8a7e58e7b4df19e68 (diff) |
Revert "Merge branch 'bonding_monitor_locking'"
This reverts commit 4d961a101e032b4bf223b279b4b35bc77576f5a8, reversing
changes made to a00f6fcc7d0c62a91768d9c4ccba4c7d64fbbce3.
Revert bond locking changes, they cause regressions and Veaceslav Falico
doesn't like how the commit messages were done at all.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/bonding/bond_alb.c')
-rw-r--r-- | drivers/net/bonding/bond_alb.c | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/drivers/net/bonding/bond_alb.c b/drivers/net/bonding/bond_alb.c index 5d79f5e529e0..02872405d35d 100644 --- a/drivers/net/bonding/bond_alb.c +++ b/drivers/net/bonding/bond_alb.c | |||
@@ -1495,13 +1495,11 @@ void bond_alb_monitor(struct work_struct *work) | |||
1495 | struct list_head *iter; | 1495 | struct list_head *iter; |
1496 | struct slave *slave; | 1496 | struct slave *slave; |
1497 | 1497 | ||
1498 | if (!rtnl_trylock()) | 1498 | read_lock(&bond->lock); |
1499 | goto re_arm; | ||
1500 | 1499 | ||
1501 | if (!bond_has_slaves(bond)) { | 1500 | if (!bond_has_slaves(bond)) { |
1502 | bond_info->tx_rebalance_counter = 0; | 1501 | bond_info->tx_rebalance_counter = 0; |
1503 | bond_info->lp_counter = 0; | 1502 | bond_info->lp_counter = 0; |
1504 | rtnl_unlock(); | ||
1505 | goto re_arm; | 1503 | goto re_arm; |
1506 | } | 1504 | } |
1507 | 1505 | ||
@@ -1550,6 +1548,16 @@ void bond_alb_monitor(struct work_struct *work) | |||
1550 | if (bond_info->primary_is_promisc && | 1548 | if (bond_info->primary_is_promisc && |
1551 | (++bond_info->rlb_promisc_timeout_counter >= RLB_PROMISC_TIMEOUT)) { | 1549 | (++bond_info->rlb_promisc_timeout_counter >= RLB_PROMISC_TIMEOUT)) { |
1552 | 1550 | ||
1551 | /* | ||
1552 | * dev_set_promiscuity requires rtnl and | ||
1553 | * nothing else. Avoid race with bond_close. | ||
1554 | */ | ||
1555 | read_unlock(&bond->lock); | ||
1556 | if (!rtnl_trylock()) { | ||
1557 | read_lock(&bond->lock); | ||
1558 | goto re_arm; | ||
1559 | } | ||
1560 | |||
1553 | bond_info->rlb_promisc_timeout_counter = 0; | 1561 | bond_info->rlb_promisc_timeout_counter = 0; |
1554 | 1562 | ||
1555 | /* If the primary was set to promiscuous mode | 1563 | /* If the primary was set to promiscuous mode |
@@ -1558,6 +1566,9 @@ void bond_alb_monitor(struct work_struct *work) | |||
1558 | */ | 1566 | */ |
1559 | dev_set_promiscuity(bond->curr_active_slave->dev, -1); | 1567 | dev_set_promiscuity(bond->curr_active_slave->dev, -1); |
1560 | bond_info->primary_is_promisc = 0; | 1568 | bond_info->primary_is_promisc = 0; |
1569 | |||
1570 | rtnl_unlock(); | ||
1571 | read_lock(&bond->lock); | ||
1561 | } | 1572 | } |
1562 | 1573 | ||
1563 | if (bond_info->rlb_rebalance) { | 1574 | if (bond_info->rlb_rebalance) { |
@@ -1580,9 +1591,10 @@ void bond_alb_monitor(struct work_struct *work) | |||
1580 | } | 1591 | } |
1581 | } | 1592 | } |
1582 | 1593 | ||
1583 | rtnl_unlock(); | ||
1584 | re_arm: | 1594 | re_arm: |
1585 | queue_delayed_work(bond->wq, &bond->alb_work, alb_delta_in_ticks); | 1595 | queue_delayed_work(bond->wq, &bond->alb_work, alb_delta_in_ticks); |
1596 | |||
1597 | read_unlock(&bond->lock); | ||
1586 | } | 1598 | } |
1587 | 1599 | ||
1588 | /* assumption: called before the slave is attached to the bond | 1600 | /* assumption: called before the slave is attached to the bond |