Skip to content

Commit

Permalink
bonding: remove bond read lock for bond_3ad_state_machine_handler()
Browse files Browse the repository at this point in the history
The bond slave list may change when the monitor is running, the slave list is no longer
protected by bond->lock, only protected by rtnl lock(), so we have 3 ways to modify it:
1.add bond_master_upper_dev_link() and bond_upper_dev_unlink() in bond->lock, but it is unsafe
to call call_netdevice_notifiers() in write lock.
2.remove unused bond->lock for monitor function, only use the existing rtnl lock().
3.use rcu_read_lock() to protect it, of course, it will transform bond_for_each_slave to
bond_for_each_slave_rcu() and performance is better, but in slow path, it is ignored.
so I remove the bond->lock and move the rtnl lock to protect the whole monitor function.

Signed-off-by: Ding Tianhong <dingtianhong@huawei.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
dingtianhong authored and David S. Miller committed Oct 27, 2013
1 parent 80b9d23 commit 5cc172c
Showing 1 changed file with 5 additions and 4 deletions.
9 changes: 5 additions & 4 deletions drivers/net/bonding/bond_3ad.c
Original file line number Diff line number Diff line change
Expand Up @@ -2068,8 +2068,10 @@ void bond_3ad_state_machine_handler(struct work_struct *work)
struct slave *slave;
struct port *port;

read_lock(&bond->lock);

if (!rtnl_trylock()) {
queue_delayed_work(bond->wq, &bond->ad_work, ad_delta_in_ticks);
return;
}
//check if there are any slaves
if (!bond_has_slaves(bond))
goto re_arm;
Expand Down Expand Up @@ -2122,9 +2124,8 @@ void bond_3ad_state_machine_handler(struct work_struct *work)
}

re_arm:
rtnl_unlock();
queue_delayed_work(bond->wq, &bond->ad_work, ad_delta_in_ticks);

read_unlock(&bond->lock);
}

/**
Expand Down

0 comments on commit 5cc172c

Please sign in to comment.