[netdrvr 8139too] fast poll for thread, if an unlikely race occurs
authorJeff Garzik <jgarzik@pobox.com>
Thu, 10 Nov 2005 09:31:55 +0000 (04:31 -0500)
committerJeff Garzik <jgarzik@pobox.com>
Thu, 10 Nov 2005 09:31:55 +0000 (04:31 -0500)
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.

drivers/net/8139too.c

index 120baaa..d2102a2 100644 (file)
@@ -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)