diff options
author | Eric Dumazet <edumazet@google.com> | 2014-07-15 06:56:56 -0700 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-07-15 17:49:42 -0700 |
commit | 8574171833b24fda5101e1aa892a38c0d91d083e (patch) | |
tree | f84575fd40f7a900e7149afc629aa0f56c044b62 /drivers | |
parent | 4740d6382790077f22c606d03804f5d9f15b90d7 (diff) | |
download | linux-8574171833b24fda5101e1aa892a38c0d91d083e.tar.bz2 |
bonding: add proper __rcu annotation for current_arp_slave
Using __rcu annotation actually helps to spot all accesses to
bond->current_arp_slave are correctly protected, with LOCKDEP support.
Signed-off-by: Eric Dumazet <edumazet@google.com>
Reviewed-by: Nikolay Aleksandrov <nikolay@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/bonding/bond_main.c | 15 | ||||
-rw-r--r-- | drivers/net/bonding/bonding.h | 2 |
2 files changed, 10 insertions, 7 deletions
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 27ce838d45d6..6d3b8db882a1 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c @@ -1711,7 +1711,7 @@ static int __bond_release_one(struct net_device *bond_dev, oldcurrent = rcu_access_pointer(bond->curr_active_slave); - bond->current_arp_slave = NULL; + RCU_INIT_POINTER(bond->current_arp_slave, NULL); if (!all && (!bond->params.fail_over_mac || BOND_MODE(bond) != BOND_MODE_ACTIVEBACKUP)) { @@ -2569,7 +2569,7 @@ static int bond_ab_arp_inspect(struct bonding *bond) * before being taken out */ if (!bond_is_active_slave(slave) && - !bond->current_arp_slave && + !rcu_access_pointer(bond->current_arp_slave) && !bond_time_in_interval(bond, last_rx, 3)) { slave->new_link = BOND_LINK_DOWN; commit++; @@ -2615,12 +2615,15 @@ static void bond_ab_arp_commit(struct bonding *bond) if (rtnl_dereference(bond->curr_active_slave) != slave || (!rtnl_dereference(bond->curr_active_slave) && bond_time_in_interval(bond, trans_start, 1))) { + struct slave *current_arp_slave; + + current_arp_slave = rtnl_dereference(bond->current_arp_slave); slave->link = BOND_LINK_UP; - if (bond->current_arp_slave) { + if (current_arp_slave) { bond_set_slave_inactive_flags( - bond->current_arp_slave, + current_arp_slave, BOND_SLAVE_NOTIFY_NOW); - bond->current_arp_slave = NULL; + RCU_INIT_POINTER(bond->current_arp_slave, NULL); } pr_info("%s: link status definitely up for interface %s\n", @@ -2646,7 +2649,7 @@ static void bond_ab_arp_commit(struct bonding *bond) bond->dev->name, slave->dev->name); if (slave == rtnl_dereference(bond->curr_active_slave)) { - bond->current_arp_slave = NULL; + RCU_INIT_POINTER(bond->current_arp_slave, NULL); goto do_failover; } diff --git a/drivers/net/bonding/bonding.h b/drivers/net/bonding/bonding.h index d03d2ae4d3af..b2e548e9d738 100644 --- a/drivers/net/bonding/bonding.h +++ b/drivers/net/bonding/bonding.h @@ -195,7 +195,7 @@ struct slave { struct bonding { struct net_device *dev; /* first - useful for panic debug */ struct slave __rcu *curr_active_slave; - struct slave *current_arp_slave; + struct slave __rcu *current_arp_slave; struct slave *primary_slave; bool force_primary; s32 slave_cnt; /* never change this value outside the attach/detach wrappers */ |