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
_______________________________________________
cvs-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/cvs-all
To unsubscribe, send any mail to "[EMAIL PROTECTED]"