im still looking at vlan performance problems, as discussed by mpi@
at http://www.grenadille.net/post/2017/02/13/What-happened-to-my-vlan.

recently it occurred to me that we're making an implicit assumption
that having the chip handle the injection of vlan tags has zero
cost, and that all the loss in performance is purely a software
problem. to test this assumption i knocked up the diff below to
disable hw vlan tagging in ix(4), which was used in the tests mpi
and hrvoje did.

hrvoje tested this diff for me and noted a 10% improvement in pps
when forwarding between vlan interfaces on ix(4). to quote hrvoje:

without diff
send - receive
vlan - vlan = 830Kpps

with diff
send - receive
vlan - vlan = 995Kpps

my conclusion is that assumption that nics are fast at offloads is
wrong. therefore id like to put this in. unfortunately 10% doesnt
account for the entire loss in forwarding over vlan, but it does
help a bit.

would anyone else like to test? or ok it?

dlg

Index: if_ix.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/if_ix.c,v
retrieving revision 1.152
diff -u -p -r1.152 if_ix.c
--- if_ix.c     22 Jun 2017 02:44:37 -0000      1.152
+++ if_ix.c     12 Dec 2017 23:39:41 -0000
@@ -154,8 +154,6 @@ void        ixgbe_set_ivar(struct ix_softc *, u
 void   ixgbe_configure_ivars(struct ix_softc *);
 uint8_t        *ixgbe_mc_array_itr(struct ixgbe_hw *, uint8_t **, uint32_t *);
 
-void   ixgbe_setup_vlan_hw_support(struct ix_softc *);
-
 /* Support for pluggable optic modules */
 void   ixgbe_setup_optics(struct ix_softc *);
 void   ixgbe_handle_mod(struct ix_softc *);
@@ -702,9 +700,6 @@ ixgbe_init(void *arg)
                IXGBE_WRITE_REG(&sc->hw, IXGBE_RDT(i), rxr->last_desc_filled);
        }
 
-       /* Set up VLAN support and filter */
-       ixgbe_setup_vlan_hw_support(sc);
-
        /* Enable Receive engine */
        rxctrl = IXGBE_READ_REG(&sc->hw, IXGBE_RXCTRL);
        if (sc->hw.mac.type == ixgbe_mac_82598EB)
@@ -1621,10 +1616,6 @@ ixgbe_setup_interface(struct ix_softc *s
 
        ifp->if_capabilities = IFCAP_VLAN_MTU;
 
-#if NVLAN > 0
-       ifp->if_capabilities |= IFCAP_VLAN_HWTAGGING;
-#endif
-
 #ifdef IX_CSUM_OFFLOAD
        ifp->if_capabilities |= IFCAP_CSUM_TCPv4 | IFCAP_CSUM_UDPv4;
 #endif
@@ -2922,12 +2913,6 @@ ixgbe_rxeof(struct ix_queue *que)
                        /* first desc of a non-ps chain */
                        sendmp = mp;
                        sendmp->m_pkthdr.len = mp->m_len;
-#if NVLAN > 0
-                       if (staterr & IXGBE_RXD_STAT_VP) {
-                               sendmp->m_pkthdr.ether_vtag = vtag;
-                               sendmp->m_flags |= M_VLANTAG;
-                       }
-#endif
                }
 
                /* Pass the head pointer on */
@@ -2989,44 +2974,6 @@ ixgbe_rx_checksum(uint32_t staterr, stru
                if (!(errors & IXGBE_RXD_ERR_TCPE))
                        mp->m_pkthdr.csum_flags |=
                                M_TCP_CSUM_IN_OK | M_UDP_CSUM_IN_OK;
-       }
-}
-
-void
-ixgbe_setup_vlan_hw_support(struct ix_softc *sc)
-{
-       uint32_t        ctrl;
-       int             i;
-
-       /*
-        * A soft reset zero's out the VFTA, so
-        * we need to repopulate it now.
-        */
-       for (i = 0; i < IXGBE_VFTA_SIZE; i++) {
-               if (sc->shadow_vfta[i] != 0)
-                       IXGBE_WRITE_REG(&sc->hw, IXGBE_VFTA(i),
-                           sc->shadow_vfta[i]);
-       }
-
-       ctrl = IXGBE_READ_REG(&sc->hw, IXGBE_VLNCTRL);
-#if 0
-       /* Enable the Filter Table if enabled */
-       if (ifp->if_capenable & IFCAP_VLAN_HWFILTER) {
-               ctrl &= ~IXGBE_VLNCTRL_CFIEN;
-               ctrl |= IXGBE_VLNCTRL_VFE;
-       }
-#endif
-       if (sc->hw.mac.type == ixgbe_mac_82598EB)
-               ctrl |= IXGBE_VLNCTRL_VME;
-       IXGBE_WRITE_REG(&sc->hw, IXGBE_VLNCTRL, ctrl);
-
-       /* On 82599 the VLAN enable is per/queue in RXDCTL */
-       if (sc->hw.mac.type != ixgbe_mac_82598EB) {
-               for (i = 0; i < sc->num_queues; i++) {
-                       ctrl = IXGBE_READ_REG(&sc->hw, IXGBE_RXDCTL(i));
-                       ctrl |= IXGBE_RXDCTL_VME;
-                       IXGBE_WRITE_REG(&sc->hw, IXGBE_RXDCTL(i), ctrl);
-               }
        }
 }
 

Reply via email to