Commit 760559e1330a58cc5b320154a20e64b8444143c0

Authored by Jeff Garzik
1 parent 2f67bdb23d

[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.

Showing 1 changed file with 7 additions and 1 deletions Side-by-side Diff

drivers/net/8139too.c
... ... @@ -1598,13 +1598,19 @@
1598 1598 {
1599 1599 struct net_device *dev = _data;
1600 1600 struct rtl8139_private *tp = netdev_priv(dev);
  1601 + unsigned long thr_delay;
1601 1602  
1602 1603 if (rtnl_shlock_nowait() == 0) {
1603 1604 rtl8139_thread_iter (dev, tp, tp->mmio_addr);
1604 1605 rtnl_unlock ();
  1606 +
  1607 + thr_delay = next_tick;
  1608 + } else {
  1609 + /* unlikely race. mitigate with fast poll. */
  1610 + thr_delay = HZ / 2;
1605 1611 }
1606 1612  
1607   - schedule_delayed_work(&tp->thread, next_tick);
  1613 + schedule_delayed_work(&tp->thread, thr_delay);
1608 1614 }
1609 1615  
1610 1616 static void rtl8139_start_thread(struct rtl8139_private *tp)