Commit 8c105683 authored by Herbert Xu's avatar Herbert Xu Committed by David S. Miller

[NET] linkwatch: Handle jiffies wrap-around

The test used in the linkwatch does not handle wrap-arounds correctly.
Since the intention of the code is to eliminate bursts of messages we
can afford to delay things up to a second.  Using that fact we can
easily handle wrap-arounds by making sure that we don't delay things
by more than one second.

This is based on diagnosis and a patch by Stefan Rompf.
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
Acked-by: default avatarStefan Rompf <stefan@loplof.de>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 788252e6
...@@ -170,13 +170,13 @@ void linkwatch_fire_event(struct net_device *dev) ...@@ -170,13 +170,13 @@ void linkwatch_fire_event(struct net_device *dev)
spin_unlock_irqrestore(&lweventlist_lock, flags); spin_unlock_irqrestore(&lweventlist_lock, flags);
if (!test_and_set_bit(LW_RUNNING, &linkwatch_flags)) { if (!test_and_set_bit(LW_RUNNING, &linkwatch_flags)) {
unsigned long thisevent = jiffies; unsigned long delay = linkwatch_nextevent - jiffies;
if (thisevent >= linkwatch_nextevent) { /* If we wrap around we'll delay it by at most HZ. */
if (!delay || delay > HZ)
schedule_work(&linkwatch_work); schedule_work(&linkwatch_work);
} else { else
schedule_delayed_work(&linkwatch_work, linkwatch_nextevent - thisevent); schedule_delayed_work(&linkwatch_work, delay);
}
} }
} }
} }
......
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