Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 72430
b: refs/heads/master
c: 0b0eef6
h: refs/heads/master
v: v3
  • Loading branch information
Jay Vosburgh authored and Jeff Garzik committed Oct 24, 2007
1 parent b1d8006 commit 4620a92
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 20 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: cf5f9044934658dd3ffc628a60cd37c70f8168b1
refs/heads/master: 0b0eef66419e9abe6fd62bc958ab7cd0a18f858e
70 changes: 51 additions & 19 deletions trunk/drivers/net/bonding/bond_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -2088,27 +2088,25 @@ static int bond_slave_info_query(struct net_device *bond_dev, struct ifslave *in

/*-------------------------------- Monitoring -------------------------------*/

/* this function is called regularly to monitor each slave's link. */
void bond_mii_monitor(struct work_struct *work)
/*
* if !have_locks, return nonzero if a failover is necessary. if
* have_locks, do whatever failover activities are needed.
*
* This is to separate the inspection and failover steps for locking
* purposes; failover requires rtnl, but acquiring it for every
* inspection is undesirable, so a wrapper first does inspection, and
* the acquires the necessary locks and calls again to perform
* failover if needed. Since all locks are dropped, a complete
* restart is needed between calls.
*/
static int __bond_mii_monitor(struct bonding *bond, int have_locks)
{
struct bonding *bond = container_of(work, struct bonding,
mii_work.work);
struct slave *slave, *oldcurrent;
int do_failover = 0;
int delta_in_ticks;
int i;

read_lock(&bond->lock);

delta_in_ticks = (bond->params.miimon * HZ) / 1000;

if (bond->kill_timers) {
if (bond->slave_cnt == 0)
goto out;
}

if (bond->slave_cnt == 0) {
goto re_arm;
}

/* we will try to read the link status of each of our slaves, and
* set their IFF_RUNNING flag appropriately. For each slave not
Expand Down Expand Up @@ -2175,6 +2173,9 @@ void bond_mii_monitor(struct work_struct *work)
if (link_state != BMSR_LSTATUS) {
/* link stays down */
if (slave->delay <= 0) {
if (!have_locks)
return 1;

/* link down for too long time */
slave->link = BOND_LINK_DOWN;

Expand Down Expand Up @@ -2258,6 +2259,9 @@ void bond_mii_monitor(struct work_struct *work)
} else {
/* link stays up */
if (slave->delay == 0) {
if (!have_locks)
return 1;

/* now the link has been up for long time enough */
slave->link = BOND_LINK_UP;
slave->jiffies = jiffies;
Expand Down Expand Up @@ -2331,13 +2335,41 @@ void bond_mii_monitor(struct work_struct *work)
} else
bond_set_carrier(bond);

re_arm:
if (bond->params.miimon)
queue_delayed_work(bond->wq, &bond->mii_work, delta_in_ticks);
out:
read_unlock(&bond->lock);
return 0;
}

/*
* bond_mii_monitor
*
* Really a wrapper that splits the mii monitor into two phases: an
* inspection, then (if inspection indicates something needs to be
* done) an acquisition of appropriate locks followed by another pass
* to implement whatever link state changes are indicated.
*/
void bond_mii_monitor(struct work_struct *work)
{
struct bonding *bond = container_of(work, struct bonding,
mii_work.work);
unsigned long delay;

read_lock(&bond->lock);
if (bond->kill_timers) {
read_unlock(&bond->lock);
return;
}
if (__bond_mii_monitor(bond, 0)) {
read_unlock(&bond->lock);
rtnl_lock();
read_lock(&bond->lock);
__bond_mii_monitor(bond, 1);
rtnl_unlock();
}

delay = ((bond->params.miimon * HZ) / 1000) ? : 1;
read_unlock(&bond->lock);
queue_delayed_work(bond->wq, &bond->mii_work, delay);
}

static __be32 bond_glean_dev_ip(struct net_device *dev)
{
Expand Down

0 comments on commit 4620a92

Please sign in to comment.