svn commit: r254647 - projects/vmxnet/sys/dev/vmware/vmxnet3

Bryan Venteicher bryanv at FreeBSD.org
Thu Aug 22 06:52:00 UTC 2013


Author: bryanv
Date: Thu Aug 22 06:51:59 2013
New Revision: 254647
URL: http://svnweb.freebsd.org/changeset/base/254647

Log:
  Fix interrupt handling if auto mask is not enabled
  
  And add macros for compiling on older releases that were
  missed in a previous commit.

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

Modified: projects/vmxnet/sys/dev/vmware/vmxnet3/if_vmx.c
==============================================================================
--- projects/vmxnet/sys/dev/vmware/vmxnet3/if_vmx.c	Thu Aug 22 06:50:04 2013	(r254646)
+++ projects/vmxnet/sys/dev/vmware/vmxnet3/if_vmx.c	Thu Aug 22 06:51:59 2013	(r254647)
@@ -1307,7 +1307,7 @@ vmxnet3_init_shared_data(struct vmxnet3_
 	ds->nrxsg_max = sc->vmx_max_rxsegs;
 
 	/* Interrupt control. */
-	ds->automask = 1;	/* VMXNET3_IMM_AUTO */
+	ds->automask = sc->vmx_intr_mask_mode == VMXNET3_IMM_AUTO;
 	ds->nintr = sc->vmx_nintrs;
 	ds->evintr = sc->vmx_event_intr_idx;
 	ds->ictrl = VMXNET3_ICTRL_DISABLE_ALL;
@@ -1617,11 +1617,11 @@ vmxnet3_newbuf(struct vmxnet3_softc *sc,
 	} else {
 #if __FreeBSD_version < 902001
 		/*
-		 * These mbufs will never be used for the start of a
-		 * frame. However, roughly prior to branching releng/9.2,
-		 * bus_dmamap_load_mbuf_sg() required the mbuf to always be
-		 * a packet header. Avoid unnecessary mbuf initialization
-		 * in newer versions where that is not the case.
+		 * These mbufs will never be used for the start of a frame.
+		 * Roughly prior to branching releng/9.2, the load_mbuf_sg()
+		 * required the mbuf to always be a packet header. Avoid
+		 * unnecessary mbuf initialization in newer versions where
+		 * that is not the case.
 		 */
 		flags = M_PKTHDR;
 #else
@@ -1632,8 +1632,10 @@ vmxnet3_newbuf(struct vmxnet3_softc *sc,
 	}
 
 	m = m_getjcl(M_NOWAIT, MT_DATA, flags, clsize);
-	if (m == NULL)
+	if (m == NULL) {
+		sc->vmx_stats.vmst_getcl_failed++;
 		return (ENOBUFS);
+	}
 
 	if (btype == VMXNET3_BTYPE_HEAD) {
 		m->m_len = m->m_pkthdr.len = clsize;
@@ -1916,6 +1918,8 @@ vmxnet3_legacy_intr(void *xsc)
 		if (vmxnet3_read_bar1(sc, VMXNET3_BAR1_INTR) == 0)
 			return;
 	}
+	if (sc->vmx_intr_mask_mode == VMXNET3_IMM_ACTIVE)
+		vmxnet3_disable_all_intrs(sc);
 
 	if (sc->vmx_ds->event != 0)
 		vmxnet3_evintr(sc);
@@ -1930,7 +1934,7 @@ vmxnet3_legacy_intr(void *xsc)
 		vmxnet3_start_locked(ifp);
 	VMXNET3_TXQ_UNLOCK(txq);
 
-	vmxnet3_enable_intr(sc, 0);
+	vmxnet3_enable_all_intrs(sc);
 }
 
 static void
@@ -1944,6 +1948,9 @@ vmxnet3_txq_intr(void *xtxq)
 	sc = txq->vxtxq_sc;
 	ifp = sc->vmx_ifp;
 
+	if (sc->vmx_intr_mask_mode == VMXNET3_IMM_ACTIVE)
+		vmxnet3_disable_intr(sc, txq->vxtxq_intr_idx);
+
 	VMXNET3_TXQ_LOCK(txq);
 	vmxnet3_txq_eof(txq);
 	if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
@@ -1962,6 +1969,9 @@ vmxnet3_rxq_intr(void *xrxq)
 	rxq = xrxq;
 	sc = rxq->vxrxq_sc;
 
+	if (sc->vmx_intr_mask_mode == VMXNET3_IMM_ACTIVE)
+		vmxnet3_disable_intr(sc, rxq->vxrxq_intr_idx);
+
 	VMXNET3_RXQ_LOCK(rxq);
 	vmxnet3_rxq_eof(rxq);
 	VMXNET3_RXQ_UNLOCK(rxq);
@@ -1976,6 +1986,9 @@ vmxnet3_event_intr(void *xsc)
 
 	sc = xsc;
 
+	if (sc->vmx_intr_mask_mode == VMXNET3_IMM_ACTIVE)
+		vmxnet3_disable_intr(sc, sc->vmx_event_intr_idx);
+
 	if (sc->vmx_ds->event != 0)
 		vmxnet3_evintr(sc);
 
@@ -2102,7 +2115,7 @@ vmxnet3_rxinit(struct vmxnet3_softc *sc,
 	struct ifnet *ifp;
 	struct vmxnet3_rxring *rxr;
 	struct vmxnet3_comp_ring *rxc;
-	int i, npopulate, idx, frame_size, error;
+	int i, populate, idx, frame_size, error;
 
 	ifp = sc->vmx_ifp;
 	frame_size = ifp->if_mtu + sizeof(struct ether_vlan_header);
@@ -2117,7 +2130,7 @@ vmxnet3_rxinit(struct vmxnet3_softc *sc,
 	 * to make our life easier. We do not support changing the ring
 	 * size after the attach.
 	 */
-	if (frame_size <= MCLBYTES)
+	if (frame_size <= MCLBYTES - ETHER_ALIGN)
 		sc->vmx_rx_max_chain = 1;
 	else
 		sc->vmx_rx_max_chain = 2;
@@ -2129,11 +2142,11 @@ vmxnet3_rxinit(struct vmxnet3_softc *sc,
 	 */
 	if ((ifp->if_capenable & IFCAP_LRO) == 0 &&
 	    frame_size <= MCLBYTES + MJUMPAGESIZE)
-		npopulate = 1;
+		populate = 1;
 	else
-		npopulate = VMXNET3_RXRINGS_PERQ;
+		populate = VMXNET3_RXRINGS_PERQ;
 
-	for (i = 0; i < npopulate; i++) {
+	for (i = 0; i < populate; i++) {
 		rxr = &rxq->vxrxq_cmd_ring[i];
 		rxr->vxrxr_fill = 0;
 		rxr->vxrxr_gen = VMXNET3_INIT_GEN;
@@ -3103,6 +3116,8 @@ vmxnet3_setup_sysctl(struct vmxnet3_soft
 	stats = &sc->vmx_stats;
 	SYSCTL_ADD_UQUAD(ctx, child, OID_AUTO, "collapsed", CTLFLAG_RD,
 	    &stats->vmst_collapsed, "Tx mbuf chains collapsed");
+	SYSCTL_ADD_UQUAD(ctx, child, OID_AUTO, "getcl_failed", CTLFLAG_RD,
+	    &stats->vmst_getcl_failed, "Alloc of mbuf cluster failed");
 
 	vmxnet3_setup_queue_sysctl(sc, ctx, child);
 }

Modified: projects/vmxnet/sys/dev/vmware/vmxnet3/if_vmxvar.h
==============================================================================
--- projects/vmxnet/sys/dev/vmware/vmxnet3/if_vmxvar.h	Thu Aug 22 06:50:04 2013	(r254646)
+++ projects/vmxnet/sys/dev/vmware/vmxnet3/if_vmxvar.h	Thu Aug 22 06:51:59 2013	(r254647)
@@ -167,6 +167,7 @@ struct vmxnet3_rxqueue {
 
 struct vmxnet3_statistics {
 	uint64_t		vmst_collapsed;
+	uint64_t		vmst_getcl_failed;
 
 };
 
@@ -286,4 +287,28 @@ struct vmxnet3_softc {
 #define VMXNET3_CSUM_ALL_OFFLOAD	\
     (VMXNET3_CSUM_OFFLOAD | VMXNET3_CSUM_OFFLOAD_IPV6 | CSUM_TSO)
 
+/*
+ * Compat macros to keep this driver compiling on old releases.
+ */
+
+#if !defined(SYSCTL_ADD_UQUAD)
+#define SYSCTL_ADD_UQUAD SYSCTL_ADD_QUAD
+#endif
+
+#if !defined(IFCAP_TXCSUM_IPV6)
+#define IFCAP_TXCSUM_IPV6 0
+#endif
+
+#if !defined(IFCAP_RXCSUM_IPV6)
+#define IFCAP_RXCSUM_IPV6 0
+#endif
+
+#if !defined(CSUM_TCP_IPV6)
+#define CSUM_TCP_IPV6 0
+#endif
+
+#if !defined(CSUM_UDP_IPV6)
+#define CSUM_UDP_IPV6	0
+#endif
+
 #endif /* _IF_VMXVAR_H */


More information about the svn-src-projects mailing list