Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 1 Jun 2009 19:16:57 +0000 (UTC)
From:      Andrew Gallatin <gallatin@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r193250 - head/sys/dev/mxge
Message-ID:  <200906011916.n51JGvB3088714@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: gallatin
Date: Mon Jun  1 19:16:57 2009
New Revision: 193250
URL: http://svn.freebsd.org/changeset/base/193250

Log:
  Set an rx jumbo cluster to the correct size before
  using bus_dmamap_load_mbuf_sg() on it. This
  prevents data corruption when the mxge MTU is
  between 4076 and 8172 on machines with 4KB
  pages and MXGE_VIRT_JUMBOS is in use (which it
  isn't, in -current or -stable)

Modified:
  head/sys/dev/mxge/if_mxge.c
  head/sys/dev/mxge/if_mxge_var.h

Modified: head/sys/dev/mxge/if_mxge.c
==============================================================================
--- head/sys/dev/mxge/if_mxge.c	Mon Jun  1 19:16:31 2009	(r193249)
+++ head/sys/dev/mxge/if_mxge.c	Mon Jun  1 19:16:57 2009	(r193250)
@@ -2351,7 +2351,7 @@ mxge_get_buf_big(struct mxge_slice_state
 		err = ENOBUFS;
 		goto done;
 	}
-	m->m_len = rx->cl_size;
+	m->m_len = rx->mlen;
 	err = bus_dmamap_load_mbuf_sg(rx->dmat, map, m, 
 				      seg, &cnt, BUS_DMA_NOWAIT);
 	if (err != 0) {
@@ -3432,6 +3432,8 @@ mxge_slice_open(struct mxge_slice_state 
 	}
 	ss->rx_big.nbufs = nbufs;
 	ss->rx_big.cl_size = cl_size;
+	ss->rx_big.mlen = ss->sc->ifp->if_mtu + ETHER_HDR_LEN +
+		ETHER_VLAN_ENCAP_LEN + MXGEFW_PAD;
 	for (i = 0; i <= ss->rx_big.mask; i += ss->rx_big.nbufs) {
 		map = ss->rx_big.info[i].map;
 		err = mxge_get_buf_big(ss, map, i);

Modified: head/sys/dev/mxge/if_mxge_var.h
==============================================================================
--- head/sys/dev/mxge/if_mxge_var.h	Mon Jun  1 19:16:31 2009	(r193249)
+++ head/sys/dev/mxge/if_mxge_var.h	Mon Jun  1 19:16:57 2009	(r193250)
@@ -120,6 +120,7 @@ typedef struct
 	int cl_size;
 	int alloc_fail;
 	int mask;			/* number of rx slots -1 */
+	int mlen;
 } mxge_rx_ring_t;
 
 typedef struct



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