Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 18 Aug 2013 04:22:13 +0000 (UTC)
From:      Bryan Venteicher <bryanv@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r254475 - projects/vmxnet/sys/dev/vmware/vmxnet3
Message-ID:  <201308180422.r7I4MDvm067821@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: bryanv
Date: Sun Aug 18 04:22:13 2013
New Revision: 254475
URL: http://svnweb.freebsd.org/changeset/base/254475

Log:
  Do not populate the second Rx ring unless the configuration makes
  sense (LRO is enabled or a large MTU).

Modified:
  projects/vmxnet/sys/dev/vmware/vmxnet3/if_vmx.c

Modified: projects/vmxnet/sys/dev/vmware/vmxnet3/if_vmx.c
==============================================================================
--- projects/vmxnet/sys/dev/vmware/vmxnet3/if_vmx.c	Sun Aug 18 01:29:57 2013	(r254474)
+++ projects/vmxnet/sys/dev/vmware/vmxnet3/if_vmx.c	Sun Aug 18 04:22:13 2013	(r254475)
@@ -1649,6 +1649,10 @@ vmxnet3_newbuf(struct vmxnet3_softc *sc,
 	}
 	KASSERT(nsegs == 1,
 	    ("%s: mbuf %p with too many segments %d", __func__, m, nsegs));
+#if __FreeBSD_version < 902001
+	if (btype == VMXNET3_BTYPE_BODY)
+		m->m_flags &= ~M_PKTHDR;
+#endif
 
 	if (rxb->vrxb_m != NULL) {
 		bus_dmamap_sync(tag, rxb->vrxb_dmamap, BUS_DMASYNC_POSTREAD);
@@ -2098,7 +2102,7 @@ vmxnet3_rxinit(struct vmxnet3_softc *sc,
 	struct ifnet *ifp;
 	struct vmxnet3_rxring *rxr;
 	struct vmxnet3_comp_ring *rxc;
-	int i, idx, frame_size, error;
+	int i, npopulate, idx, frame_size, error;
 
 	ifp = sc->vmx_ifp;
 	frame_size = ifp->if_mtu + sizeof(struct ether_vlan_header);
@@ -2106,22 +2110,30 @@ vmxnet3_rxinit(struct vmxnet3_softc *sc,
 	/*
 	 * If the MTU causes us to exceed what a regular sized cluster
 	 * can handle, we allocate a second MJUMPAGESIZE cluster after
-	 * it in ring 0. Ring 1 always contains MJUMPAGESIZE clusters.
+	 * it in ring 0. If in use, ring 1 always contains MJUMPAGESIZE
+	 * clusters.
 	 *
 	 * Keep rx_max_chain a divisor of the maximum Rx ring size to
 	 * to make our life easier. We do not support changing the ring
 	 * size after the attach.
-	 *
-	 * TODO If LRO is not enabled, there is little point of even
-	 * populating the second ring.
-	 *
 	 */
 	if (frame_size <= MCLBYTES)
 		sc->vmx_rx_max_chain = 1;
 	else
 		sc->vmx_rx_max_chain = 2;
 
-	for (i = 0; i < VMXNET3_RXRINGS_PERQ; i++) {
+	/*
+	 * Only populate ring 1 if the configuration will take advantage
+	 * of it. That is either when LRO is enabled or the frame size
+	 * exceeds what ring 0 can contain.
+	 */
+	if ((ifp->if_capenable & IFCAP_LRO) == 0 &&
+	    frame_size <= MCLBYTES + MJUMPAGESIZE)
+		npopulate = 1;
+	else
+		npopulate = VMXNET3_RXRINGS_PERQ;
+
+	for (i = 0; i < npopulate; i++) {
 		rxr = &rxq->vxrxq_cmd_ring[i];
 		rxr->vxrxr_fill = 0;
 		rxr->vxrxr_gen = VMXNET3_INIT_GEN;
@@ -2135,11 +2147,19 @@ vmxnet3_rxinit(struct vmxnet3_softc *sc,
 		}
 	}
 
+	for (/**/; i < VMXNET3_RXRINGS_PERQ; i++) {
+		rxr = &rxq->vxrxq_cmd_ring[i];
+		rxr->vxrxr_fill = 0;
+		rxr->vxrxr_gen = 0;
+		bzero(rxr->vxrxr_rxd,
+		    rxr->vxrxr_ndesc * sizeof(struct vmxnet3_rxdesc));
+	}
+
 	rxc = &rxq->vxrxq_comp_ring;
 	rxc->vxcr_next = 0;
 	rxc->vxcr_gen = VMXNET3_INIT_GEN;
 	bzero(rxc->vxcr_u.rxcd,
-	     rxc->vxcr_ndesc * sizeof(struct vmxnet3_rxcompdesc));
+	    rxc->vxcr_ndesc * sizeof(struct vmxnet3_rxcompdesc));
 
 	return (0);
 }
@@ -3023,7 +3043,6 @@ vmxnet3_setup_debug_sysctl(struct vmxnet
 		    "debug", CTLFLAG_RD, NULL, "");
 		list = SYSCTL_CHILDREN(node);
 
-		/* Assumes VMXNET3_RXRINGS_PERQ == 2. */
 		SYSCTL_ADD_UINT(ctx, list, OID_AUTO, "cmd0_fill", CTLFLAG_RD,
 		    &rxq->vxrxq_cmd_ring[0].vxrxr_fill, 0, "");
 		SYSCTL_ADD_UINT(ctx, list, OID_AUTO, "cmd0_ndesc", CTLFLAG_RD,



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