Author: bryanv
Date: Sun Jun 29 00:50:56 2014
New Revision: 268011
URL: http://svnweb.freebsd.org/changeset/base/268011

Log:
  MFC r267661, r267662, r267663:
  
    - Remove an unnecessary kick of the host at the end of transmitting
    - Handle multiple calls to rxq_eof for single packet completion
    - Increment the pending packets more aggressively for TSO

Modified:
  stable/10/sys/dev/vmware/vmxnet3/if_vmx.c
  stable/10/sys/dev/vmware/vmxnet3/if_vmxvar.h
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/dev/vmware/vmxnet3/if_vmx.c
==============================================================================
--- stable/10/sys/dev/vmware/vmxnet3/if_vmx.c   Sun Jun 29 00:37:59 2014        
(r268010)
+++ stable/10/sys/dev/vmware/vmxnet3/if_vmx.c   Sun Jun 29 00:50:56 2014        
(r268011)
@@ -166,7 +166,6 @@ static int  vmxnet3_txq_load_mbuf(struct 
                    bus_dmamap_t, bus_dma_segment_t [], int *);
 static void    vmxnet3_txq_unload_mbuf(struct vmxnet3_txqueue *, bus_dmamap_t);
 static int     vmxnet3_txq_encap(struct vmxnet3_txqueue *, struct mbuf **);
-static void    vmxnet3_txq_update_pending(struct vmxnet3_txqueue *);
 #ifdef VMXNET3_LEGACY_TX
 static void    vmxnet3_start_locked(struct ifnet *);
 static void    vmxnet3_start(struct ifnet *);
@@ -2086,17 +2085,25 @@ vmxnet3_rxq_eof(struct vmxnet3_rxqueue *
        sc = rxq->vxrxq_sc;
        ifp = sc->vmx_ifp;
        rxc = &rxq->vxrxq_comp_ring;
-       m_head = m_tail = NULL;
 
        VMXNET3_RXQ_LOCK_ASSERT(rxq);
 
        if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
                return;
 
+       m_head = rxq->vxrxq_mhead;
+       rxq->vxrxq_mhead = NULL;
+       m_tail = rxq->vxrxq_mtail;
+       rxq->vxrxq_mtail = NULL;
+       MPASS(m_head == NULL || m_tail != NULL);
+
        for (;;) {
                rxcd = &rxc->vxcr_u.rxcd[rxc->vxcr_next];
-               if (rxcd->gen != rxc->vxcr_gen)
+               if (rxcd->gen != rxc->vxcr_gen) {
+                       rxq->vxrxq_mhead = m_head;
+                       rxq->vxrxq_mtail = m_tail;
                        break;
+               }
                vmxnet3_barrier(sc, VMXNET3_BARRIER_RD);
 
                if (++rxc->vxcr_next == rxc->vxcr_ndesc) {
@@ -2328,6 +2335,12 @@ vmxnet3_rxstop(struct vmxnet3_softc *sc,
        struct vmxnet3_rxbuf *rxb;
        int i, j;
 
+       if (rxq->vxrxq_mhead != NULL) {
+               m_freem(rxq->vxrxq_mhead);
+               rxq->vxrxq_mhead = NULL;
+               rxq->vxrxq_mtail = NULL;
+       }
+
        for (i = 0; i < VMXNET3_RXRINGS_PERQ; i++) {
                rxr = &rxq->vxrxq_cmd_ring[i];
 
@@ -2839,7 +2852,8 @@ vmxnet3_txq_encap(struct vmxnet3_txqueue
        vmxnet3_barrier(sc, VMXNET3_BARRIER_WR);
        sop->gen ^= 1;
 
-       if (++txq->vxtxq_ts->npending >= txq->vxtxq_ts->intr_threshold) {
+       txq->vxtxq_ts->npending += nsegs;
+       if (txq->vxtxq_ts->npending >= txq->vxtxq_ts->intr_threshold) {
                txq->vxtxq_ts->npending = 0;
                vmxnet3_write_bar0(sc, VMXNET3_BAR0_TXH(txq->vxtxq_id),
                    txr->vxtxr_head);
@@ -2848,20 +2862,6 @@ vmxnet3_txq_encap(struct vmxnet3_txqueue
        return (0);
 }
 
-static void
-vmxnet3_txq_update_pending(struct vmxnet3_txqueue *txq)
-{
-       struct vmxnet3_txring *txr;
-
-       txr = &txq->vxtxq_cmd_ring;
-
-       if (txq->vxtxq_ts->npending > 0) {
-               txq->vxtxq_ts->npending = 0;
-               vmxnet3_write_bar0(txq->vxtxq_sc,
-                   VMXNET3_BAR0_TXH(txq->vxtxq_id), txr->vxtxr_head);
-       }
-}
-
 #ifdef VMXNET3_LEGACY_TX
 
 static void
@@ -2908,10 +2908,8 @@ vmxnet3_start_locked(struct ifnet *ifp)
                ETHER_BPF_MTAP(ifp, m_head);
        }
 
-       if (tx > 0) {
-               vmxnet3_txq_update_pending(txq);
+       if (tx > 0)
                txq->vxtxq_watchdog = VMXNET3_WATCHDOG_TIMEOUT;
-       }
 }
 
 static void
@@ -2972,8 +2970,7 @@ vmxnet3_txq_mq_start_locked(struct vmxne
                        break;
                }
 
-               error = vmxnet3_txq_encap(txq, &m);
-               if (error) {
+               if (vmxnet3_txq_encap(txq, &m) != 0) {
                        if (m != NULL)
                                drbr_putback(ifp, br, m);
                        else
@@ -2986,10 +2983,8 @@ vmxnet3_txq_mq_start_locked(struct vmxne
                ETHER_BPF_MTAP(ifp, m);
        }
 
-       if (tx > 0) {
-               vmxnet3_txq_update_pending(txq);
+       if (tx > 0)
                txq->vxtxq_watchdog = VMXNET3_WATCHDOG_TIMEOUT;
-       }
 
        return (0);
 }

Modified: stable/10/sys/dev/vmware/vmxnet3/if_vmxvar.h
==============================================================================
--- stable/10/sys/dev/vmware/vmxnet3/if_vmxvar.h        Sun Jun 29 00:37:59 
2014        (r268010)
+++ stable/10/sys/dev/vmware/vmxnet3/if_vmxvar.h        Sun Jun 29 00:50:56 
2014        (r268011)
@@ -168,6 +168,8 @@ struct vmxnet3_rxqueue {
        struct vmxnet3_softc            *vxrxq_sc;
        int                              vxrxq_id;
        int                              vxrxq_intr_idx;
+       struct mbuf                     *vxrxq_mhead;
+       struct mbuf                     *vxrxq_mtail;
        struct vmxnet3_rxring            vxrxq_cmd_ring[VMXNET3_RXRINGS_PERQ];
        struct vmxnet3_comp_ring         vxrxq_comp_ring;
        struct vmxnet3_rxq_stats         vxrxq_stats;
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to