linux/drivers/net/team
Joe Lawrence 47549650ab team: avoid race condition in scheduling delayed work
When team_notify_peers and team_mcast_rejoin are called, they both reset
their respective .count_pending atomic variable. Then when the actual
worker function is executed, the variable is atomically decremented.
This pattern introduces a potential race condition where the
.count_pending rolls over and the worker function keeps rescheduling
until .count_pending decrements to zero again:

THREAD 1                           THREAD 2

========                           ========
team_notify_peers(teamX)
  atomic_set count_pending = 1
  schedule_delayed_work
                                   team_notify_peers(teamX)
                                   atomic_set count_pending = 1
team_notify_peers_work
  atomic_dec_and_test
    count_pending = 0
  (return)
                                   schedule_delayed_work
                                   team_notify_peers_work
                                   atomic_dec_and_test
                                     count_pending = -1
                                   schedule_delayed_work
                                   (repeat until count_pending = 0)

Instead of assigning a new value to .count_pending, use atomic_add to
tack-on the additional desired worker function invocations.

Signed-off-by: Joe Lawrence <joe.lawrence@stratus.com>
Acked-by: Jiri Pirko <jiri@resnulli.us>
Fixes: fc423ff00d ("team: add peer notification")
Fixes: 492b200efd ("team: add support for sending multicast rejoins")
Signed-off-by: David S. Miller <davem@davemloft.net>
2014-10-04 20:50:50 -04:00
..
Kconfig team: introduce random mode 2013-03-06 14:55:20 -05:00
Makefile team: introduce random mode 2013-03-06 14:55:20 -05:00
team_mode_activebackup.c team: ab: set active port option as changed when port is leaving 2013-02-04 14:55:45 -05:00
team_mode_broadcast.c team: introduce two default team_modeop functions and use them in modes 2013-03-06 14:55:20 -05:00
team_mode_loadbalance.c net: filter: split 'struct sk_filter' into socket and bpf parts 2014-08-02 15:03:58 -07:00
team_mode_random.c random32: add prandom_u32_max and convert open coded users 2014-01-21 23:17:20 -08:00
team_mode_roundrobin.c Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net 2013-06-19 16:49:39 -07:00
team.c team: avoid race condition in scheduling delayed work 2014-10-04 20:50:50 -04:00