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