Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 22 Dec 2006 01:24:45 +1100 (EST)
From:      Bruce Evans <bde@zeta.org.au>
To:        Gleb Smirnoff <glebius@freebsd.org>
Cc:        cvs-src@freebsd.org, src-committers@freebsd.org, Bruce Evans <bde@freebsd.org>, cvs-all@freebsd.org
Subject:   Re: cvs commit: src/sys/dev/bge if_bge.c
Message-ID:  <20061222003115.R16146@delplex.bde.org>
In-Reply-To: <20061220132631.GH34400@FreeBSD.org>
References:  <200612201203.kBKC3MhO053666@repoman.freebsd.org> <20061220132631.GH34400@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help
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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20061222003115.R16146>