bonding: rebuild the bond_resend_igmp_join_requests_delayed()
authordingtianhong <dingtianhong@huawei.com>
Fri, 13 Dec 2013 02:20:26 +0000 (10:20 +0800)
committerDavid S. Miller <davem@davemloft.net>
Sat, 14 Dec 2013 06:58:02 +0000 (01:58 -0500)
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>
drivers/net/bonding/bond_main.c

index 720a826eb071bbb9ede2263759c5ca42faa1fd82..c0456cc8661047045b2ab5cb0df47377388d4e5a 100644 (file)
@@ -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
  * slave.
  */
-static void bond_resend_igmp_join_requests(struct bonding *bond)
+static void bond_resend_igmp_join_requests_delayed(struct work_struct *work)
 {
+       struct bonding *bond = container_of(work, struct bonding,
+                                           mcast_work.work);
+
        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)
-{
-       struct bonding *bond = container_of(work, struct bonding,
-                                           mcast_work.work);
-
-       bond_resend_igmp_join_requests(bond);
+       rtnl_unlock();
 }
 
 /* Flush bond's hardware addresses from slave