bonding: rebuild the bond_resend_igmp_join_requests_delayed()
The bond_resend_igmp_join_requests_delayed() and bond_resend_igmp_join_requests() should be integrated, because the bond_resend_igmp_join_requests_delayed() did nothing except bond_resend_igmp_join_requests(). The bond igmp_retrans could only be changed in bond_change_active_slave and here, bond_change_active_slave will be called in RTNL and curr_slave_lock, the bond_resend_igmp_join_requests already hold RTNL, so no need to free RTNL and hold curr_slave_lock again, it may be a small optimization, so move the igmp_retrans in RTNL and remove the curr_slave_lock. Signed-off-by: Ding Tianhong <dingtianhong@huawei.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
75ad932c18
commit
f23691095b
@@ -591,33 +591,22 @@ static int bond_set_allmulti(struct bonding *bond, int inc)
|
|||||||
* device and retransmit an IGMP JOIN request to the current active
|
* device and retransmit an IGMP JOIN request to the current active
|
||||||
* slave.
|
* slave.
|
||||||
*/
|
*/
|
||||||
static void bond_resend_igmp_join_requests(struct bonding *bond)
|
|
||||||
{
|
|
||||||
if (!rtnl_trylock()) {
|
|
||||||
queue_delayed_work(bond->wq, &bond->mcast_work, 1);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
call_netdevice_notifiers(NETDEV_RESEND_IGMP, bond->dev);
|
|
||||||
rtnl_unlock();
|
|
||||||
|
|
||||||
/* We use curr_slave_lock to protect against concurrent access to
|
|
||||||
* igmp_retrans from multiple running instances of this function and
|
|
||||||
* bond_change_active_slave
|
|
||||||
*/
|
|
||||||
write_lock_bh(&bond->curr_slave_lock);
|
|
||||||
if (bond->igmp_retrans > 1) {
|
|
||||||
bond->igmp_retrans--;
|
|
||||||
queue_delayed_work(bond->wq, &bond->mcast_work, HZ/5);
|
|
||||||
}
|
|
||||||
write_unlock_bh(&bond->curr_slave_lock);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void bond_resend_igmp_join_requests_delayed(struct work_struct *work)
|
static void bond_resend_igmp_join_requests_delayed(struct work_struct *work)
|
||||||
{
|
{
|
||||||
struct bonding *bond = container_of(work, struct bonding,
|
struct bonding *bond = container_of(work, struct bonding,
|
||||||
mcast_work.work);
|
mcast_work.work);
|
||||||
|
|
||||||
bond_resend_igmp_join_requests(bond);
|
if (!rtnl_trylock()) {
|
||||||
|
queue_delayed_work(bond->wq, &bond->mcast_work, 1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
call_netdevice_notifiers(NETDEV_RESEND_IGMP, bond->dev);
|
||||||
|
|
||||||
|
if (bond->igmp_retrans > 1) {
|
||||||
|
bond->igmp_retrans--;
|
||||||
|
queue_delayed_work(bond->wq, &bond->mcast_work, HZ/5);
|
||||||
|
}
|
||||||
|
rtnl_unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Flush bond's hardware addresses from slave
|
/* Flush bond's hardware addresses from slave
|
||||||
|
Reference in New Issue
Block a user