• Jiri Pirko's avatar
    team: avoid possible underflow of count_pending value for notify_peers and mcast_rejoin · b0d11b42
    Jiri Pirko authored
    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: fc423ff0 ("team: add peer notification")
    Fixes: 492b200e  ("team: add support for sending multicast rejoins")
    Signed-off-by: default avatarJiri Pirko <jiri@resnulli.us>
    Signed-off-by: default avatarJiri Benc <jbenc@redhat.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    b0d11b42
team.c 69.2 KB