linux/drivers/net/bonding
Nikolay Aleksandrov 25c44b7085 bonding: fix curr_active_slave/carrier with loadbalance arp monitoring
[ Upstream commit b8e4500f42 ]

Since commit 6fde8f037e ("bonding: fix locking in
bond_loadbalance_arp_mon()") we can have a stale bond carrier state and
stale curr_active_slave when using arp monitoring in loadbalance modes. The
reason is that in bond_loadbalance_arp_mon() we can't have
do_failover == true but slave_state_changed == false, whenever do_failover
is true then slave_state_changed is also true. Then the following piece
from bond_loadbalance_arp_mon():
                if (slave_state_changed) {
                        bond_slave_state_change(bond);
                        if (BOND_MODE(bond) == BOND_MODE_XOR)
                                bond_update_slave_arr(bond, NULL);
                } else if (do_failover) {
                        block_netpoll_tx();
                        bond_select_active_slave(bond);
                        unblock_netpoll_tx();
                }

will execute only the first branch, always and regardless of do_failover.
Since these two events aren't related in such way, we need to decouple and
consider them separately.

For example this issue could lead to the following result:
Bonding Mode: load balancing (round-robin)
*MII Status: down*
MII Polling Interval (ms): 0
Up Delay (ms): 0
Down Delay (ms): 0
ARP Polling Interval (ms): 100
ARP IP target/s (n.n.n.n form): 192.168.9.2

Slave Interface: ens12
*MII Status: up*
Speed: 10000 Mbps
Duplex: full
Link Failure Count: 2
Permanent HW addr: 00:0f:53:01:42:2c
Slave queue ID: 0

Slave Interface: eth1
*MII Status: up*
Speed: Unknown
Duplex: Unknown
Link Failure Count: 70
Permanent HW addr: 52:54:00:2f:0f:8e
Slave queue ID: 0

Since some interfaces are up, then the status of the bond should also be
up, but it will never change unless something invokes bond_set_carrier()
(i.e. enslave, bond_select_active_slave etc). Now, if I force the
calling of bond_select_active_slave via for example changing
primary_reselect (it can change in any mode), then the MII status goes to
"up" because it calls bond_select_active_slave() which should've been done
from bond_loadbalance_arp_mon() itself.

CC: Veaceslav Falico <vfalico@gmail.com>
CC: Jay Vosburgh <j.vosburgh@gmail.com>
CC: Andy Gospodarek <andy@greyhouse.net>
CC: Ding Tianhong <dingtianhong@huawei.com>

Fixes: 6fde8f037e ("bonding: fix locking in bond_loadbalance_arp_mon()")
Signed-off-by: Nikolay Aleksandrov <nikolay@redhat.com>
Acked-by: Veaceslav Falico <vfalico@gmail.com>
Acked-by: Andy Gospodarek <gospo@cumulusnetworks.com>
Acked-by: Ding Tianhong <dingtianhong@huawei.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
History 2014-12-06 15:55:34 -08:00
..
bond_3ad.c bonding: Fix RTNL: assertion failed at net/core/rtnetlink.c for ab arp monitor 2014-02-26 16:02:56 -05:00
bond_3ad.h bonding: 802.3ad: make aggregator_identifier bond-private 2014-02-17 14:54:06 -05:00
bond_alb.c bonding: set correct vlan id for alb xmit path 2014-03-13 15:45:10 -04:00
bond_alb.h drivers/net/*: Fix FSF address in file headers 2013-12-06 12:37:55 -05:00
bond_debugfs.c bonding: delete migrated IP addresses from the rlb hash table 2012-11-30 12:07:27 -05:00
bond_main.c bonding: fix curr_active_slave/carrier with loadbalance arp monitoring 2014-12-06 15:55:34 -08:00
bond_netlink.c bonding: convert netlink to use slave data info api 2014-01-22 21:57:17 -08:00
bond_options.c bonding: fix out of range parameters for bond_intmax_tbl 2014-05-31 13:20:38 -07:00
bond_options.h bonding: convert slaves to use the new option API 2014-01-22 15:38:44 -08:00
bond_procfs.c bonding: convert primary_reselect to use the new option API 2014-01-22 15:38:43 -08:00
bond_sysfs.c bonding: convert slaves to use the new option API 2014-01-22 15:38:44 -08:00
bond_sysfs_slave.c bonding: change name of sysfs dir for bonding slaves 2014-01-22 21:57:05 -08:00
bonding.h bonding: Fix RTNL: assertion failed at net/core/rtnetlink.c for ab arp monitor 2014-02-26 16:02:56 -05:00
Makefile bonding: add sysfs /slave dir for bond slave devices. 2014-01-17 18:51:58 -08:00