|
@@ -629,6 +629,7 @@ static int team_change_mode(struct team *team, const char *kind)
|
|
|
static void team_notify_peers_work(struct work_struct *work)
|
|
|
{
|
|
|
struct team *team;
|
|
|
+ int val;
|
|
|
|
|
|
team = container_of(work, struct team, notify_peers.dw.work);
|
|
|
|
|
@@ -636,9 +637,14 @@ static void team_notify_peers_work(struct work_struct *work)
|
|
|
schedule_delayed_work(&team->notify_peers.dw, 0);
|
|
|
return;
|
|
|
}
|
|
|
+ val = atomic_dec_if_positive(&team->notify_peers.count_pending);
|
|
|
+ if (val < 0) {
|
|
|
+ rtnl_unlock();
|
|
|
+ return;
|
|
|
+ }
|
|
|
call_netdevice_notifiers(NETDEV_NOTIFY_PEERS, team->dev);
|
|
|
rtnl_unlock();
|
|
|
- if (!atomic_dec_and_test(&team->notify_peers.count_pending))
|
|
|
+ if (val)
|
|
|
schedule_delayed_work(&team->notify_peers.dw,
|
|
|
msecs_to_jiffies(team->notify_peers.interval));
|
|
|
}
|
|
@@ -669,6 +675,7 @@ static void team_notify_peers_fini(struct team *team)
|
|
|
static void team_mcast_rejoin_work(struct work_struct *work)
|
|
|
{
|
|
|
struct team *team;
|
|
|
+ int val;
|
|
|
|
|
|
team = container_of(work, struct team, mcast_rejoin.dw.work);
|
|
|
|
|
@@ -676,9 +683,14 @@ static void team_mcast_rejoin_work(struct work_struct *work)
|
|
|
schedule_delayed_work(&team->mcast_rejoin.dw, 0);
|
|
|
return;
|
|
|
}
|
|
|
+ val = atomic_dec_if_positive(&team->mcast_rejoin.count_pending);
|
|
|
+ if (val < 0) {
|
|
|
+ rtnl_unlock();
|
|
|
+ return;
|
|
|
+ }
|
|
|
call_netdevice_notifiers(NETDEV_RESEND_IGMP, team->dev);
|
|
|
rtnl_unlock();
|
|
|
- if (!atomic_dec_and_test(&team->mcast_rejoin.count_pending))
|
|
|
+ if (val)
|
|
|
schedule_delayed_work(&team->mcast_rejoin.dw,
|
|
|
msecs_to_jiffies(team->mcast_rejoin.interval));
|
|
|
}
|