diff options
Diffstat (limited to 'drivers/net/team/team.c')
| -rw-r--r-- | drivers/net/team/team.c | 16 | 
1 files changed, 14 insertions, 2 deletions
| diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c index 93e224217e24..f7ff493f1e73 100644 --- a/drivers/net/team/team.c +++ b/drivers/net/team/team.c @@ -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));  } | 
