Commit d5e73f7b authored by Mahesh Bandewar's avatar Mahesh Bandewar Committed by David S. Miller

bonding: restructure arp-monitor

In preparation to move the work-queue initialization to port creation
from current port_open phase. Work-queue initialization does not make
sense every time we do 'ifup/ifdown'. So moving to port creation phase.

Arp monitoring work depends on the bonding mode and that is not tied
to the port creation and can change anytime during the life after port
creation. So this restructuring allows us to move the initialization
at creation without losing the ability to arm the correct work for the
mode user has selected.
Signed-off-by: default avatarMahesh Bandewar <maheshb@google.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 96d7552e
...@@ -2575,10 +2575,8 @@ static bool bond_time_in_interval(struct bonding *bond, unsigned long last_act, ...@@ -2575,10 +2575,8 @@ static bool bond_time_in_interval(struct bonding *bond, unsigned long last_act,
* arp is transmitted to generate traffic. see activebackup_arp_monitor for * arp is transmitted to generate traffic. see activebackup_arp_monitor for
* arp monitoring in active backup mode. * arp monitoring in active backup mode.
*/ */
static void bond_loadbalance_arp_mon(struct work_struct *work) static void bond_loadbalance_arp_mon(struct bonding *bond)
{ {
struct bonding *bond = container_of(work, struct bonding,
arp_work.work);
struct slave *slave, *oldcurrent; struct slave *slave, *oldcurrent;
struct list_head *iter; struct list_head *iter;
int do_failover = 0, slave_state_changed = 0; int do_failover = 0, slave_state_changed = 0;
...@@ -2916,10 +2914,8 @@ static bool bond_ab_arp_probe(struct bonding *bond) ...@@ -2916,10 +2914,8 @@ static bool bond_ab_arp_probe(struct bonding *bond)
return should_notify_rtnl; return should_notify_rtnl;
} }
static void bond_activebackup_arp_mon(struct work_struct *work) static void bond_activebackup_arp_mon(struct bonding *bond)
{ {
struct bonding *bond = container_of(work, struct bonding,
arp_work.work);
bool should_notify_peers = false; bool should_notify_peers = false;
bool should_notify_rtnl = false; bool should_notify_rtnl = false;
int delta_in_ticks; int delta_in_ticks;
...@@ -2972,6 +2968,17 @@ static void bond_activebackup_arp_mon(struct work_struct *work) ...@@ -2972,6 +2968,17 @@ static void bond_activebackup_arp_mon(struct work_struct *work)
} }
} }
static void bond_arp_monitor(struct work_struct *work)
{
struct bonding *bond = container_of(work, struct bonding,
arp_work.work);
if (BOND_MODE(bond) == BOND_MODE_ACTIVEBACKUP)
bond_activebackup_arp_mon(bond);
else
bond_loadbalance_arp_mon(bond);
}
/*-------------------------- netdev event handling --------------------------*/ /*-------------------------- netdev event handling --------------------------*/
/* Change device name */ /* Change device name */
...@@ -3228,10 +3235,7 @@ static void bond_work_init_all(struct bonding *bond) ...@@ -3228,10 +3235,7 @@ static void bond_work_init_all(struct bonding *bond)
bond_resend_igmp_join_requests_delayed); bond_resend_igmp_join_requests_delayed);
INIT_DELAYED_WORK(&bond->alb_work, bond_alb_monitor); INIT_DELAYED_WORK(&bond->alb_work, bond_alb_monitor);
INIT_DELAYED_WORK(&bond->mii_work, bond_mii_monitor); INIT_DELAYED_WORK(&bond->mii_work, bond_mii_monitor);
if (BOND_MODE(bond) == BOND_MODE_ACTIVEBACKUP) INIT_DELAYED_WORK(&bond->arp_work, bond_arp_monitor);
INIT_DELAYED_WORK(&bond->arp_work, bond_activebackup_arp_mon);
else
INIT_DELAYED_WORK(&bond->arp_work, bond_loadbalance_arp_mon);
INIT_DELAYED_WORK(&bond->ad_work, bond_3ad_state_machine_handler); INIT_DELAYED_WORK(&bond->ad_work, bond_3ad_state_machine_handler);
INIT_DELAYED_WORK(&bond->slave_arr_work, bond_slave_arr_handler); INIT_DELAYED_WORK(&bond->slave_arr_work, bond_slave_arr_handler);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment