Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 24 Dec 2012 19:59:06 -0600
From:      Mike Karels <mike@karels.net>
To:        Adrian Chadd <adrian@freebsd.org>
Cc:        freebsd-net <freebsd-net@freebsd.org>, Ryan Stone <rysto32@gmail.com>, Tsaregorodtsev Denis <telemat@extrim.it>
Subject:   Re: 'no buffer space available' after switch goes down on freeBSD 7.3
Message-ID:  <201212250159.qBP1x63t099398@mail.karels.net>
In-Reply-To: Your message of Mon, 24 Dec 2012 17:45:47 -0800. <CAJ-Vmo=2kB8TgiHK_xtfAmS4g=Np1-Ebfa1A3HvzUOqpTACBEA@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
> On 24 December 2012 17:01, Ryan Stone <rysto32@gmail.com> wrote:
> > I don't believe that this is fixed in later versions of the driver. The
> > problem is that when the interface loses link the transmit queue can fill
> > up. Once that happens the driver never gets any more calls from the network
> > stack to make it send packets. Pinging the interface fixes it because the
> > driver processes rx.and tx from the same context, so when it receives a
> > packet it starts transmitting again.
> >
> > The patch that I sent fixes the problem by forcing the driver to process
> > the tx queue when ever links goes from down to up.

> This is a cute fix, and I've noticed similar issues in net80211.

> In net80211, the stack currently calls if_start() to re-attempt frame
> transmission during a VAP state transition to RUN.
> This has similar issues (ie, it assumes that if_start() DTRT; it
> assumes OACTIVE has been cleared, etc.)

> I think we may need another if_* method which specifically attempts to
> service the TX queue again; versus just waiting for if_transmit() to
> make some progress.

In my opinion, it is wrong of the drivers to queue packets while link
is down.  The packets are delayed indefinitely, and are useless at best.
In my company's product (McAfee firewall), we had problems with state-sharing
packets that were way out of date in a cluster.  We changed the drivers to
empty the queue and discard subsequent packets when link was down.  No
special change is needed to restart: the next time a packet is transmitted
after link comes up, that packet is sent.  Our change is not necessarily
done the way I'd do it for FreeBSD, but it minimizes changes.  Patch
available on request.

		Mike



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