cvs commit: src/sys/dev/bge if_bge.c
glebius at FreeBSD.org
Wed Dec 20 06:04:39 PST 2006
On Wed, Dec 20, 2006 at 12:03:21PM +0000, Bruce Evans wrote:
B> bde 2006-12-20 12:03:21 UTC
B> FreeBSD src repository
B> Modified files:
B> sys/dev/bge if_bge.c
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.
Totus tuus, Glebius.
More information about the cvs-all