* [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).