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); - } } }