summaryrefslogtreecommitdiffstats
path: root/drivers/net/8139too.c
diff options
context:
space:
mode:
authorJeff Garzik <jgarzik@pobox.com>2005-11-10 04:31:55 -0500
committerJeff Garzik <jgarzik@pobox.com>2005-11-10 04:31:55 -0500
commit760559e1330a58cc5b320154a20e64b8444143c0 (patch)
tree46bf5b8d3b78f2ff57fd728026e597844b149efb /drivers/net/8139too.c
parent2f67bdb23d74a6c6fd4f98f64239c5c34d1833cc (diff)
downloadkernel-crypto-760559e1330a58cc5b320154a20e64b8444143c0.tar.gz
kernel-crypto-760559e1330a58cc5b320154a20e64b8444143c0.tar.xz
kernel-crypto-760559e1330a58cc5b320154a20e64b8444143c0.zip
[netdrvr 8139too] fast poll for thread, if an unlikely race occurs
The rtl8139 thread is triggered only on rare 8139 hardware, the race itself is unlikely, and the impact of racing is low. We don't care enough to create a more-complex race-free solution. Rather, if the trylock fails, we now simply poll twice a second until we do get the lock.
Diffstat (limited to 'drivers/net/8139too.c')
-rw-r--r--drivers/net/8139too.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/drivers/net/8139too.c b/drivers/net/8139too.c
index 120baaa9075..d2102a27d30 100644
--- a/drivers/net/8139too.c
+++ b/drivers/net/8139too.c
@@ -1598,13 +1598,19 @@ static void rtl8139_thread (void *_data)
{
struct net_device *dev = _data;
struct rtl8139_private *tp = netdev_priv(dev);
+ unsigned long thr_delay;
if (rtnl_shlock_nowait() == 0) {
rtl8139_thread_iter (dev, tp, tp->mmio_addr);
rtnl_unlock ();
+
+ thr_delay = next_tick;
+ } else {
+ /* unlikely race. mitigate with fast poll. */
+ thr_delay = HZ / 2;
}
- schedule_delayed_work(&tp->thread, next_tick);
+ schedule_delayed_work(&tp->thread, thr_delay);
}
static void rtl8139_start_thread(struct rtl8139_private *tp)