netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [patch net] team: avoid possible underflow of count_pending value for notify_peers and mcast_rejoin
@ 2015-01-14 17:15 Jiri Pirko
  2015-01-14 21:55 ` David Miller
  0 siblings, 1 reply; 3+ messages in thread
From: Jiri Pirko @ 2015-01-14 17:15 UTC (permalink / raw)
  To: netdev; +Cc: davem, jbenc

This patch is fixing a race condition that may cause setting
count_pending to -1, which results in unwanted big bulk of arp messages
(in case of "notify peers").

Consider following scenario:

count_pending == 2
   CPU0                                           CPU1
					team_notify_peers_work
					  atomic_dec_and_test (dec count_pending to 1)
					  schedule_delayed_work
 team_notify_peers
   atomic_add (adding 1 to count_pending)
					team_notify_peers_work
					  atomic_dec_and_test (dec count_pending to 1)
					  schedule_delayed_work
					team_notify_peers_work
					  atomic_dec_and_test (dec count_pending to 0)
   schedule_delayed_work
					team_notify_peers_work
					  atomic_dec_and_test (dec count_pending to -1)

Fix this race by using atomic_dec_if_positive - that will prevent
count_pending running under 0.

Fixes: fc423ff00df3a1955441 ("team: add peer notification")
Fixes: 492b200efdd20b8fcfd  ("team: add support for sending multicast rejoins")
Signed-off-by: Jiri Pirko <jiri@resnulli.us>
Signed-off-by: Jiri Benc <jbenc@redhat.com>
---
 drivers/net/team/team.c | 16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)

diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c
index 43bcfff..4b2bfc5 100644
--- a/drivers/net/team/team.c
+++ b/drivers/net/team/team.c
@@ -622,6 +622,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);
 
@@ -629,9 +630,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));
 }
@@ -662,6 +668,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);
 
@@ -669,9 +676,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));
 }
-- 
1.9.3

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [patch net] team: avoid possible underflow of count_pending value for notify_peers and mcast_rejoin
  2015-01-14 17:15 [patch net] team: avoid possible underflow of count_pending value for notify_peers and mcast_rejoin Jiri Pirko
@ 2015-01-14 21:55 ` David Miller
  2015-01-15  7:42   ` Jiri Pirko
  0 siblings, 1 reply; 3+ messages in thread
From: David Miller @ 2015-01-14 21:55 UTC (permalink / raw)
  To: jiri; +Cc: netdev, jbenc

From: Jiri Pirko <jiri@resnulli.us>
Date: Wed, 14 Jan 2015 18:15:30 +0100

> This patch is fixing a race condition that may cause setting
> count_pending to -1, which results in unwanted big bulk of arp messages
> (in case of "notify peers").
> 
> Consider following scenario:
 ...
> Fix this race by using atomic_dec_if_positive - that will prevent
> count_pending running under 0.
> 
> Fixes: fc423ff00df3a1955441 ("team: add peer notification")
> Fixes: 492b200efdd20b8fcfd  ("team: add support for sending multicast rejoins")
> Signed-off-by: Jiri Pirko <jiri@resnulli.us>
> Signed-off-by: Jiri Benc <jbenc@redhat.com>

Applied, thanks.

I am assuming that v3.12 and later need this fix, therefore I'm queueing it up for
-stable.

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [patch net] team: avoid possible underflow of count_pending value for notify_peers and mcast_rejoin
  2015-01-14 21:55 ` David Miller
@ 2015-01-15  7:42   ` Jiri Pirko
  0 siblings, 0 replies; 3+ messages in thread
From: Jiri Pirko @ 2015-01-15  7:42 UTC (permalink / raw)
  To: David Miller; +Cc: netdev, jbenc

Wed, Jan 14, 2015 at 10:55:09PM CET, davem@davemloft.net wrote:
>From: Jiri Pirko <jiri@resnulli.us>
>Date: Wed, 14 Jan 2015 18:15:30 +0100
>
>> This patch is fixing a race condition that may cause setting
>> count_pending to -1, which results in unwanted big bulk of arp messages
>> (in case of "notify peers").
>> 
>> Consider following scenario:
> ...
>> Fix this race by using atomic_dec_if_positive - that will prevent
>> count_pending running under 0.
>> 
>> Fixes: fc423ff00df3a1955441 ("team: add peer notification")
>> Fixes: 492b200efdd20b8fcfd  ("team: add support for sending multicast rejoins")
>> Signed-off-by: Jiri Pirko <jiri@resnulli.us>
>> Signed-off-by: Jiri Benc <jbenc@redhat.com>
>
>Applied, thanks.
>
>I am assuming that v3.12 and later need this fix, therefore I'm queueing it up for
>-stable.

Yes, thanks!

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2015-01-15  7:42 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-01-14 17:15 [patch net] team: avoid possible underflow of count_pending value for notify_peers and mcast_rejoin Jiri Pirko
2015-01-14 21:55 ` David Miller
2015-01-15  7:42   ` Jiri Pirko

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).