diff options
Diffstat (limited to 'drivers/net/bonding/bond_3ad.c')
| -rw-r--r-- | drivers/net/bonding/bond_3ad.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/drivers/net/bonding/bond_3ad.c b/drivers/net/bonding/bond_3ad.c index 6d20fbde8d43..dcde56057fe1 100644 --- a/drivers/net/bonding/bond_3ad.c +++ b/drivers/net/bonding/bond_3ad.c | |||
| @@ -181,7 +181,7 @@ static inline int __agg_has_partner(struct aggregator *agg) | |||
| 181 | */ | 181 | */ |
| 182 | static inline void __disable_port(struct port *port) | 182 | static inline void __disable_port(struct port *port) |
| 183 | { | 183 | { |
| 184 | bond_set_slave_inactive_flags(port->slave); | 184 | bond_set_slave_inactive_flags(port->slave, BOND_SLAVE_NOTIFY_LATER); |
| 185 | } | 185 | } |
| 186 | 186 | ||
| 187 | /** | 187 | /** |
| @@ -193,7 +193,7 @@ static inline void __enable_port(struct port *port) | |||
| 193 | struct slave *slave = port->slave; | 193 | struct slave *slave = port->slave; |
| 194 | 194 | ||
| 195 | if ((slave->link == BOND_LINK_UP) && IS_UP(slave->dev)) | 195 | if ((slave->link == BOND_LINK_UP) && IS_UP(slave->dev)) |
| 196 | bond_set_slave_active_flags(slave); | 196 | bond_set_slave_active_flags(slave, BOND_SLAVE_NOTIFY_LATER); |
| 197 | } | 197 | } |
| 198 | 198 | ||
| 199 | /** | 199 | /** |
| @@ -2062,6 +2062,7 @@ void bond_3ad_state_machine_handler(struct work_struct *work) | |||
| 2062 | struct list_head *iter; | 2062 | struct list_head *iter; |
| 2063 | struct slave *slave; | 2063 | struct slave *slave; |
| 2064 | struct port *port; | 2064 | struct port *port; |
| 2065 | bool should_notify_rtnl = BOND_SLAVE_NOTIFY_LATER; | ||
| 2065 | 2066 | ||
| 2066 | read_lock(&bond->lock); | 2067 | read_lock(&bond->lock); |
| 2067 | rcu_read_lock(); | 2068 | rcu_read_lock(); |
| @@ -2119,8 +2120,19 @@ void bond_3ad_state_machine_handler(struct work_struct *work) | |||
| 2119 | } | 2120 | } |
| 2120 | 2121 | ||
| 2121 | re_arm: | 2122 | re_arm: |
| 2123 | bond_for_each_slave_rcu(bond, slave, iter) { | ||
| 2124 | if (slave->should_notify) { | ||
| 2125 | should_notify_rtnl = BOND_SLAVE_NOTIFY_NOW; | ||
| 2126 | break; | ||
| 2127 | } | ||
| 2128 | } | ||
| 2122 | rcu_read_unlock(); | 2129 | rcu_read_unlock(); |
| 2123 | read_unlock(&bond->lock); | 2130 | read_unlock(&bond->lock); |
| 2131 | |||
| 2132 | if (should_notify_rtnl && rtnl_trylock()) { | ||
| 2133 | bond_slave_state_notify(bond); | ||
| 2134 | rtnl_unlock(); | ||
| 2135 | } | ||
| 2124 | queue_delayed_work(bond->wq, &bond->ad_work, ad_delta_in_ticks); | 2136 | queue_delayed_work(bond->wq, &bond->ad_work, ad_delta_in_ticks); |
| 2125 | } | 2137 | } |
| 2126 | 2138 | ||
