From 8574171833b24fda5101e1aa892a38c0d91d083e Mon Sep 17 00:00:00 2001 From: Eric Dumazet Date: Tue, 15 Jul 2014 06:56:56 -0700 Subject: [PATCH] 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 Reviewed-by: Nikolay Aleksandrov Signed-off-by: David S. Miller --- drivers/net/bonding/bond_main.c | 15 +++++++++------ 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 */ -- 2.20.1