Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 30 Dec 2011 13:46:03 -0800
From:      YongHyeon PYUN <pyunyh@gmail.com>
To:        Mike Andrews <mandrews@bit0.com>
Cc:        freebsd-stable@freebsd.org
Subject:   Re: 9.0-RC2 re(4) "no memory for jumbo buffers" issue
Message-ID:  <20111230214603.GC14244@michelle.cdnetworks.com>
In-Reply-To: <4EFD353D.1060900@bit0.com>
References:  <4ED154B6.2030304@bit0.com> <20111128013931.GC1830@michelle.cdnetworks.com> <4ED40D58.1030107@bit0.com> <20111128234212.GC1655@michelle.cdnetworks.com> <4EFD353D.1060900@bit0.com>

next in thread | previous in thread | raw e-mail | index | archive | help

--BOKacYhQ+x31HxR3
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

On Thu, Dec 29, 2011 at 10:51:25PM -0500, Mike Andrews wrote:
> On 11/28/2011 6:42 PM, YongHyeon PYUN wrote:
> >On Mon, Nov 28, 2011 at 05:38:16PM -0500, Mike Andrews wrote:
> >>On 11/27/11 8:39 PM, YongHyeon PYUN wrote:
> >>>On Sat, Nov 26, 2011 at 04:05:58PM -0500, Mike Andrews wrote:
> >>>>I have a Supermicro 5015A-H (Intel Atom 330) server with two Realtek
> >>>>RTL8111C-GR gigabit NICs on it.  As far as I can tell, these support
> >>>>jumbo frames up to 7422 bytes.  When running them at an MTU of 5000 on
> >>>Actually the maximum size is 6KB for RTL8111C, not 7422.
> >>>RTL8111C and newer PCIe based gigabit controllers no longer support
> >>>scattering a jumbo frame into multiple RX buffers so a single RX
> >>>buffer has to receive an entire jumbo frame.  This adds more burden
> >>>to system because it has to allocate a jumbo frame even when it
> >>>receives a pure TCP ACK.
> >>OK, that makes sense.
> >>
> >>>>FreeBSD 9.0-RC2, after a week or so of update, with fairly light network
> >>>>activity, the interfaces die with "no memory for jumbo buffers" errors
> >>>>on the console.  Unloading and reloading the driver (via serial console)
> >>>>doesn't help; only rebooting seems to clear it up.
> >>>>
> >>>The jumbo code path is the same as normal MTU sized one so I think
> >>>possibility of leaking mbufs in driver is very low.  And the
> >>>message "no memory for jumbo RX buffers" can only happen either
> >>>when you up the interface again or interface restart triggered by
> >>>watchdog timeout handler.  I don't think you're seeing watchdog
> >>>timeouts though.
> >>I'm fairly certain the interface isn't changing state when this happens
> >>-- it just kinda spontaneously happens after a week or two, with no
> >>interface up/down transitions.  I don't see any watchdog messages when
> >>this happens.
> >There is another code path that causes controller reinitialization.
> >If you change MTU or offloading configuration(TSO, VLAN tagging,
> >checksum offloading etc) it will reinitialize the controller. So do
> >you happen to trigger one of these code path during a week or two?
> >
> >>>When you see "no memory for jumbo RX buffers" message, did you
> >>>check available mbuf pool?
> >>Not yet, that's why I asked for debugging tips -- I'll do that the next
> >>time this happens.
> >>
> >>>>What's the best way to go about debugging this...  which sysctl's should
> >>>>I be looking at first?  I have already tried raising kern.ipc.nmbjumbo9
> >>>>to 16384 and it doesn't seem to help things... maybe prolonging it
> >>>>slightly, but not by much.  The problem is it takes a week or so to
> >>>>reproduce the problem each time...
> >>>>
> >>>I vaguely guess it could be related with other subsystem which
> >>>leaks mbufs such that driver was not able to get more jumbo RX
> >>>buffers from system.  For instance, r228016 would be worth to try on
> >>>your box.  I can't clearly explain why em(4) does not suffer from
> >>>the issue though.
> >>I've just this morning built a kernel with that fix, so we'll see how
> >>that goes.
> >Ok.
> 
> OK, this just happened again with a 9.0-RC3 kernel rev  r228247.
> 
> 
> whitedog# ifconfig re0 down;ifconfig re0 up;ifconfig re1 down;ifconfig 


Ah, sorry. I should have spotted this issue earlier.
Try attached patch and let me know whether it makes any difference.

> re1 up
> re0: no memory for jumbo RX buffers
> re1: no memory for jumbo RX buffers
> whitedog# netstat -m
> 526/1829/2355 mbufs in use (current/cache/total)
> 0/1278/1278/25600 mbuf clusters in use (current/cache/total/max)
> 0/356 mbuf+clusters out of packet secondary zone in use (current/cache)
> 0/336/336/12800 4k (page size) jumbo clusters in use 
> (current/cache/total/max)
> 512/385/897/6400 9k jumbo clusters in use (current/cache/total/max)
> 0/0/0/3200 16k jumbo clusters in use (current/cache/total/max)
> 4739K/7822K/12561K bytes allocated to network (current/cache/total)
> 0/0/0 requests for mbufs denied (mbufs/clusters/mbuf+clusters)
> 0/4560/0 requests for jumbo clusters denied (4k/9k/16k)
> 0/0/0 sfbufs in use (current/peak/max)
> 0 requests for sfbufs denied
> 0 requests for sfbufs delayed
> 0 requests for I/O initiated by sendfile
> 0 calls to protocol drain routines

--BOKacYhQ+x31HxR3
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment; filename="re.jumbobuf.diff"

Index: sys/dev/re/if_re.c
===================================================================
--- sys/dev/re/if_re.c	(revision 229006)
+++ sys/dev/re/if_re.c	(working copy)
@@ -3558,7 +3558,6 @@
 	}
 
 	/* Free the TX list buffers. */
-
 	for (i = 0; i < sc->rl_ldata.rl_tx_desc_cnt; i++) {
 		txd = &sc->rl_ldata.rl_tx_desc[i];
 		if (txd->tx_m != NULL) {
@@ -3572,11 +3571,10 @@
 	}
 
 	/* Free the RX list buffers. */
-
 	for (i = 0; i < sc->rl_ldata.rl_rx_desc_cnt; i++) {
 		rxd = &sc->rl_ldata.rl_rx_desc[i];
 		if (rxd->rx_m != NULL) {
-			bus_dmamap_sync(sc->rl_ldata.rl_tx_mtag,
+			bus_dmamap_sync(sc->rl_ldata.rl_rx_mtag,
 			    rxd->rx_dmamap, BUS_DMASYNC_POSTREAD);
 			bus_dmamap_unload(sc->rl_ldata.rl_rx_mtag,
 			    rxd->rx_dmamap);
@@ -3584,6 +3582,20 @@
 			rxd->rx_m = NULL;
 		}
 	}
+
+	if ((sc->rl_flags & RL_FLAG_JUMBOV2) != 0) {
+		for (i = 0; i < sc->rl_ldata.rl_rx_desc_cnt; i++) {
+			rxd = &sc->rl_ldata.rl_jrx_desc[i];
+			if (rxd->rx_m != NULL) {
+				bus_dmamap_sync(sc->rl_ldata.rl_jrx_mtag,
+				    rxd->rx_dmamap, BUS_DMASYNC_POSTREAD);
+				bus_dmamap_unload(sc->rl_ldata.rl_jrx_mtag,
+				    rxd->rx_dmamap);
+				m_freem(rxd->rx_m);
+				rxd->rx_m = NULL;
+			}
+		}
+	}
 }
 
 /*

--BOKacYhQ+x31HxR3--



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