diff options
| author | Eric Dumazet <eric.dumazet@gmail.com> | 2011-08-30 23:31:58 +0000 | 
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2011-09-15 15:36:34 -0400 | 
| commit | c37e0c993055d8c4fd82202331d06e6ef9bfec4b (patch) | |
| tree | 6145e674eef915ec15f605646be59c4b9ff4852b | |
| parent | 3e829a784c16513ac9a1d29ad23d7753d8f40b79 (diff) | |
| download | olio-linux-3.10-c37e0c993055d8c4fd82202331d06e6ef9bfec4b.tar.xz olio-linux-3.10-c37e0c993055d8c4fd82202331d06e6ef9bfec4b.zip  | |
net: linkwatch: allow vlans to get carrier changes faster
There is a time-lag of IFF_RUNNING flag consistency between vlan and
real devices when the real devices are in problem such as link or cable
broken.
This leads to a degradation of Availability such as a delay of failover
in HA systems using vlan since the detection of the problem at real
device is delayed.
We can avoid the linkwatch delay (~1 sec) for devices linked to another
ones, since delay is already done for the realdev.
Based on a previous patch from Mitsuo Hayasaka
Reported-by: Mitsuo Hayasaka <mitsuo.hayasaka.hu@hitachi.com>
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Cc: Herbert Xu <herbert@gondor.apana.org.au>
Cc: Patrick McHardy <kaber@trash.net>
Cc: "Michał Mirosław" <mirq-linux@rere.qmqm.pl>
Cc: Tom Herbert <therbert@google.com>
Cc: Stephen Hemminger <shemminger@vyatta.com>
Cc: Jesse Gross <jesse@nicira.com>
Tested-by: Mitsuo Hayasaka <mitsuo.hayasaka.hu@hitachi.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
| -rw-r--r-- | net/core/link_watch.c | 9 | 
1 files changed, 7 insertions, 2 deletions
diff --git a/net/core/link_watch.c b/net/core/link_watch.c index 357bd4ee4ba..c3519c6d1b1 100644 --- a/net/core/link_watch.c +++ b/net/core/link_watch.c @@ -78,8 +78,13 @@ static void rfc2863_policy(struct net_device *dev)  static bool linkwatch_urgent_event(struct net_device *dev)  { -	return netif_running(dev) && netif_carrier_ok(dev) && -		qdisc_tx_changing(dev); +	if (!netif_running(dev)) +		return false; + +	if (dev->ifindex != dev->iflink) +		return true; + +	return netif_carrier_ok(dev) &&	qdisc_tx_changing(dev);  }  |