• Nithin Sujir's avatar
    bonding: Don't update slave->link until ready to commit · 797a9364
    Nithin Sujir authored
    In the loadbalance arp monitoring scheme, when a slave link change is
    detected, the slave->link is immediately updated and slave_state_changed
    is set. Later down the function, the rtnl_lock is acquired and the
    changes are committed, updating the bond link state.
    
    However, the acquisition of the rtnl_lock can fail. The next time the
    monitor runs, since slave->link is already updated, it determines that
    link is unchanged. This results in the bond link state permanently out
    of sync with the slave link.
    
    This patch modifies bond_loadbalance_arp_mon() to handle link changes
    identical to bond_ab_arp_{inspect/commit}(). The new link state is
    maintained in slave->new_link until we're ready to commit at which point
    it's copied into slave->link.
    
    NOTE: miimon_{inspect/commit}() has a more complex state machine
    requiring the use of the bond_{propose,commit}_link_state() functions
    which maintains the intermediate state in slave->link_new_state. The arp
    monitors don't require that.
    
    Testing: This bug is very easy to reproduce with the following steps.
    1. In a loop, toggle a slave link of a bond slave interface.
    2. In a separate loop, do ifconfig up/down of an unrelated interface to
    create contention for rtnl_lock.
    Within a few iterations, the bond link goes out of sync with the slave
    link.
    Signed-off-by: 's avatarNithin Nayak Sujir <nsujir@tintri.com>
    Cc: Mahesh Bandewar <maheshb@google.com>
    Cc: Jay Vosburgh <jay.vosburgh@canonical.com>
    Acked-by: 's avatarMahesh Bandewar <maheshb@google.com>
    Signed-off-by: 's avatarDavid S. Miller <davem@davemloft.net>
    797a9364
Name
Last commit
Last update
Documentation Loading commit data...
arch Loading commit data...
block Loading commit data...
certs Loading commit data...
crypto Loading commit data...
drivers Loading commit data...
firmware Loading commit data...
fs Loading commit data...
include Loading commit data...
init Loading commit data...
ipc Loading commit data...
kernel Loading commit data...
lib Loading commit data...
mm Loading commit data...
net Loading commit data...
samples Loading commit data...
scripts Loading commit data...
security Loading commit data...
sound Loading commit data...
tools Loading commit data...
usr Loading commit data...
virt Loading commit data...
.cocciconfig Loading commit data...
.get_maintainer.ignore Loading commit data...
.gitattributes Loading commit data...
.gitignore Loading commit data...
.mailmap Loading commit data...
COPYING Loading commit data...
CREDITS Loading commit data...
Kbuild Loading commit data...
Kconfig Loading commit data...
MAINTAINERS Loading commit data...
Makefile Loading commit data...
README Loading commit data...