cvs commit: src/sys/dev/bge if_bge.c

Bruce Evans bde at zeta.org.au
Thu Dec 21 06:24:49 PST 2006


On Wed, 20 Dec 2006, Gleb Smirnoff wrote:

> On Wed, Dec 20, 2006 at 12:03:21PM +0000, Bruce Evans wrote:
> B> bde         2006-12-20 12:03:21 UTC
> B>
> B>   FreeBSD src repository
> B>
> B>   Modified files:
> B>     sys/dev/bge          if_bge.c
> B>   Log:
> B>   In bge_txeof(), cancel the watchdog timeout if all descriptors have
> B>   been handled instead of when at least one descriptor was just handled.
> B>   For bge, it is normal to get a txeof when only a small fraction of the
> B>   queued tx descriptors have been handled, so the bug broke the watchdog
> B>   in a usual case.
>
> I have a suspicion that this may cause a problem under high load. Imagine
> that thread #1 is spinning in bge_start_locked() getting packets out
> of interface queue and putting them into TX ring. Some other threads are
> putting the packets into interface queue while its lock is temporarily
> relinguished be the thread #1. In the same time interrupts happen, some
> packets are sent, but the TX ring is never got empty.
>
> The above scenario will cause a fake watchdog event.

bge_start_locked() starts with the bge (sc) lock held and never releases
it as far as I can see.  This this problem can't happen (the lock
prevents both txeof and the watchdog from being reached before start
resets the timeout to 5 seconds).

I could only find the lock being released and reacquired in a nested
routine in bge_rxeof() (for calling if_input()).  I hope this complication
is never needed for start routines.

Bruce


More information about the cvs-src mailing list